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

netsdot.ru

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

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

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

Первое, что необходимо сделать - скачать исходные коды ядра. Их можно взять с 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/