В статье я попытаюсь описать процесс установки нового ядра в систему
так, как это делаю я. Описанный способ не предендует на
исключительность.
Сборка ядра
Первое, что необходимо сделать - скачать исходные коды ядра. Их можно
взять с 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.
В 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 можно на [83]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