Установка нового ядра

В статье я попытаюсь описать процесс установки нового ядра в систему так, как это делаю я. Описанный способ не претендует на исключительность.


Сборка ядра


Первое, что необходимо сделать - скачать исходные коды ядра. Их можно взять с http://www.kernel.org/ Для тех, у кого установлен дистрибутив с оригинальным ядром (например Slackware) достаточно будет только выкачать патчи, обновляющие ядро до новой версии. Тем же, у кого ядро только от дистрибутива рекомендуется выкачивать тарбол с исходными кодами в полном объеме, так как наложение патчей на дистрибутивные ядра не всегда приводит к ожидаемому результату.



Нумерация версий ядра следующая: номер состоит из трех чисел - MAJOR_VER.MINOR_VER.SUB_VER




Первые два MAJOR_VER и MINOR_VER определяют ветку ядра, SUB_VER - это номер релиза в ветке. Следует помнить, что для стабильных веток MINOR_VER - четное число. Не стоит брать нестабильные (aka девелоперские) версии ядра, если вы конечно не собираетесь стать kernel-hacker-ом ;)



После получения исходных кодов ядра распакуйте тарбол в директорий /usr/src/linux-MAJOR_VER.MINOR_VER.SUB_VER и создайте симлинк /usr/src/linux на этот директорий.



cd /usr/src

tar -zvxf /path/to/linux-MAJOR_VER.MINOR_VER.SUB_VER


rm -f linux

ln -s linux-MAJOR_VER.MINOR_VER.SUB_VER linux



Если вы скачали патч, обновляющий ядро до следующей версии, наложить его можно следующей командой



cd /usr/src/linux-MAJOR_VER.MINOR_VER.OLD_SUB_VER

zcat /path/to/patch.gz | patch -p1


mv ../linux-MAJOR_VER.MINOR_VER.OLD_SUB_VER ../linux-MAJOR_VER.MINOR_VER.SUB_VER



Кроме этого, вы возможно захотите расширить функциональность ядра за счет каких-либо разработок третьих сторон (например - пакет lm-sensors, позволяющий работать с датчиками температуры, скорости вращения вентиляторов и пр.) или добавить драйверы для специфического оборудования, доступные в виде патчей к ядру. Скачайте их, если надо, и выполните установочные действия, описанные в документации к таким пакетам.



Очень неплохая страница с патчами для ядра (как для оптимизации работы, так и для расширения функциональности) - http://members.optusnet.com.au/ckolivas/kernel



При смене ветки ядра обычно нужно обновлять некоторые прикладные пакеты, например пакет modutils, предоставляющий утилиты для управления модулями ядра. Эти пакеты тоже можно взять на http://www.kernel.org/




После этого необходимо убедиться, что директории /usr/include/asm и /usr/include/linux - это симлинки на соответсвующие директории из /usr/src/linux/include/usr/src/linux/include/asm - это тоже симлинк на директорий с ассеблерными хидерами для вашей архитектуры. Если не удалить старые заголовочные файлы ядра, то впоследствии вас могут ожидать очень неприятные сюрпризы при сборке софта, использующего ядерные заголовочные файлы.



Теперь можно приступить к конфигурированию ядра. Перед этим вам необходимо точно выяснить спецификации вашего компьютера



* тип процессора;

* чипсет материнской платы;


* тип видеокарты;

* тип сетевой платы;

* тип саунд-карты;

* тип жестких дисков;

* usb-устройства;




и т.д.



Процесс создания конфига ядра достаточно прозрачен. Запуск конфигуратора осуществляется командой make menuconfig (консольный вариант) или make xconfig (графический вариант) из корневого директория с исходными кодами ядра (/usr/src/linux). Лично я предпочитаю графический вариант, так как он более нагляден - видны все возможные опции, а не только доступные, как в консольном. Но это - дело вкуса. Для каждого пункта настройки имеется помошь, правда на английском, но - такова жизнь. Без знания технического английского в понимании юниксов (да и вообще) далеко не продвинешься.


Краткое описание подсистем ядра дано ниже.


При создании конфига главное - определиться, какие функции и драйверы встроить в ядро, а какие собрать модулями. Принцип тут прост - редкоиспользуемые функции и драйверы, а также драйверы, которые требуют передачи дополнительных параметров (например - старые звуковые платы на шине ISA) лучше собирать модулями. Остальное - встраивать в ядро. Особенно это касается драйверов для вашего жесткого диска и поддержки основной файловой системы - они должны быть встроены в ядро.




