Компиляция ядра

Материал из Слакваря

(Различия между версиями)
Перейти к: навигация, поиск
(4. Как сконфигурировать ядро)
(2. Получение исходного кода ядра)
Строка 95: Строка 95:
  root@blah# ln -s linux-2.6.30 linux
  root@blah# ln -s linux-2.6.30 linux
  root@blah# cd linux
  root@blah# cd linux
 +
 +
Для ядер серии >= 2.6.30 необходимо выполнить следующее (необходимо для программ, использующих функциональность ядра напрямую, сторонних драйверов и т.п.):
 +
 +
root@blah# mv /usr/include/asm-i386 /usr/src/linux/asm-i386.save
 +
root@blah# mv /usr/include/linux /usr/include/linux.save
 +
root@blah# ln -s /usr/src/linux/arch/x86/include/asm /usr/include/asm-x86
 +
root@blah# ln -s /usr/include/asm-x86 /usr/include/asm-i386
 +
root@blah# ln -s /usr/src/linux/include/linux /usr/include
==== 3. Получение информации о компьютерном "железе" ====
==== 3. Получение информации о компьютерном "железе" ====

Версия 13:45, 15 августа 2009

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

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

Содержание

Что есть ядро?

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

В Линукс ядро представляет собой единственный файл, носящий имя 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 на компьютер, используя, например, links или lynx, и распакуйте его:

# tar xf module-init-tools-3.10.tar.bz2

2. Сконфигурируйте его:

# cd module-init-tools-3.10
# ./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) (вообще говоря, этот файл в Slackware пустой)

# ./generate-modprobe.conf /etc/modprobe.conf


6. Проверьте версию имеющегося в наличии module-init-tools

# depmod -V

2. Получение исходного кода ядра

Скачайте исходные коды ядра с сайтов из списка:

ftp://ftp.ru.kernel.org/pub/linux/kernel/v2.6
http://mirror.yandex.ru/kernel.org/linux/kernel/v2.6 (о бесплатном траффике см. http://local.yandex.ru)
http://www.kernel.org/pub/linux/kernel/v2.6/

Вы можете поместить их в директорию /usr/src (штатное расположение ядер в Slackware) на вашем компьютере. Если вы планируете обновление ядра до версии 2.6.30, то шаги будут таковы:

root@blah# cd /usr/src
root@blah# wget http://mirror.yandex.ru/kernel.org/linux/kernel/v2.6/linux-2.6.30.tar.bz2
root@blah# tar xf linux-2.6.30.tar.bz2
root@blah# rm linux
root@blah# ln -s linux-2.6.30 linux
root@blah# cd linux

Для ядер серии >= 2.6.30 необходимо выполнить следующее (необходимо для программ, использующих функциональность ядра напрямую, сторонних драйверов и т.п.):

root@blah# mv /usr/include/asm-i386 /usr/src/linux/asm-i386.save
root@blah# mv /usr/include/linux /usr/include/linux.save
root@blah# ln -s /usr/src/linux/arch/x86/include/asm /usr/include/asm-x86
root@blah# ln -s /usr/include/asm-x86 /usr/include/asm-i386
root@blah# ln -s /usr/src/linux/include/linux /usr/include

3. Получение информации о компьютерном "железе"

Утилита lspci выдаст информацию о сетевой карте и всех устройствах, подключенных к машине. Если в ответ на ввод команды lspci вы получаете ошибку "lscpi: command not found" (команда не найдена), вам придется установить пакет pciutils на ваш компьютер.

Вывод команды lspci выглядит примерно так:

root@blah# 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)

Информацию о процессоре можно получить из файла /proc/cpuinfo

root@blah#  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


modinfo

Полезная программа для получения информации о "железе". Она выдает детальное описание модулей. Прежде чем применять команду modinfo, нужно предварительно выяснить, какие модули загружены. Для этого служит команда lsmod - она выдает список загруженных модулей.

root@blah# lsmod
i2c_nforce2             6144  0

lsmod выдала модуль sata_svw, а детальную информацию про этот модуль можно получить с помощью команды modinfo.

root@blah# modinfo i2c_nforce2
filename:       /lib/modules/2.6.27.6/kernel/drivers/i2c/busses/i2c-nforce2.ko
description:    nForce2/3/4/5xx SMBus driver
author:         Hans-Frieder Vogt <hfvogt@gmx.net>
license:        GPL
alias:          pci:v000010DEd00000446sv*sd*bc*sc*i*
alias:          pci:v000010DEd000003EBsv*sd*bc*sc*i*
alias:          pci:v000010DEd00000368sv*sd*bc*sc*i*
alias:          pci:v000010DEd00000264sv*sd*bc*sc*i*
alias:          pci:v000010DEd00000034sv*sd*bc*sc*i*
alias:          pci:v000010DEd00000052sv*sd*bc*sc*i*
alias:          pci:v000010DEd000000E4sv*sd*bc*sc*i*
alias:          pci:v000010DEd000000D4sv*sd*bc*sc*i*
alias:          pci:v000010DEd00000084sv*sd*bc*sc*i*
alias:          pci:v000010DEd00000064sv*sd*bc*sc*i*
depends:        
vermagic:       2.6.27.6 SMP mod_unload K8

