Сборка и установка ядра под Debian

23:04

Тут речь идти будет не просто про компиляцию ядра Linux, а про компиляцию ядра и его сборку в deb-пакет. Потом этим deb'ом можно будет поделиться с знакомыми, похвастаться перед любимой девушкой/парнем или просто, при необходимости, использовать повторно.

Для начала ставим пакеты fakeroot, kernel-package, libncurses5-dev:

aptitude install fakeroot kernel-package libncurses5-dev


Все зависимости будут подтянуты автоматом…
Затем берём нужный архив с kernel.org и сливаем и распаковываем его в /usr/src (берём для примера ядро 2.6.31.4).

$ cd /usr/src
$ sudo -s
# wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.31.4.tar.bz2
# tar xjf linux-2.6.31.4.tar.bz2
# if [ -d linux ]; then rm linux; fi; ln -s linux-2.6.31.4 linux
# cd linux


Тут есть один момент. Так как у нас уже есть рабочее ядро в установленной системе то, если не хотим выставлять все галочки в конфигурации нового ядра с нуля, берём готовый config либо из /boot либо из /proc:

# cp /boot/config-$( uname -r ) .config
# zcat /proc/config.gz > .config


В итоге имеем предварительную заготовку к конфигурации нашего нового ядра.

Теперь конфигурируем ядро под специфические для нас цели, либо добавляем опции для новых модулей, либо… Одним словом — творчество:

# make menuconfig


Тут интересно будет отметить, что если мы сразу-же выйдем из меню, то можем увидеть что-то подобное этому:

.config:903:warning: symbol value 'm' invalid for RFKILL_INPUT
.config:2920:warning: symbol value 'm' invalid for DRAGONRISE_FF
.config:2937:warning: symbol value 'm' invalid for GREENASIA_FF
.config:2939:warning: symbol value 'm' invalid for THRUSTMASTER_FF
.config:2940:warning: symbol value 'm' invalid for ZEROPLUS_FF


имеет смысл найти эти опции при конфигурировании нового ядра и посмотреть что да к чему…
Кстати, если кому интересно под X-ами заниматься конфигурированием, то может сделать так:

# make xconfig


Важно! Не забываем сказать «Kernel module loader» в «Loadable module support», так как возможны варианты.
Ну всё. Пимпочки поотмечали, кнопочки понажимали, из окошек вышли, новый конфиг сохранили, теперь приступим к сборке. Для начала сделаем:

# make-kpkg clean


Увидим что-то наподобие этого:

exec make kpkg_version=12.021 -f /usr/share/kernel-package/ruleset/minimal.mk clean
====== making target minimal_clean [new prereqs: ]======
This is kernel package version 12.021.
test ! -f .config || cp -pf .config config.precious
test ! -e stamp-building || rm -f stamp-building
test ! -f Makefile || \
make ARCH=i386 distclean
make[1]: Entering directory `/usr/src/linux-2.6.31.4'
CLEAN scripts/basic
CLEAN scripts/kconfig
CLEAN include/config
CLEAN .config .config.old include/linux/autoconf.h
make[1]: Leaving directory `/usr/src/linux-2.6.31.4'
test ! -f config.precious || mv -f config.precious .config
rm -f modules/modversions.h modules/ksyms.ver scripts/cramfs/cramfsck scripts/cramfs/mkcramfs


Ну, а теперь, собственно, собираем ядро:

# fakeroot make-kpkg --initrd --revision=og.091015.00 kernel_image


og.091015.00 — означает лишь ревизию нашей сборки (меньше букв, но больше цифр, иначе получите ошибку в под самый конц сборки и придётся всё повторять с самого начала), а в остальном может быть любой — у кого насколько фантазии хватит :)
После того как предыдущая команда нормально выполнится, можно также дать такой «джентельменский набор»:

# fakeroot make-kpkg --initrd --revision=og.091015.00 kernel_headers
# fakeroot make-kpkg --initrd --revision=og.091015.00 kernel_manual
# fakeroot make-kpkg --initrd --revision=og.091015.00 kernel_doc
# fakeroot make-kpkg --initrd --revision=og.091015.00 kernel_source


После этого получим набор из следующих deb-пакетов:

  • linux-image-2.6.31.4_og.091015.00_i386.deb
  • linux-headers-2.6.31.4_og.091015.00_i386.deb
  • linux-manual-2.6.31.4_og.091015.00_all.deb
  • linux-doc-2.6.31.4_og.091015.00_all.deb
  • linux-source-2.6.31.4_og.091015.00_all.deb


располагаться они будут в /usr/src.
Нам остаётся их только установить через dpkg:

# cd /usr/src
# dpkg -i ./linux-image-2.6.31.4_og.091015.00_i386.deb


и т.д.
Конфигурация к GRUB'у должна будет выполниться автоматически, равно как и собраться initrd.
Финальный шаг:

# reboot

(c)