После создания конфига (файл /usr/src/linux/.config) сделайте его резервную копию и можно приступать к сборке. Вот команда, осуществляющая сборку ядра



make dep clean bzImage modules modules_install



После завершения работы команды необходимо скопировать собраное ядро и System.map (это файл с таблицей символов, экспортируемых ядром) в нужное место. Обычно - это директорий /boot.



cp System.map /boot/System.map-MAJOR_VER.MINOR_VER.SUB_VER


cp arch/i386/boot/bzImage /boot/vmlinuz-MAJOR_VER.MINOR_VER.SUB_VER

rm -f /boot/System.map

ln -s System.map-MAJOR_VER.MINOR_VER.SUB_VER /boot/System.map



В RedHat-based системах последняя команда необязательна, так как создание этого симлинка предусмотрено в загрузочных скриптах. Эта фича полезна в том случае, если в системе несколько ядер разных версий. Фича реализуется следующими командами, добавленными в init-скрипт (после монтирования файловой системы)



if [ -L /boot/System.map -a -r /boot/System.map-`uname -r` -a


! /boot/System.map -ef /boot/System.map-`uname -r` ] ; then

ln -s -f System.map-`uname -r` /boot/System.map

fi

if [ ! -e /boot/System.map -a -r /boot/System.map-`uname -r` ] ; then

ln -s -f System.map-`uname -r` /boot/System.map

fi




Для чистюль - после этого можно еще раз выполнить make clean :)



Если у вас RPM-based дистрибутив - вес процесс сборки можно выполнить командой make rpm. После отработки у вас будет готовый rpm-пакет, находящийся в /usr/src//RPMS/i386. Вам достаточно просто установить его при помощи rpm -Uvh. Этот способ более правилен, чем сборка и установка вручную.


Следующий этап - указать новое ядро загрузчику.


Если вы используете lilo, добавьте в /etc/lilo.conf строки




image = /boot/vmlinuz-MAJOR_VER.MINOR_VER.SUB_VER

Label = New

read-only

root = /dev/



и выполните /sbin/lilo




Если в качестве загрузчика используется grub, в его конфиг (обычно /boot/grub/grub.conf)



title New

root (hd0,)

kernel /boot/vmlinuz-MAJOR_VER.MINOR_VER.SUB_VER ro

root=/dev/hda2




Все. Ядро установлено и доступно при загрузке под меткой New. можно перезагружаться и наслаждаться новым ядром. Ну или kernel panic, как это частенько бывает у новичков. При появлении kernel panic главное помнить - don't panic :) Скорее всего вы несколько неправильно сконфигурировали ядро. Проанализируйте ситуацию, при которой возник panic, попытайтесь понять, чего не хватает, перезагрузитесь со старым ядром и повторите процесс конфигурирования сборки и установки ядра.


Загрузка модулей при старте


Бывают ситуации, когда поддержка необходимых для загрузки устройств была собрана модулем. Например, для rescue компакт-диска, когда неизвестно, какие диски будут на машине, всключать поддержку всех возможных вариантов в ядро не хочется, а работать должно везде. Для этих целей служат так называемые загрузочные рамдиски (initial ramdisks). Это файлы-образы для создания виртуальных дисков в памяти, которые содержат модули, необходимые для нормальной загрузки системы. Рамдиски создаются при помощи команды mkinitrd. Подробное описание ключей и принципов использования команды можно прочитать в соответсвующей ман-страничке. Для задания рамдиска который нужно использовать при загрузке используется параметр initrd в конфигурационном файле загрузчика (как для lilo, так и для grub).


Загрузочные дискеты


Загрузочные дискеты (или образы загрузочных дискет) создаются при помощи команд mkbootdisk или mkrescue. Если же Вы желаете создать этот образ вручную (например, для загрузочного cdrom-а) необходимо создать файл образа (при помощи команды dd), подмонтировать его через устройство loop и создать на нем файловую систему msdos. После чего скопировать туда ядро и необходимые конфигурационные файлы и воспользоваться утилитой syslinux для создания загрузочного сектора образа. Подробности можно посмотреть по man syslinux.




