Ликбез по Linux

Компилируем ядро

Хотя в большинстве дистрибутивов ядро уже заранее собрано и настроено, иногда возникает необходимость его перекомпиляции. К тому же это полезно для понимания принципов работы linux. Кроме того, можно добавлять какие-нибудь патчи либо поддержку оборудования, которую разработчики не включили.


Немного теории

Ядра ОС бывают двух видов: монолитное и модульное. Монолитное ядро - это просто один файл, который грузится при старте системы и сидит в оперативке до выключения компьютера. Те возможности, которые заложены в этом файле, не подлежат изменению. Если включить все возможности в ядро, получаем очень большое и очень медленное ядро. Если сделать маленькое и быстрое ядро, то придётся пожертвовать возможностями. К тому же для цельного ядра нельзя было бы установить дополнительные компоненты (например, драйвер для видеокарт nVidia). Модульное же ядро состоит из многих очень простых модулей, которые взаимодействуют между собой. Главным недостатком такого подхода является сложность того самого взаимодействия, которая очень сильно возрастает при увеличении числа модулей, что влияет на скорость и надёжность. Поэтому первоначально ядро Linux было монолитным. Но потом при увеличении количества оборудования стало понятно, что нужно искать другой подход. Решением стал промежуточный вариант, при котором часть функционала можно включать непосредствено в ядро (то, что точно будет использоваться), а часть (ту, которая может пригодиться) - в виде модулей, которые можно подгружать динамически. Кстати, посмотреть загруженные модули можно при помощи команды lsmod.

Итак, начинаем.

 

Самое свежее ядро можно скачать с www.kernel.org. Для Debian можно воспользоваться командой

# apt-get install linux-source

Кстати, если у вас уже есть какое-либо ядро, то не нужно выкачивать его заново. Достаточно просто скачать патчи. Затем их нужно установить. Кстати, патчи не обязательно должны быть официальными, существуют различные версии, например, добавляющие поддержку какого-нибудь экзотического оборудования.

Итак, распаковываем ядро куда-нибудь, например, в ~/mykernel. Затем копируем туда патчи и распаковываем их. Если у них расширение tar.bz2, то извлечение из архива делается следующей командой:

$ tar xzf имя заплатки

Теперь ставим их. Для этого существует команда patch:

$ patch -p1 -i имя заплатки

Если всё нормально, то должны появиться надписи вида:

patching file имя

или

Hunk #1 succeeded где

Если же появляется надпись fail, то заплатка не подходит и нужно искать другую версию.

Теперь откроем Makefile и значение EXTRAVERSION заполняем так, как нам это нужно.

EXTRAVERSION = mykern

После этого можно приступать к компиляции.

Сначала необходимо очистить от файлов, созданных во время предыдущей сборки. Для этого нужно выполнить:

$ make mrproper

Приступаем к крайне важному этапу - настройке. Это делается при помощи одной из следующих команд:

make xconfig - графическая настройка на Qt - самый удобный способ

make gconfig - графическая настройка на Gtk

make menuconfig - текстовые меню

make config - отвечаем на различные вопросы

make oldconfig - компилируем на основе имеющегося файла настроек

Мне для использования первого способа потребовалось установить пакет для сборки Qt3-приложений:

# apt-get install qt3-dev-tools

Теперь выбираем то, что нам нужно. Если будем использовать что-либо наверняка, то компилируем как часть ядра, если пригодится, то оставляем модулем. Если же это не нужно, то оставляем неотмеченным. Кроме того, большинство параметров очень подробно прокомментировано, так что проблем возникнуть не должно. Правда, стоит знать, что даже если у вас нету сети, то всё равно не стоит полностью её игнорировать, ведь, например, без поддержки Unix sockets у вас даже сервер X-Window не запустится. Ещё нет смысла использовать поддержку ntfs-разделов. Для корректной работы существует сторонняя программа, обеспечивающая чтение и запись на ntfs. Она называется ntfs-3g.

Также стоит подключить SMB FS (или CIFS, которая предпочтительнее), если нужен доступ к windows-сетям.

После всего этого жмём кнопку "Сохранить" и приступаем к компиляции.

$ make bzImage modules

Затем

# make modules_install install

В результате ядро будет скопировано в папку /boot, а модули - в /lib/modules/имя ядра.

Также может возникнуть необходимость в создании собственного образа initrd. Хотя, если вы компилировали части, отвечающие за ваше оборудование (и используемые файловые системы) в виде части ядра, а не модуля, то можно обойтись и без него. Но если нужно добавить какие-нибудь модули в initrd, то нужно указать их имена в файле /etc/initramfs-tools/modules. Помните, что там нужно указывать только самое необходимое, без чего невозможно загрузить ядро. Далее выполняем:

# mkinitramfs -k -o /boot/initrd-my

В результате у нас получился наш образ initramfs.

Теперь редактируем меню GRUB для загрузки ядра. Добавляем в /boot/grub/menu.lst строки

title My kernel

#указать раздел, где установлен GRUB

root (hd0,5)

#наше ядро

kernel /vmlinuz-2.6.26-1-686mykern root=/dev/sda7 ro noapic vga=792

# наш initrd

initrd /initrd-my

Сохраняемся и перезагружаемся. Теперь можно выбрать то, что получилось, и, если система загрузится, то можно работать, иначе клавиатура замигает при kernel panic и придётся загружаться с предыдущего ядра. Скорее всего, после нескольких попыток всё будет нормально, и вы получите сконфигурированное именно под вас ядро.

На сим пора откланяться. До будущих встреч.

Антон ЛИПАРИН,
oni@mail.by,
oni-ddr.livejournal.com

Версия для печатиВерсия для печати

Номер: 

50 за 2008 год

Рубрика: 

Software
Заметили ошибку? Выделите ее мышкой и нажмите Ctrl+Enter!