Памятка по сборке ядра Linux из исходного кода

10 августа 2016

Если помните, не так давно мы научились собирать из исходников ядро FreeBSD. Спрашивается, почему бы не научиться делать то же самое и с ядром Linux? Причины собирать ядро Linux из исходников, в общем то, те же — получение самой свежей версии ядра, срочное применение security-патчей, оптимизация под конкретные задачи и конкретное железо, а также желание принятие участие в разработке ядра.

Важно! Следование инструкциям из этого поста может привести к потере ваших данных. Делайте бэкапы и помните, что делаете вы все исключительно на свой страх и риск. Все описанное ниже было проверено на Ubuntu 14.04 LTS. Но на других версиях Ubuntu, а также других дистрибутивах Linux, отличия должны быть минимальными.

Настраиваем загрузчик

Правим /etc/default/grub примерно таким образом:

GRUB_DEFAULT=0
# GRUB_HIDDEN_TIMEOUT=10
# GRUB_HIDDEN_TIMEOUT_QUIET=true
GRUB_TIMEOUT=10
GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian`
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
GRUB_CMDLINE_LINUX=""

После правки говорим:

sudo update-grub

В результате перед загрузкой системы в течение 10 секунд будет предлагаться выбрать ядро, с которым вы хотите загрузиться. Очень удобно, если вы что-то напутали с конфигурацией ядра и хотите загрузиться с предыдущей версией!

Ставим зависимости

Нам понадобятся как минимум следующие пакеты:

sudo apt-get install git gcc make bc fakeroot dpkg-dev \
  libncurses5-dev libssl-dev

На многих системах все они, впрочем, уже будут присутствовать.

Получаем исходники

Исходники ядра можно скачать по ссылке на главной странице kernel.org. На момент написания этих строк последней стабильной версией ядра была 4.6.4:

wget https://www.kernel.org/pub/linux/kernel/v4.x/linux-4.6.4.tar.xz
tar --xz -xvf linux-4.6.4.tar.xz
cd linux-4.6.4

Или, если вам нужен самый-самый свежак, можно взять исходники прямо из Git:

# Mirror: https://github.com/torvalds/linux
git clone 'git://git.kernel.org/pub/scm/linux/kernel/git/'\
'torvalds/linux.git'
cd linux

Судя по тому, что тэга v4.6.4 в Git’е мне найти не удалось, релизы ядра Linux оформляются исключительно в форме сжатых tar-архивов.

Если же вместо ванильного ядра вы хотели бы собрать ядро с патчами от компании Canonical:

git clone git://kernel.ubuntu.com/ubuntu/ubuntu-trusty.git
cd ubuntu-trusty
git tag | less
git checkout Ubuntu-lts-4.4.0-31.50_14.04.1

По своему опыту скажу, что если вы пользуетесь Ubuntu, то можете смело использовать ванильное ядро. Вряд ли у вас возникнут с ним какие-то проблемы.

Примечание: Интересно, что из существующих сравнительно популярных дистрибутивов Linux ядро без собственных патчей, похоже, используют только Gentoo, Slackware и Arch Linux.

Так или иначе, теперь у вас есть исходники.

Собираем и устанавливаем ядро

Выбираем опции, с которыми будет собрано ядро:

make menuconfig

В случае необходимости меняем настройки, жмем Save, затем Exit. В результате будет создан файл .config, содержащий выбранные нами параметры.

При обновлении ядра (вы же по-любому уже используете какое-то ядро?) удобно взять конфиг текущего ядра, и выставить новым опциям значения по умолчанию:

zcat /proc/config.gz > ./.config
make olddefconfig

Наконец, собираем:

make -j4 bindeb-pkg LOCALVERSION=-custom

Собирается ядро довольно долго. На моем ноутбуке сборка заняла 1 час 15 минут. Однако из этого времени большая часть тратится на сборку гигантского пакета ядра с отладочными символами. Сборку этого пакета можно отключить, закомментировав в конфиге параметр CONFIG_DEBUG_INFO. Только учтите, что этот пакет требуется SystemTap и другим полезным инструментам.

Помимо самого ядра также можно собрать и документацию:

# еще есть `make pdfdocs` и другие, см `make help`
make htmldocs
chromium-browser Documentation/DocBook/index.html

По окончании сборки в дочернем каталоге видим что-то вроде:

linux-firmware-image-4.4.13-custom_4.4.13-custom-1_amd64.deb
linux-headers-4.4.13-custom_4.4.13-custom-1_amd64.deb
linux-image-4.4.13-custom_4.4.13-custom-1_amd64.deb
linux-image-4.4.13-custom-dbg_4.4.13-custom-1_amd64.deb
linux-libc-dev_4.4.13-custom-1_amd64.deb

Ставим все deb-пакеты кроме dbg-версии ядра обычным sudo dpkg -i и перезагружаемся. После перезагрузки смотрим на вывод команды uname -a. Убеждаемся, что действительно загрузились с новым ядром. Если с новым ядром что-то не так, в загрузчике просто выбираем то, с которым система загружалась до этого. После загрузки со старым ядром поскорее удаляем пакеты нового ядра, и вуаля — система вернулась к прежнему состоянию.

Дополнительно после загрузки нового ядра можно прогнать на нем тесты:

sudo make kselftest
sudo make kselftest-clean

Поздравляю, теперь вы умеете собирать ядро Linux!

Заключение

Материалы по внутреннему устройству ядра Linux:

  • KernelNewbies.org, сайт для новичков в ядре Linux со своим списком рассылки, IRC-каналом, форумом, вики, и так далее;
  • LKML.org, сайт для комфортного чтения мейлинг листа разработчиков ядра Linux через браузер. Будьте внимательны, он нередко портит форматирование писем! В этом смысле архив рассылки на marc.info намного лучше;
  • Linux Cross Reference, сайт для комфортного чтения кода ядра Linux через браузер;
  • Книга Linux Kernel Development, 3rd Edition является наиболее свежей книгой по ядру Linux на английском языке (2010 год, ядро 2.6.x), есть перевод на русский язык;
  • Книга Linux-Treiber entwickeln, 4th Edition более свежая (2015 год, ядро 4.x), но написана на немецком и не имеет перевода;
  • Бесплатная книга Linux Insides за авторством Alexander Kuleshov a.k.a @0xAX выглядит наиболее доступной и актуальной, но на данный момент еще находится в процессе написания;
  • Иногда что-то полезное удается найти в Linux Kernel HTML Documentation, официальной документации из исходников ядра Linux;
  • Примеры к книге Linux Device Drivers, 3rd Edition, которые пытаются поддерживать в актуальном состоянии, плюс исходники к 4-му изданию, которое на данный момент еще пишется;

А собираете ли вы ядро из исходников, и если да, то зачем? :)

Дополнение: Вас также могут заинтересовать статьи Скандальная правда об отладке ядерного кода в Linux и Основы написания модулей ядра в Linux.

Метки: , .


Вы можете прислать свой комментарий мне на почту, или воспользоваться комментариями в Telegram-группе.