Наши партнеры

UnixForum






Книги по Linux (с отзывами читателей)

Библиотека сайта rus-linux.net

На главную -> MyLDP -> Тематический каталог -> Обновление и конфигурирование ядра

Советы для успешной перекомпиляции ядра Линукс.

Оригинал: 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
Как modprobe, так и insmod используются для подключения модулей. Единственное отличие между ними состоит в том, что insmod "не знает" местоположение модулей и не предупреждает о зависимостях. Modprobe "знает" про это, просматривая файл /lib/modules/<версия ядра>/modules.dep

Как устанавливать 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 обозначает модуль.

menuconfig

Рисунок 1: menuconfig

Menuconfig предлагает функции поиска. Нажмите "/" для поиска любого модуля. Для примера: если вы не знаете, где искать модуль iptables, нажмите "/", введите "iptables" и нажмите enter.

Search for configuration parameter

Рисунок 2: Поиск параметров конфигурации

menuconfig search results

Рисунок 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 будет выглядеть вот так:

menuconfig search results

Рисунок 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.

Заключение

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

Благодарности

Мое большое спасибо всем моим друзьям :-)