linux-kernel-build/

Если помните, не так давно мы научились собирать из исходников ядро 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:

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

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

EnglishRussianUkrainian