Взять пакет syslinux можно на http://syslinux.zytor.com/ Этот пакет позволяет создавать загрузочные образы для дискет, cdrom-ов и сетевых карт.


Краткое описание подсистем ядра


Я сознательно не описываю детально все конфигурационные опции ядра, а даю лишь общее описание пунктов в главном меню ядерного конфигуратора. Включать или не включать - решайте сами. Эксперименты - лучший способ набраться опыта.



Code maturiry level options - включение поддержки новых экспериментальных подсистем и драйверов.




Loadable module support - поддержка модульной структуры ядра и возможности автозагрузки модулей.



Processor type and features - тип процессора, памяти и поддержка многопроцессорности (SMP).



General setup - Включение подержки различных подсистем, в том числе сетевой. Поддержка шин PCI и PCMCIA и управления питанием. Поддержка различных форматов исполняемых файлов.




Memory technology devices - поддержка различных типров памяти, например FLASH, в основном необходима для встраиваемых устройств.



Parallel port support - поддержка параллельного интерфейса.



Plug and play configuration - поддержка устройств PLUG-N-PLAY на шинах PCI и ISA.



Block devices - поддержка блочных устройств (всевозможных дисков), в том числе и loopback устройств, необходимых для работы с обычным файлом, как с отдельным диском.




Multi-device support - поддержка RAID.



Networking options - сетевая подсистема, поддержка различных сетевых протоколов и файрвол (iptables).



Telephony support - поддержка телефонных карт для связи VOICE-OVER-IP.




ATA/IDE/MFM/RLL support - IDE подсистема и драйвера для различных IDE-контроллеров. А также эмуляция SCSI для atapi-устройств.



SCSI suppot - SCSI подсистема и драйвера SCSI-адаптеров.



IEEE 1394 (FireWire) support - поддержка шины FireWire.



I2O device support - поддержка архитектуры Intelligent Input/Output




Network device support - драйвера сетевых карт.



Amateur radio suppport - поддержка устройст для связи по X.25



IrDA (infrared) support - поддержка интерфейса для работы инфра-красным портом.




ISND support - поддержка ISDN адаптеров.



Old CD-ROM drivers - поддержка старых типов cdrom-ов.



Input core support - необходимо для устройст, работающих через USB HID (таких, как мышь, клавиатура, UPS и т.д.)



Character devices - поддержка символьных устройств, таких как последоватьный порт AGP, принтер, псевдотерминалы (необходимы для xterm).




Multimedia devices - поддержка fm-карт и устройств захвата аудио и видеоизображения.



File systems - поддержка различных типов файловых систем, в том числе и сетевых.



Console drivers - поддержка консоли. В том числе и фреймбуфера для консоли.




Sound - драйвера для звуковых карт.



USB support - поддержка USB и различных устройств, работающих через этот интерфейс.



Bluetooth support - поддержка устройств для беспроводной связи.



Kernel hacking - включение отладочного кода ядра, в частности - Magic SysRq.


Маленькие хитрости



* Если вам необходимо держать две разных конфигурации одной и той-же версии ядра, вы можете добавить свои суффиксы к версии. Для этого в /usr/src/linux/Makefile пропишите свой суффикс в переменной EXTRAVERSION. Это нужно для того, чтобы держать модулю для каждого экземпляра ядра в отдельной директории.



* spec-файл для rpm-пакета генерируется скриптом /usr/src/linux/scripts/mkspec. При необходимости добавить свои поля или секции в spec-файл подредактируйте этот скрипт.



* Помните, что модули могут подгружаться автоматически, но выгружаются только вручную. Поэтому лучше использовать скрипты-обвязки, в которых можно загружать и выгружать модули вручную. Например ниже приведен скрипт, который я использую для монтирования cdrom




#! /bin/sh



if [ $# != 1 ]; then

echo "Usage: $0 on|off"

exit 1

fi




case $1 of

on)

mount /mnt/cdrom

;;

off)


eject

modprobe -r isofs

modprobe -r ide-cd

;;

*)

echo "Usage: $0 on|off"


exit 1

;;

esac



Некоторые интересные ссылки



Пакет lm-sensors - http://secure.netroedge.com/~lm78




Графическая загрузка - http://www.bootsplash.org/


Источник - http://linuxportal.ru/

Автор - Неизвестен

Похожие новости

Комментариев 3