Если помните, не так давно мы научились собирать из исходников ядро FreeBSD . Спрашивается, почему бы не научиться делать то же самое и с ядром Linux? Причины собирать ядро Linux из исходников, в общем то, те же — получение самой свежей версии ядра, срочное применение security-патчей, оптимизация под конкретные задачи и конкретное железо, а также желание принятие участие в разработке ядра.
Важно! Следование инструкциям из этого поста может привести к потере ваших данных. Делайте бэкапы и помните, что делаете вы все исключительно на свой страх и риск. Все описанное ниже было проверено на Ubuntu 14.04 LTS. Но на других версиях Ubuntu, а также других дистрибутивах Linux, отличия должны быть минимальными.
Настраиваем загрузчик
Правим /etc/default/grub примерно таким образом:
# 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 = «»
После правки говорим:
В результате перед загрузкой системы в течение 10 секунд будет предлагаться выбрать ядро, с которым вы хотите загрузиться. Очень удобно, если вы что-то напутали с конфигурацией ядра и хотите загрузиться с предыдущей версией!
Ставим зависимости
Нам понадобятся как минимум следующие пакеты:
libncurses5-dev libssl-dev
На многих системах все они, впрочем, уже будут присутствовать.
Получаем исходники
Исходники ядра можно скачать по ссылке на главной странице kernel.org . На момент написания этих строк последней стабильной версией ядра была 4.6.4:
tar —xz -xvf linux-4.6.4.tar.xz
cd linux-4.6.4
Или, если вам нужен самый-самый свежак, можно взять исходники прямо из Git :
git clone ‘git://git.kernel.org/pub/scm/linux/kernel/git/’
‘torvalds/linux.git’
cd linux
Судя по тому, что тэга v4.6.4 в Git’е мне найти не удалось, релизы ядра Linux оформляются исключительно в форме сжатых tar-архивов.
Если же вместо ванильного ядра вы хотели бы собрать ядро с патчами от компании Canonical:
cd ubuntu-trusty
git tag | less
git checkout Ubuntu-lts-4.4.0- 31.50 _14.04.1
По своему опыту скажу, что если вы пользуетесь Ubuntu, то можете смело использовать ванильное ядро. Вряд ли у вас возникнут с ним какие-то проблемы.
Примечание: Интересно, что из существующих сравнительно популярных дистрибутивов Linux ядро без собственных патчей, похоже, используют только Gentoo, Slackware и Arch Linux .
Так или иначе, теперь у вас есть исходники.
Собираем и устанавливаем ядро
Выбираем опции, с которыми будет собрано ядро:
В случае необходимости меняем настройки, жмем Save, затем Exit. В результате будет создан файл .config
, содержащий выбранные нами параметры.
При обновлении ядра (вы же по-любому уже используете какое-то ядро?) удобно взять конфиг текущего ядра, и выставить новым опциям значения по умолчанию:
make olddefconfig
Наконец, собираем:
Собирается ядро довольно долго. На моем ноутбуке сборка заняла 1 час 15 минут. Однако из этого времени б о льшая часть тратится на сборку гигантского пакета ядра с отладочными символами. Сборку этого пакета можно отключить, закомментировав в конфиге параметр CONFIG_DEBUG_INFO. Только учтите, что этот пакет требуется SystemTap и другим полезным инструментам .
Помимо самого ядра также можно собрать и документацию:
make htmldocs
chromium-browser Documentation / DocBook / index.html
По окончании сборки в дочернем каталоге видим что-то вроде:
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-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 .