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

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

Перейти к: навигация, поиск

Оригинальная статья претерпела сильные изменения

Содержание

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

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

В Linux ядро представляет собой единый файл, носящий имя vmlinuz. Начальные буквы vm обозначают виртуальную память (virtual memory), а последняя буква z говорит о том, что файл является сжатым (gzip или bzip). Файл vmlinuz находится в директории /boot.

В каких случаях прибегают к перекомпиляции ядра?

  • Чтобы уменьшить размер ядра:

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

  • Чтобы добавить или убрать поддержку тех или иных устройств:

Для взаимодействия любого устройства с операционной системой необходим соответствующий драйвер устройства. Например, подсоединяя 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 содержат утилиты для управления модулями ядра Linux - для загрузки, выгрузки, перечисления и удаления модулей. Основные доступные утилиты суть:

   * 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, и распакуйте его:

root@blah# tar xf module-init-tools-3.10.tar.bz2

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

root@blah# cd module-init-tools-3.10
root@blah# ./configure --prefix=/

3) Переименуйте существующую 2.4 версию утилиты в utility.old:

root@blah# make moveold

4) Создайте и установите:

root@blah# make
root@blah# make install

5) Запустите скрипт generate-modprobe.conf для перевода данных из файла конфигурации модулей версии ядра 2.4 (/etc/modules.conf) в файл, применяющийся версией ядра 2.6 (/etc/modprobe.conf) (вообще говоря, этот файл в Slackware пустой)

root@blah# ./generate-modprobe.conf /etc/modprobe.conf

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

root@blah# depmod -V

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

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

ftp://ftp.ru.kernel.org/pub/linux/kernel/v2.6
http://mirror.yandex.ru/kernel.org/linux/kernel/v2.6 (о бесплатном траффике см. Yandex LAN)
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/asm-generic /usr/include/asm-generic.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/asm-generic /usr/include/asm-generic
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 - утилита, имеющая графический интерфейс, что подразумевает установку X Window System. Потому применяется не всегда.
  • make oldconfig - текстовая утилита, которая берет существующий файл конфигурации и запрашивает по поводу каждой переменной, не активизированной в этом файле. Нудно.
  • make menuconfig - конфигуратор c псевдографическим интерфейсом, основанный на управляемом курсором интерактивном меню. Этот вариант чаще всего используется для конфигурации ядра.

Новичкам я бы посоветовала использовать существующую конфигурацию (файл .config из пакета готового ядра, распространяемого с дистрибутивом) и воспользоваться программой 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) 

Устройства Loopback служат, например, для монтирования файлов с образами файловых систем.

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, JFS, XFS.

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

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

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

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

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

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

для ядер < 2.6.30:
root@blah# make -j 4 bzImage
для новых ядер:
root@blah# make -j 4 ; make install

root@blah# make -j 4 modules; make modules_install

Опция -j велит команде make запускать множество операций в Makefile параллельно, что, в свою очередь, уменьшит время компиляции (особенно заметно на многоядерных архитектурах).

4 - это количество параллельно запускаемых потоков компиляции (вообще, на системах с большим объемом памяти и несколькими процессорными ядрами это число может быть большим - до сотни).

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

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

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

root@blah# dd if=/dev/hda bs=512 count=1 2>&1 | grep GRUB

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

root@blah# dd if=/dev/hda bs=512 count=1 2>&1 | grep LILO

В Slackware загрузчик по умолчанию - LiLo. Примечание: Если у вас винчестер SCSI или SATA, то вместо hda, пишите sda.

2. Сконфигурируйте загрузчик

Если у вас LiLo, Добавьте строки для нового ядра в файл /etc/lilo.conf. Типичная запись LiLo выглядит примерно так:

boot = /dev/sda
append=" vt.default_utf8=0"
prompt
timeout = 50
vga = normal
image = /boot/vmlinuz
  root = /dev/sda1
  label = li
  read-only
image = /boot/vmlinuz.w
  root = /dev/sda1
  label = liw
  read-only 


Если у вас GRUB, то добавьте запись для нового ядра в конец списка ядер в файле /etc/grub.conf. В GRUB первая запись имеет номер 0 (ноль). Вот пример записи:

title Slack
root (hd0,0)
kernel /boot/vmlinuz-2.6.30 ro root=/dev/hda2 panic=3

Параметр переменной "panic" обеспечивает перезагрузку системы со старым ядромв случае kernel panic. Это означает, что в случае системного сбоя машина будет перезагружена с параметрами по умолчанию через 3 секунды. Это бывает удобно при удаленной перестановке ядра на сервере.

Только не изменяйте значение переменной "default" в файле grub.conf. Когда будете перезагружаться, войдите в режим командной строки GRUB. Для этого нужно напечатать при появлении загрузочного приглашения команду "grub". Когда GRUB перейдет в режим командной строки, введите следующую команду:

savedefault --default=3 --once

Это в случае, если новая запись введена под номером 3. Затем выходите из режима командной строки GRUB.

7.Перезагрузка компьютера

Перезагрузите компьютер командой reboot (или Ctrl-Alt-Del в текстовой консоли). Если, паче чаяния, произойдет системный сбой - kernel panic, то система сама перезагрузится со старым ядром (в случае GRUB). Если все пойдет хорошо, то система будет загружена с новым ядром. Если система загружается с новым ядром, не забудьте изменить значение переменной "default" в файле grub.conf.

Заключение

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

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

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

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