Библиотека сайта rus-linux.net
Советы для успешной перекомпиляции ядра Линукс.
Оригинал: Tips for successful Kernel Recompilation in Linux
Дата: 1 января 2008
Свободный перевод: Алексей Дмитриев
Дата перевода: 10 января 2008
"Компилировать ядро - не орехи щелкать", - часто вздыхают те, у кого перекомпилированное ядро не хочет загружаться. Хотя орешек этот довольно крепок, однако перекомпиляция остается неизбежным делом, с которым каждый системный администратор Линукс рано или поздно столкнется.
Я тоже не избежала этой участи. В этой статье я собираюсь пройти с вами все фазы компиляции ядра. Я верю, что это придаст вам уверенности и компиляция перестанет быть для вас "невыполнимой миссией".
Что есть ядро?
Говоря по-простому, ядро - это центральная часть большинства операционных систем. В число основных функций ядра входят: управление процессами, управление ресурсами и прочее. Ядро первым загружается в оперативную память, когда компьютер включается, и остается в памяти до момента выключения машины. Именно потому, что ядро постоянно присутствует в оперативной памяти, оно должно быть минимально возможного размера.
В Линукс ядро представляет собой единственный файл, носящий имя vmlinuz. Начальные буквы vm обозначают виртуальную память (virtual memory), а последняя буква z говорит о том, что файл является сжатым. Файл vmlinuz находится в директории /boot.
В каких случаях прибегают к перекомпиляции ядра?
Чтобы уменьшить размер ядра:
Представьте, что вы фанат Линукс, и вам нужна ОС для мобильного телефона. Обычная ОС содержит разнообразные компоненты и имеет размер, измеряемый в гигабайтах, которых просто нет в мобильном телефоне. Я бы на вашем месте перекомпилировала ядро и удалила ненужные модули. Когда размер ядра уменьшится, оно будет занимать меньше места в оперативной памяти, высвобождая дополнительные ресурсы для приложений.
Чтобы добавить или убрать поддержку тех или иных устройств:
Для взаимодействия любого устройства с операционной системой необходим соответствующий драйвер устройства. Например, подсоединяя USB устройство к компьютеру, мы должны обеспечить соответствующий драйвер для его работы. Говоря техническим языком, в ядре необходимо активировать поддержку USB драйвера.
Чтобы изменить параметры системы:
Системные параметры включают: поддержку "верхней" памяти, управление лимитами выделяемого ресурса и тому подобное. Для управления физической памятью свыше 4Гб, необходима поддержка "верхней" памяти (до 64 Гб).
Каковы этапы рекомпиляции ядра?
1.Проверить и обновить необходимые пакеты 2.Получить исходный код ядра 3.Получить информацию о компьютерном "железе" 4.Сконфигурировать ядро 5.Создать ядро 6.Сконфигурировать загрузчик 7.Перезагрузить сервер
1. Проверить и обновить необходимые пакеты
Этот этап нужен только при повышении версии ядра с 2.4 до 2.6. Если делается обновление версии 2.6.х до 2.6.х, то первый этап можно пропустить.
Прежде чем приступить к обновлению ядра, нужно убедиться, что система способна принять новое ядро. Проверьте утилиты, взаимодействующие с вашей системой, и убедитесь, что они новейших версий. Если это не так, то сперва обновите их.
Основные пакеты для проверки и обновления:
binutils, e2fsprogs, procps, gcc и module-init-tools.При обновлении module-init-tools необходимо быть очень внимательным. Модулем называется программа, которая может быть включена в ядро по требованию (в случае необходимости). Module-init-tools содержат утилиты для управления модулями ядра Линукс - для загрузки, выгрузки, перечисления и удаления модулей. Основные доступные утилиты суть:
- insmod
- rmmod
- modprobe
- depmod
- lsmod
Как устанавливать module-init-tools?
1.Загрузите исходный код http://www.kernel.org/pub/linux/utils/kernel/module-init-tools/module-init-tools-3.2.2.tar.gz на сервер, используя wget, и распакуйте его:
# tar -zxf module-init-tools-3.2.2.tar.gz
2. Сконфигурируйте его:
# cd module-init-tools-3.2.2 # ./configure --prefix=/
3. Переименуйте существующую 2.4 версию утилиты в utility.old:
# make moveold
4. Создайте и установите:
# make # make install
5. Запустите скрипт generate-modprobe.conf для перевода данных из файла конфигурации модулей версии ядра 2.4 (/etc/modules.conf) в файл, применяющийся версией ядра 2.6 (/etc/modprobe.conf)
# ./generate-modprobe.conf /etc/modprobe.conf
6. Проверьте версию имеющегося в наличии module-init-tools
# depmod -V
2. Получение исходного кода ядра
Скачайте исходники с сайта http://www.kernel.org/pub/linux/kernel/v2.6/. Вы можете поместить их в директорию /usr/src/kernels на вашем сервере. Если вы планируете обновление ядра до версии 2.6.19.2, то шаги будут таковы:
[root]# cd /usr/src/kernels [root]# wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.19.2.tar.gz [root]# tar zxf linux-2.6.19.2.tar.gz [root]# cd linux-2.6.19.2
3. Получение информации о компьютерном "железе"
Информация об аппаратной конфигурации вашего компьютера помогут получить следующие команды:
lspci
Эта утилита выдаст информацию о сетевой карте и всех устройствах, подключенных к машине. Если в ответ на ввод команды lspci вы получаете ошибку "lscpi: command not found" (команда не найдена), вам придется установить пакет pciutils-2.1.99.test8-3.4 rpm на ваш сервер.
Типичный вывод команды lspci выглядит примерно так:
[root]# lspci 00:01.0 PCI bridge: Broadcom BCM5785 [HT1000] PCI/PCI-X Bridge 00:02.0 Host bridge: Broadcom BCM5785 [HT1000] Legacy South Bridge 00:02.1 IDE interface: Broadcom BCM5785 [HT1000] IDE 00:02.2 ISA bridge: Broadcom BCM5785 [HT1000] LPC 00:03.0 USB Controller: Broadcom BCM5785 [HT1000] USB (rev 01) 00:03.1 USB Controller: Broadcom BCM5785 [HT1000] USB (rev 01) 00:03.2 USB Controller: Broadcom BCM5785 [HT1000] USB (rev 01) 00:05.0 VGA compatible controller: ATI Technologies Inc Rage XL (rev 27) 00:18.0 Host bridge: Advanced Micro Devices [AMD] K8 [Athlon64/Opteron] HyperTransport Technology Configuration 00:18.1 Host bridge: Advanced Micro Devices [AMD] K8 [Athlon64/Opteron] Address Map 00:18.2 Host bridge: Advanced Micro Devices [AMD] K8 [Athlon64/Opteron] DRAM Controller 00:18.3 Host bridge: Advanced Micro Devices [AMD] K8 [Athlon64/Opteron] Miscellaneous Control 01:0d.0 PCI bridge: Broadcom BCM5785 [HT1000] PCI/PCI-X Bridge (rev b2) 01:0e.0 RAID bus controller: Broadcom BCM5785 [HT1000] SATA (Native SATA Mode) 02:03.0 Ethernet controller: Broadcom Corporation NetXtreme BCM5704 Gigabit Ethernet (rev 10) 02:03.1 Ethernet controller: Broadcom Corporation NetXtreme BCM5704 Gigabit Ethernet (rev 10)
cat /proc/cpuinfo
Информацию о процессоре можно получить из файла /proc/cpuinfo
[root]# cat /proc/cpuinfo processor : 0 vendor_id : AuthenticAMD cpu family : 15 model : 35 model name : Dual Core AMD Opteron(tm) Processor 170 stepping : 2 cpu MHz : 1996.107 cache size : 1024 KB physical id : 0 siblings : 2 core id : 0 cpu cores : 2 fdiv_bug : no hlt_bug : no f00f_bug : no coma_bug : no fpu : yes fpu_exception : yes cpuid level : 1 wp : yes flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht pni syscall nx mmxext fxsr_opt lm 3dnowext 3dnow pni bogomips : 3992.34 [root]#
modinfo
Полезная программа для получения информации о "железе". Она выдает детальное описание модулей. Прежде чем применять команду modinfo, нужно предварительно выяснить, какие модули загружены. Для этого служит команда lsmod - она выдает список загруженных модулей.
[root]# lsmod libata 105757 1 sata_svw [root]#
lsmod выдала модуль sata_svw, а детальную информацию про этот модуль можно получить с помощью команды modinfo.
[root]# modinfo sata_svw filename: /lib/modules/2.6.9-55.ELsmp/kernel/drivers/ata/sata_svw.ko author: Benjamin Herrenschmidt description: low-level driver for K2 SATA controller license: GPL version: 2.0 9FF8518CB6CD3CB4AE61E35 vermagic: 2.6.9-55.ELsmp SMP 686 REGPARM 4KSTACKS gcc-3.4 depends: libata alias: pci:v00001166d00000240sv*sd*bc*sc*i* alias: pci:v00001166d00000241sv*sd*bc*sc*i* alias: pci:v00001166d00000242sv*sd*bc*sc*i* alias: pci:v00001166d0000024Asv*sd*bc*sc*i* alias: pci:v00001166d0000024Bsv*sd*bc*sc*i* [root]#
4. Как сконфигурировать ядро
После получения исходников ядра, следующим шагом будет сконфигурировать ядро. Для этого есть несколько способов:
1. make config - эта утилита в командной строке задаст вам по очереди все возможные и невозможные вопросы по поводу конфигурации,
2. make xconfig - утилита, имеющая графический интерфейс, что подразумевает установку Иксов. Потому и не применяется на серверах.
3. make oldconfig - текстовая утилита, которая берет существующий файл конфигурации и запрашивает по поводу каждой переменной, не активизированной в этом файле.
4. make menuconfig - текстовой конфигуратор, основанный на управляемом курсором меню. Эта программа чаще всего используется для конфигурации ядра на серверах.
Новичкам я бы посоветовала использовать существующую конфигурацию и воспользоваться программой make menuconfig для конфигурации ядра.
Шаги по конфигурированию ядра таковы:
Шаг 1: Скопируйте текущую конфигурацию ядра в директорию с вашими новыми исходниками.
[root]# pwd /usr/src/kernels/linux-2.6.19.2 [root]# cp /boot/config-<текущая_версия_ядра> .config [1] [root]# make oldconfig
где <текущая_версия_ядра> заменяется на версию ядра, работающаю в данный момент на сервере. Ее можно узнать при помощи команды:
[root]# uname -r 2.6.9-67.ELsmp [root]#
Когда make oldconfig будет запрашивать значения переменных, сохраните старые значения.
Даже сохраняя старые значения, не забудьте сверить информацию об аппаратной конфигурации сервера, типе процессора и сетевой карты. В новых версиях ядра опции могут изменяться, и некоторых из них может не оказаться в старом .config файле. Советую вторично перепроверить все опции в процессе работы с menuconfig.
Шаг 2: make menuconfig.
[root]# make menuconfig
На рисунке 1 представлено главное окно menuconfig. Только некоторые опции могут быть скомпилированы как модули. В menuconfig они обозначаются угловыми скобками < >. Нажмите M, чтобы компилировать как модуль. Значок звездочки [*] означает встроенное в ядро, M обозначает модуль.
Рисунок 1: menuconfig
Menuconfig предлагает функции поиска. Нажмите "/" для поиска любого модуля. Для примера: если вы не знаете, где искать модуль iptables, нажмите "/", введите "iptables" и нажмите enter.
Рисунок 2: Поиск параметров конфигурации
Рисунок 3: Результаты поиска menuconfig
Из множества опций программы menuconfig я упомяну о наиболее важных. Наиболее существенными для правильной работы ядра являются: процессор, файловая система, сетевая карта и жесткий диск. Вы можете выбрать желаемые: процессор, файловую систему, жесткий диск и сетевую карту из опций, доступных в menuconfig.
Тип процессора и его характеристики
Subarchitecture Type : Выберите Generic architecture (Summit,bigsmp, ES7000, default)
Processor family : Выберите соответствующий процессор из предлагаемого списка. Для примера: если у вас модель Dual Core AMD Opteron(tm) Processor 170, то можете указать Opteron/Athlon64/Hammer/K8 в имеющихся опциях.
Если у вас многопроцессорный сервер, подключите опции: Symmetric multi-processing support и SMT (Hyper threading) scheduler support.
Если у вас больше 4 Гб оперативной памяти, подключите опцию High Memory Support (64GB).
И, в конце концов, раздел Processor type and features будет выглядеть вот так:
Рисунок 4 menuconfig processor type
Конфигурация сети (Networking)
В этом разделе подключаются Iptables
Местоположение: -> Networking -> Networking support (NET [=y]) -> Networking options -> Network packet filtering (заменяет ipchains) (NETFILTER [=y]) -> Core Netfilter Configuration and IP: Netfilter ConfigurationВсе модули в разделе Core Netfilter Configuration and IP: Netfilter Configuration Должны быть подключены как модули.
Драйверы устройств
Это наиболее запутанная часть. Тут основными опциями, которые необходимо проверить, являются:
1. Block devices :Подключите RAM disk support и Loop back device support
Включите: Loopback device support (module) RAM disk support [*] встроенный Оставьте число и размер RAM дисков по умолчанию. Initial RAM disk (initrd) support [*] встроенный
2. SCSI device support: Подключите в секции SCSI low level drivers соответствующую модель, если она является SCSI устройством.
3. Serial ATA (prod) и Parallel ATA (experimental) drivers: Если у вас SATA жесткий диск, подключите соответствующий драйвер в этой секции. Для примера: Если у вас Intel PIIX/ICH SATA на сервере, подключите Intel PIIX/ICH SATA support в этом разделе.
4. Network device support: Подключите соответствующую сетевую карту. Для примера: Если у вас программа lspci выдала следующие данные сетевой карты:
Ethernet controller: Broadcom Corporation NetXtreme BCM5704 Gigabit Ethernet
Тогда подключайте:
-> Network device support -> Ethernet (1000 Mbit)ss -> Broadcom NetXtremeII support
File Systems
Основные модули, которые должны быть подключены в этой секции суть: ext2, ext3, journaling и Quota support.Когда с этим закончите, созраните настройки (save the settings) и выходите из программы (quit).
5. Создание ядра
Следующий шаг - создание ядра. Вы можете применить команду make bzImage для этой цели. Эта команда создаст сжатый файл bzImage в папке arch/i386/boot в директории исходников Линукс; этот файл и будет новым скомпилированным ядром.
Следующий шаг - компиляция и линковка (создание ссылок) модулей. Здесь применим команду make modules.
После этого необходимо скопировать модули в директорию /lib/modules/. Это делается при помощи команды make modules_install.
Последовательность команд следующая:
# make -j<Number> bzImage # make -j<Number> modules # make -j<Number> modules-Install
Опция -j велит системе проделать множество операций в Makefile вместе, что, в свою очередь, уменьшит время компиляции.
<Number> - это удвоенное число процессоров в вашей системе, или число виртуальных процессоров. Его можно узнать, применив следующую команду:
# cat /proc/cpuinfo | grep ^processor | wc -l
Когда это сделано, скопируйте все в директорию /boot следующим образом:
# cp .config /boot/config-2.6.19.2 # cp arch/i386/boot/bzImage /boot/vmlinuz-2.6.19.2 # cp System.map /boot/System.map-2.6.19.2 # mkinitrd /boot/initrd-2.6.9.img 2.6.19.2
mkinitrd это программа, создающая образ инициирующего виртуального диска - initial RAM Disk Image (initrd).
6. Конфигурация загрузчика
Загрузчик - это первая программа, которая запускается при загрузке системы. Существует два вида загрузчиков: GRUB и LILO
1. Определите, какой вид загрузчика у вас установлен.
Проверьте первые 512 байтов загрузочного жесткого диска. Сперва проверяйте на grub:# dd if=/dev/hda bs=512 count=1 2>&1 | grep GRUB
Если совпадает (появляется вывод команды; прим. перев.), текущий загрузчик - grub. Если не совпадает (нет никакого вывода команды; прим. перев.), то проверьте на lilo:
# dd if=/dev/hda bs=512 count=1 2>&1 | grep LILO
Примечание: Если у вас винчестер SCSI или SATA, то вместо hda, пишите sda.
2. Сконфигурируйте загрузчик
Если у вас LILO, Добавьте строки для нового ядра в файл /etc/lilo.conf. Типичная запись lilo выглядит примерно так:
image=/boot/vmlinuz-2.6.19.2 label=linux initrd=/boot/initrd-2.6.19.2.img read-only append="console=tty0 console=ttyS1,19200n8 clock=pmtmr root=LABEL=/"
Запустите команду:
lilo -v /sbin/lilo -R "Label for new kernel"
Если у вас GRUB, то добавьте запись для нового ядра в конец списка ядер в файле /etc/grub.conf. В GRUB первая запись имеет номер 0 (ноль). Вот пример записи:
title Red Hat Linux (2.6.19.2) root (hd0,0) kernel /boot/vmlinuz-2.6.19.2 ro root=/dev/hda2 panic=3 initrd /boot/initrd-2.6.19.2
Параметр переменной "panic" обеспечивает перезагрузку системы со старым ядром в случае kernel panic. Это означает, что в случае системного сбоя машина будет перезагружена с параметрами по умолчанию через 3 секунды.
Только не изменяйте значение переменной "default" в файле grub.conf. Когда будете перезагружаться, войдите в режим командной строки grub. Для этого нужно напечатать при появлении загрузочного приглашения команду "grub". Когда grub перейдет в режим командной строки, введите следующую команду:
savedefault --default=3 --once
Это в случае, если новая запись введена под номером 3. Затем выходите из режима командной строки grub.
7.Перезагрузка сервера
Перезагрузите сервер командой reboot. Если, паче чаяния, произойдет системный сбой - kernel panic, то система сама перезагрузится со старым ядром. Если все пойдет хорошо, то система будет загружена с новым ядром. Если система загружается с новым ядром, не забудьте изменить значение переменной "default" в файле grub.conf.
Заключение
Загрузиться с новым ядром с первой попытки это суровая задача, временами кажущаяся невозможной. Следуя перечисленным шагам и держа в уме хитрости компиляции, вы, без сомнения, достигнете уровня, когда Компиляция Ядра станет для вас конфеткой.
Благодарности
Мое большое спасибо всем моим друзьям :-)