суббота, 30 августа 2008 г.

Debian: сборка ядра `на стероидах'

Задача: Есть необходимость собрать `ванильное' ядро. Хочется сделать это быстро, без лишних хлопот и максимально по debian way.
Решение: Воспользоваться пакетом kernel-package из стандартной поставки debian.

Подготовка к сборке
Для начала устанавливаем все необходимое:
$ sudo apt-get install libncurses5-dev fakeroot kernel-package initramfs-tools
Теперь нам осталось только скачать и сконфигурировать ядро (для примера, пускай это будет ядро 2.6.26):
$ wget ftp://ftp.kernel.org/pub/linux/kernel/v2.6/linux-2.6.26.tar.gz
$ tar xzf
linux-2.6.26.tar.gz $ cd linux-2.6.26/ $ make menuconfig
После конфигурации переходим к следующему шагу.

Debian way: kernel-package
С помощью этого пакета, на выходе, мы получим deb-пакет, который, в дальнейшем, можно установить с помощью штатных утилит. Преимущество этого способа в том, что установкой и удалением ядра, будет заниматься менеджер пакетов дэбиана, который гарантирует, что все установленное из пакета, будет корректно удалено.
Для начала выполним очистку дерева исходных кодов, на случай, если там остались следы предыдущих экспериментов:
$ make-kpkg clean
и наконец
$ CONCURRENCY_LEVEL="2" make-kpkg --rootcmd fakeroot --arch_in_name --append_to_version -vanilla --revision 0.1 --initrd kernel_image
`Теперь Вы можете откинуться на спинку вашего кресла' :), пойти попить чай, или заняться другими делами. Сборка ядра -- долгое и утомительное действо.
Тем кто остался, расскажу немного о тех опциях, что мы использовали. Назначение большинства из них интуитивно понятно, так что остановлюсь на `непонятных':
--rootcmd fakeroot запускает make-kpkg в имитируемом root-окружении, при помощи команды fakeroot.

--initrd служит для создания initial ram drive, образа, необходимого для начальной загрузки ядра. Подробнее прочесть можно здесь.
Теперь обратим пристальное внимание на переменную окружения CONCURRENCY_LEVEL. Из документации следует, что она задает количество параллельно выполняемых команд (аналогично использованию make с опцией --jobs) или, по простому, количество процессоров/ядер задействованных в компиляции. Объявление
CONCURRENCY_LEVEL позволило сократить время сборки ядра (с моей конфигурацией) вдвое (с ~13 до ~7 минут).

Установка
Вскоре ядро скомпилируется и будет аккуратно помещено в deb-пакет вида linux-image-2.6.26-vanilla_0.1_i386.deb. Остается установить его:
$ cd ..
$ sudo dpkg -i linux-image-2.6.26-vanilla_0.1_i386.deb
Перезагружаемся в новое ядро. Вот и все! Удачи в дебрях menuconfig ;)!