Давно хотел написать статью о том, как собирать ядро 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.
Удачной компиляции.