Построение специального ядра

Если Вы используете Linux с необычной аппаратурой, нуждаетесь в возможностях, которых нет в стандартных ядрах системы или хотите уменьшить память, отдаваемую ядром тем возможностям, которыми Вы все равно не пользуетесь, создайте специально настроенное ядро.

Обновление ядра включает конфигурирование желательных модулей, компиляцию ядра и модулей, и в заключение установку образа ядра. Это сопровождается перезагрузкой системы, чтобы загрузить новое ядро. Все это описано в файле ``README'', поставляемом с каждым пакетом ядра. Дальнейшая информация может быть найдена в подкаталоге ``Documentation/''. Особенно полезный файл там `` Configure.help'', который содержит детализированную информацию относительно доступного ядра, параметров компиляции и модулей.

Далее приводится пример построения заказного ядра версии 2.0.36 для платформы Intel. При формировании заказного ядра обычно происходит только конфигурирование, компиляция и установка, но иногда (обычно в случае новых аппаратных средств) необходимо загрузить дополнительное программное обеспечение (драйвер), если аппаратные средства еще не поддерживаются версией ядра, которую Вы компилируете.

Первый шаг в формирование заказного ядра: скачать и поставить исходный текст ядра из RPM (рекмендуется) или из tarball. См. в разделе Обновление ядра Linux подробности о том, какие файлы нужны и где их взять.

Теперь утилитой ``rpm'' (или ``tar'') поставьте дерево исходников ядра и файлы заголовков. Например, для установки ядра 2.0.36-3 из RPM:

rpm -Uvh kernel-source-2.0.36-3.i386.rpm kernel-headers-2.0.36-3.i386.rpm rpm -Uvh kernel-ibcs-2.0.36-3.i386.rpm

(Если Linux используется на notebook, Вам также нужен файл ``kernel-pcmcia-cs-2.0.36-3.i386.rpm '', который поддерживает функции управления питанием.)

После установки файлов ядра, Вы должны быть способны найти новое дерево исходников в каталоге `` /usr/src/linux/''.

Следующий шаг: надо скачать все дополнительные файлы драйверов (если они нужны) и установить их в новое ядерное исходное дерево. Например, чтобы добавить поддержку для Mylex DAC960 (аппаратный контроллер RAID) я загрузил драйвер с сайта http://www.dandelion.com. К сожалению, такое программное обеспечение предлагается обычно только как tarballs, так что ставьте с использованием утилиты ``tar''. Например:

cd /usr/src/ tar zxvpf DAC960-2.0.0-Beta4.tar.gz

Вы должны прочитать документацию, поставляемую с драйвером. Например, драйвер DAC960 включает файл `` README'', который поясняет как разместить скачанные файлы и применить патч ядра:

mv README.DAC960 DAC960.[ch] /usr/src/linux/drivers/block patch -p0 < DAC960.patch

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

mail:/usr/src# cd /usr/include mail:/usr/include# rm -rf asm linux scsi mail:/usr/include# ln -s /usr/src/linux/include/asm-i386 asm mail:/usr/include# ln -s /usr/src/linux/include/linux linux mail:/usr/include# ln -s /usr/src/linux/include/scsi scsi
Note

Замечание: данный шаг больше не нужен для ядер версии 2.2.x или выше.

Следующий шаг: сконфигурировать ваши параметры настройки ядра. Это наиболее важный шаг в формировании заказного ядра. Если по ошибке выключите нужную возможность, узнаете про это гораздо позже... Однако, если Вы включите лишние возможности, то зря потратите память в системе (замечание переводчика: что обычно и происходит в неоптимальных стандартных ядрах).

Надо разобраться в том, что Вам нужно в системе, какие возможности должны поддерживаться, какое оборудование имеется. После нескольких попыток настройки ядра, процесс станет очень понятным и знакомым. Это в первый раз трудно, потом привыкнете!

Наберите следующее для запуска процесса настройки:

mail:/usr/include# cd /usr/src/linux mail:/usr/src/linux# make mrproper mail:/usr/src/linux# make menuconfig

(Вы можете ввести ``make xconfig'' вместо ``make menuconfig'' при работе в X Window System; см. главу 5 для подробностей о работе в X.)

