как собрать ядро


Давно хотел написать статью о том, как собирать ядро Linux. И вот этот момент настал.

Собственно, зачем собирать ядро, если дистрибутив предоставляет вполне годное к использованию ядро?

Например, для того, чтобы пользоваться самыми новейшими драйверами и решениями, представленными в новом ядре, когда от дистрибутива доступна только старая ветка. Еще, например, чтоб настроить его под своё железо и немного ускорить работу. Я собрал себе 3.11, потому что в нем находится набор патчей, улучшающих работу с видеокартами ATI, обладателем одной из них я и являюсь.

О сборке ядра написано очень много статей, поэтому не буду вдаваться в подробности, а лишь напишу, как я собираю ядро для себя.

Первым делом, нужно получить архив с исходными кодами нужной версии ядра Linux.

На сайте https://www.kernel.org/ можно скачать желаемую версию. Я буду описывать процесс сборки и установки на примере версии 3.11.0.

Желательно собирать ядро в специально созданном для этого каталоге под непривилегированным пользователем. Я компилирую в папке ~src/linux/linux-version

Перед компиляцией стоит убедиться, что установлены все необходимые для сборки зависимости и свободно около 3ГБ места в каталоге компиляции.

Вот список пакетов, для успешной компиляции (для Debian/Ubuntu):

gcc, make — необходимые инструменты сборки и линковки. Желательно gcc одной из последних доступных версий.

libncurses5-dev — нужно для работы menuconfig

ccache — позволяет ускорить пересборку

Если хочется воспользоваться графическим конфигуратором ядра, то стоит ещё установить пакеты для разработки QT, например libqt4-dev, g++, pkg-config.

Lzop, lz4c — если интересуют альтернативные механизмы сжатия ядра и initramfs.

Предполагается, что текущей директорией является директория распакованного ядра.

После того, как подготовлено сборочное окружение, нужно сгенерировать конфигурацию ядра. Текущую конфигурацию можно посмотреть вот так:

cat /boot/config-`uname -r`

или так:

zcat /proc/config.gz

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

cp /boot/config-`uname -r` .config

Далее, выбрав одну из программ конфигурации: config, menuconfig, nconfig, xconfig, gconfig, подготовим будущую конфигурацию ядра.

Мне нравится xconfig, я нахожу его наиболее удобным.

make xconfig

Автоматически подгружается скопированный прежде .config, который служит нам базой для конфигурации. Советов по настройке ядра тьма, я лишь рекомендую выбрать свою версию процессора, отключить драйвера оборудования, которого нет, можно ещё выбрать дополнительные модули, такие как zram и алгоритм сжатия, я выбрал lz4, как самый быстрый.

После сохранения конфигурации, можно приступить к компиляции.

Если Вам лень конфигурировать ядро вручную, есть возможность выполнить автоматическое конфигурирование, используя информацию о загруженных модулях: make localmodconfig

Теперь второй главный этап — компиляция ядра и модулей. Выполняется в одну команду:

make -j4 CC='ccache gcc' bzImage modules

Где -j4 соответствует количеству процессорных ядер в Вашей конфигурации.

Компиляция займёт недолго, если железо достаточно мощное и не используется дистрибутивный конфиг ядра. На моем ноутбуке с процессором AMD Phenom P820 и шестью гигабайтами оперативной памяти, компиляция занимает около получаса.

Последний этап — установка ядра и модулей.

Перед установкой рекомендую внести изменения в /etc/initramfs-tools/initramfs.conf (актуально только для Debian based систем)

sudo sed -i.bak 's/MODULES=most/MODULES=dep/' /etc/initramfs-tools/initramfs.conf

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

Установку тоже можно выполнить одной командой:

sudo make modules_install install

Или же установить все вручную. Сначала модули

sudo make modules_install

Потом ядро

version=`awk 'NR<=3 {printf "%s.",$NF}' < Makefile | sed 's/\.$//'`

так мы узнаем версию ядра из файла Makefile

sudo cp arch/`uname -m`/boot/bzImage /boot/vmlinuz-$version
sudo cp .config /boot/config-$version
sudo cp System.map /boot/System.map-$version
sudo update-initramfs -c -k $version
sudo update-grub

Напоследок, прилагаю скрипт для автоматизации процесса.

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

Удачной компиляции.

comments powered by Disqus