4. Как сконфигурировать ядро

После получения исходников ядра, следующим шагом будет сконфигурировать ядро. Для этого есть несколько способов:

  • make config - эта утилита в командной строке задаст вам по очереди все возможные и невозможные вопросы по поводу конфигурации. Очень долго и нудно.
  • make xconfig - утилита, имеющая графический интерфейс, что подразумевает установку Иксов. Потому применяется не всегда.
  • make oldconfig - текстовая утилита, которая берет существующий файл конфигурации и запрашивает по поводу каждой переменной, не активизированной в этом файле. Нудно.
  • make menuconfig - текстовой конфигуратор, основанный на управляемом курсором интерактивном меню. Эта программа чаще всего используется для конфигурации ядра.

Новичкам я бы посоветовала использовать существующую конфигурацию и воспользоваться программой make menuconfig для конфигурации ядра.

Шаги по конфигурированию ядра таковы:

  • Скопируйте текущую конфигурацию ядра в директорию с вашими новыми исходниками.
root@blah# uname -r
2.6.27.6
root@blah# cp /usr/src/linux-2.6.27.6/.config /usr/src/linux
root@blah# make menuconfig

Пройдясь по конфигу, отмечаем нужные модули и режимы. Делается из-за того, что в новом ядре могут добавлятся опции и новые драйвера.

Даже сохраняя старые значения, не забудьте сверить информацию об аппаратной конфигурации компьютера, типе процессора и сетевой карты. В новых версиях ядра опции могут изменяться, и некоторых из них может не оказаться в старом .config файле.

На рисунке 1 представлено главное окно menuconfig. Только некоторые опции могут быть скомпилированы как модули. В menuconfig они обозначаются угловыми скобками < >. Нажмите M, чтобы компилировать как модуль. Значок звездочки [*] означает встроенное в ядро, M обозначает модуль.

menuconfig Рисунок 1: menuconfig

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

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

menuconfig search results Рисунок 3: Результаты поиска menuconfig

Из множества опций программы menuconfig я упомяну о наиболее важных. Наиболее существенными для правильной работы ядра являются: процессор, файловая система, сетевая карта, SATA/IDE/SCSI контроллеры, жесткий диск. Вы можете выбрать желаемые: процессор, файловую систему, жесткий диск и сетевую карту из опций, доступных в 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 (в новых ядрах есть опция Multicore Schedule - для процессоров Intel Core, AMD Athlon64/Phenom).

Если у вас больше 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 :Подключите Loop back device support

Включите:

Loopback device support (module) 

2. SCSI device support: Подключите в секции SCSI low level drivers соответствующую модель, если она является SCSI устройством.

3. Serial ATA и Parallel ATA 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 (если необходимо), reiserfs, ext3, journaling.

Когда с этим закончите, сохраните настройки (save the settings) и выходите из программы (quit). В результате получите обновленный файл .configure.

5. Создание ядра

Следующий шаг - создание ядра. Вы можете применить команду make bzImage для этой цели. Эта команда создаст сжатый файл bzImage в папке arch/i386/boot в директории исходников Линукс; этот файл и будет новым скомпилированным ядром.

Следующий шаг - компиляция и линковка (создание ссылок) модулей. Здесь применим команду make modules.

После этого необходимо скопировать модули в директорию /lib/modules/. Это делается при помощи команды make modules_install.

Последовательность команд следующая:

  1. make -j<Number> bzImage
  2. make -j<Number> modules
  3. make -j<Number> modules-Install

Опция -j велит системе проделать множество операций в Makefile вместе, что, в свою очередь, уменьшит время компиляции.

<Number> - это удвоенное число процессоров в вашей системе, или число виртуальных процессоров. Его можно узнать, применив следующую команду:

  1. cat /proc/cpuinfo | grep ^processor | wc -l

Когда это сделано, скопируйте все в директорию /boot следующим образом:

  1. cp .config /boot/config-2.6.19.2
  2. cp arch/i386/boot/bzImage /boot/vmlinuz-2.6.19.2
  3. cp System.map /boot/System.map-2.6.19.2
  4. mkinitrd /boot/initrd-2.6.9.img 2.6.19.2

mkinitrd это программа, создающая образ инициирующего виртуального диска - initial RAM Disk Image (initrd).

6. Конфигурация загрузчика

Загрузчик - это первая программа, которая запускается при загрузке системы. Существует два вида загрузчиков: GRUB и LILO

1. Определите, какой вид загрузчика у вас установлен. Проверьте первые 512 байтов загрузочного жесткого диска. Сперва проверяйте на grub:

  1. dd if=/dev/hda bs=512 count=1 2>&1 | grep GRUB

Если совпадает (появляется вывод команды; прим. перев.), текущий загрузчик - grub. Если не совпадает (нет никакого вывода команды; прим. перев.), то проверьте на lilo:

  1. 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.

Заключение

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

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

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

Личные инструменты