Чтобы конфигурировать ваше ядро, пройдите различные параметры настройки, разрешите те, которые нужны, и снимите выделение (отключите) с тех, которые не нужны. Вы можете выбирать между наличием поддержки некоторого свойства, встроенной в ядро, и наличием ее как модуля, который загружается и выгружается ядром когда необходимо. (Если Вы компилируете свойство, которое фактически необходимо, чтобы загружать систему, типа SCSI драйвера, как модуль, Вы будете должны создать образ RAMDISK, или система не будет загружаться. Это делается командой ``mkinitrd''; эта процедура описана немного позже.)

При прохождении параметров настройки конфигурации, Вы можете выбрать <Help> для описания того, зачем нужна данная опция ядра.

После того, как Вы сконфигурировали ваши ядерные параметры настройки, введите следующие команды, чтобы откомпилировать ядро:

mail:/usr/src/linux# make dep ; make clean mail:/usr/src/linux# make bzImage mail:/usr/src/linux# make modules

Если Вы перекомпилируете то же самое ядро, какое Вы имели (2.0.36-3 в данном примере), стоит переместить существующие модули в какой-нибудь резервный каталог командой:

mail:/usr/src/linux# mv /lib/modules/2.0.36-3 /lib/modules/2.0.36-3-backup

Теперь установите новые модули:

mail:/usr/src/linux# make modules_install

Теперь скопируйте ядро в каталог ``/boot/'' и используйте LILO для обновления boot record, чтобы новое ядро распознавалось. Следующие команды изготовят резервную копию существующего ядра, скопируют новое ядро и затем обновят LILO boot record:

mail:/usr/src/linux# cd /boot mail:/boot# cp vmlinuz vmlinuz.OLD mail:/boot# cp /usr/src/linux/arch/i386/boot/bzImage vmlinuz-2.0.36 mail:/boot# /sbin/lilo

Наконец, подправьте файл ``/etc/lilo.conf'', и создайте ссылку “image” на новое ядро. Вы должны также добавить раздел, который указывает на ваше резервное ядро, названное, возможно, “OldLinux”. Пример файла:

boot=/dev/hda map=/boot/map install=/boot/boot.b prompt timeout=50 image=/boot/vmlinuz label=Linux root=/dev/hdb1 read-only image=/boot/vmlinuz.OLD label=OldLinux read-only

Таким образом, Вы обеспечите себе путь для отступления: если Ваше новое ядро не грузится, (устройство не распознано или daemon не запускается, хотя и должен бы), Вы можете просто ввести ``OldLinux'' чтобы загрузиться со старым ядром и исследовать проблему.

Note

Замечание: Как упомянуто выше, если Вы откомпилировали требуемое для загрузки системы свойство как модуль, Вы должны создать загрузочный образ RAMDISK, чтобы загрузить вашу систему. (Не забудьте откомпилировать Ваше ядро с поддержкой для такого образа начальной загрузки.)

Процедура для создания и использования загрузочного образа RAMDISK:

Вот и все, теперь перезагрузитесь с новым ядром!

mail:/boot# /sbin/shutdown -r now

Если ядро отказывается загружаться, не паникуйте. Загрузитесь с дискеты начальной загрузки, которая была создана в течение установки Linux. Если Вы не имеете копии этих дисков, Вы должны быть способны создать ее с Red Hat CD. Вставьте дискету в дисковод, загрузитесь с нее и на приглашение “boot :” введите:

mount root=/dev/hda1

Данная команда предполагает, что корневой раздел (“/” или root) находится на /dev/hda1.

Linux должен нормально загрузиться с дискеты. Конечно, данное ядро не поддерживает специфических возможностей, так что часть аппаратуры, возможно, не будет работать, но того, что есть хватит для устранения неполадки. Восстановите старое ядро, переустановите LILO (то есть, ``mv /vmlinuz.old /vmlinuz ; /sbin/lilo'') и перезагрузитесь. Теперь можно попробовать перекомпилировать ядро с другими опциями и повторить попытку. Замечание переводчика: если Вы предусмотрели в настройке LILO запись для старого ядра, наберите ``OldLinux'' при загрузке с жесткого диска, чтобы загрузиться со старым ядром и исследовать проблему. Здесь дискеты не понадобятся. Непонятно почему автор предусмотрел упоминание про эту возможность выше, а здесь стал описывать загрузку с дискеты, будто нет возможности загрузить старое ядро. Забыл, что ли?