Самым основным компонентом операционной системы Linux есть ядро. Именно ядро выступает промежуточным звеном между пользовательскими программами и оборудованием компьютера. Во всех бинарных дистрибутивах не нужно заботиться о сборке и настройке ядра, все уже сделали за нас разработчики дистрибутива. Но если вы хотите установить самую свежую версию ядра или настроить его под себя удалив от туда всё лишнее, вам придется собрать его вручную.
Раньше ядро собирали для того чтобы получить максимальную производительность от своего оборудования, но сейчас, учитывая стремительное увеличение мощности компьютеров увеличение производительности при сборке ядра совсем незаметно. Сейчас сборка ядра может понадобиться пользователям не бинарных дистрибутивов, таких как Gentoo, тем, кто хочет внести некоторые изменения в ядро, получить новую самую свежую версию ядра и, конечно, же тем, кто хочет полностью разобраться в работе своей системы. В этой статье мы рассмотрим как собрать ядро Linux на примере дистрибутива Ubuntu.
Сборка ядра Linux из исходников
Первая часть расскажет как настроить ядро в автоматическом режиме. Так сказать, для тех кто не хочет разбираться как оно работает, кому нужно лишь получить на выходе готовый продукт - собранное ядро. Во второй части мы рассмотрим основные этапы ручной настройки ядра, это процесс сложный, и не быстрый, но я попытаюсь дать основу, чтобы вы могли со всем разобраться сами.
1. Текущая версия ядра
Для того чтобы посмотреть текущую версию ядра, установленную в системе используйте такую команду:
uname -a
2. Установка необходимых пакетов
Для успешной сборки ядра необходимо убедится, что в вашей системе установлены все пакеты, нужные для сборки ядра и установить недостающие. Для этого выполните команду:
sudo apt install libncurses-dev libncurses dwarves build-essential gcc bc bison flex libssl-dev libelf-dev
После установки пакетов можно переходить к загрузке исходников ядра.
3. Получение исходников ядра
Исходники лучше брать с сайта вашего дистрибутива, если они там есть или официального сайта ядра: kernel.org. В этой статье будет рассмотрена загрузка исходников с kernel.org.
Перед тем как скачивать исходники нужно определиться с версией ядра которую надо собирать. Есть две основных версии релизов - стабильные (stable) и кандидаты в релизы (rc), есть, конечно, еще стабильные с длительным периодом поддержки (longterm), но важно сейчас разобраться с первыми двумя. Стабильные это, как правило, не самые новые, но зато уже хорошо протестированные ядра с минимальным количеством багов. Тестовые - наоборот, самые новые, но могут содержать различные ошибки.
Итак когда определились с версией зайдите на kernel.org и скачайте нужные исходники в формате tarball:
В этой статье будет использована самая новая на данный момент стабильная версия 5.13.7. Полученный с официального сайта архив необходимо распаковать. Для этого перейдите в папку загрузок и выполните команду распаковки:
cd ~/Загрузки/
tar xvf linux*
Затем нужно перейти в папку с распакованными исходниками ядра. Например, для версии 5.13.7 команда будет выглядеть вот так:
cd linux-5.13.7/
4. Текущая конфигурация ядра
Вы можете сами настраивать ядро с нуля, но это, скорее всего, займет очень много времени и точно не для новичков. Поэтому удобнее всего взять текущую конфигурацию ядра и использовать её в качестве базы для сборки нового. Во многих дистрибутивах конфигурация хранится в файле /proc/config.gz. Однако это будет работать только если была включена соответствующая опция ядра. Извлечь такую конфигурацию можно с помощью команды:
zcat /proc/config.gz > .config
Часто поддержка этой возможности отключена. Но в Ubuntu и других современных дистрибутивах, конфигурация ядра находится в папке /boot, в файле с названием config и версия ядра. Если у вас в системе установлено несколько ядер, то будет несколько конфигурационных файлов. Например, config-5.11.0-25-generic:
ls /boot
Для того чтобы скопировать этот конфигурационный файл в папку с исходниками выполните:
cp /boot/config-5.11.0-25-generic .config
5. Автоматическая конфигурация
Полученную конфигурацию необходимо актуализировать до состояния текущего ядра. В новых версиях ядра, обычно, добавляются новые опции, значений которых ещё нет в конфигурации ядра вашего дистрибутива. Для этого есть несколько скриптов. В этой статье будет рассмотрено только два: oldconfig и localmodulesconfig. Первый скрипт позволяет в интерактивном режиме заполнить новые поля конфигурации. Для его запуска в папке с исходниками ядра выполните:
make oldconfig
После запуска скрипта вам придется просмотреть все вопросы и ответить на них. Обычно скрипт советует как отвечать и в большинстве случаев можно оставить значение по умолчанию, но если вы сомневаетесь, то можно посмотреть какое значение стоит выбрать в Google. Особое внимание уделяйте пунктам, не отмеченным как NEW, такие настройки не новые и требуют вашего вмешательства.
После ответа на все вопросы можно переходить к следующему шагу. Однако, при таком способе конфигурации ядра останутся включёнными многие ненужные модули, а значит сборка займет много времени, много места на диске (до 20 Гб) и само ядро получится большого размера.
С помощью команды localmodulesconfig можно оптимизировать процесс. Это ответ на вопрос как собрать ядро Linux под свое железо проще всего. Она работает аналогично предыдущей, только в дополнение к этому проверяет какие модули ядра сейчас загружены и оставляет включёнными только их, сборку всех остальных отключает. Такое ядро соберется намного быстрее, да и вопросов, на которые надо будет ответить будет меньше.
make localmodulesconfig
Здесь обратите внимание на алгоритм сжатия модулей ядра. Лучше оставить без сжатия:
6. Ручная настройка ядра
После того как вы выполнили один из автоматических скриптов настройки ядра, вы можете захотеть настроить что-то дополнительно вручную. Для этого используется команда menuconfig. Она позволяет изменять настройки ядра в псвевдографическом меню. Для его запуска выполните:
make menuconfig
Для перемещения по меню используйте клавиши со стрелками вверх и вниз. Для включения или отключения функции нужно поставить на неё курсор и нажать у (включить), n (отключить), m (включить в виде модуля). Её можно использовать пробел или Enter для переключения состояния включено или выключено. Для открытия пункта конфигурации используйте Enter. Для перехода на уровень выше - Exit. Для перемещения между кнопками используйте стрелки вправо и влево. Всё это написано в окне меню:
Давайте рассмотрим несколько настроек. В разделе General Setup можно включить поддержку получения конфигурации из файла /proc/config.gz. Для этого найдите пункты Kernel .config support и Enable access to .config through /proc/config.gz и поставьте перед ними звездочку с помощью клавиши Enter.
По каждому пункту можно получить справку. Для этого выберите кнопку Help и нажмите Enter:
С помощью пункта Kernel compression mode вы можете выбрать способ сжатия образа ядра. Самый эффективный - LZMA:
Пункт Support for paging of anonymous memory (swap) позволяет включить поддержку подкачки:
Возвращайтесь назад с помощью кнопки Exit, а затем откройте пункт File systems. Здесь можно включить или отключить поддержку файловых систем. Убедитесь, что включена поддержка ext4 и ext3, а также можете включить Btrfs и F2FS:
Самый большой и сложный раздел - это Device drivers в главном меню. Здесь можно включить или отключить поддержку драйверов всех устройств которые поддерживает Linux. Именно в этом разделе вам придется внести большинство настроек если вы собираетесь уменьшить размер своего ядра и не хотите использовать localmodconfig. После завершения настройки нажмите кнопку Save и подтвердите сохранение в файл .config:
6. Сборка ядра и установка вручную
Если вы хотите установить ядро вручную достаточно выполнить такие команды последовательно для его сборки:
make
make modules
По умолчанию будет использоваться только одно ядро процессора. Вы можете ускорить сборку попросив программу использовать сразу несколько ядер с помощью опции -j. Например, для сборки в 8 потоков используйте такую команду:
make -j8
После завершения выполнения этих команд сборка ядра Linux будет завершена, дальше необходимо установить ядро. Для этого выполните:
make modules_install
Затем:
make install
Скрипт автоматически обновит конфигурацию Grub и вы сможете перезагрузить компьютер и получить новое ядро:
Но прежде чем идти дальше, давайте рассмотрим ещё один способ сборки ядра.
7. Сборка пакета для Ubuntu
Описанный выше способ установки не очень удобный, поскольку если вы захотите удалить ядро, вам придется это делать вручную. Вместо этого вы можете собрать пакет для своего дистрибутива и установить его с помощью пакетного менеджера. Для сборки deb пакета выполните такую команду:
make deb-pkg
После завершения сборки ядра Linux пакеты появятся на каталог выше каталога с исходниками:
Для установки этих пакетов достаточно выполнить такую команду:
sudo dpkg -i ../*.deb
Затем вы можете перезагрузить компьютер и убедиться, что теперь используется новое ядро:
Для удаления ядра, установленного таким способом достаточно загрузится с другим ядром и удалить пакеты ядра из системы. Например, для этой версии команда будет выглядеть так:
sudo apt remove linux-headers-5.13.7 linux-image-5.13.7 linux-image-5.13.7-dbg linux-libc-dev
Что делать если ядро не загружается
Если по каким-либо причинам собранное только что ядро не загружается, то ничего страшного ещё не произошло. Вы можете загрузиться со старым ядром и начать всё сначала или удалить новое ядро и продолжить использовать систему со старым ядром. Для этого в меню Grub необходимо выбрать пункт Дополнительные параметры, а потом нужную версию ядра, например: 5.11.0.25:
Если меню Grub не отображается, попробуйте зажать перед загрузкой операционной системы клавишу Shift. После авторизации в системе вы можете удалить новое ядро с помощью пакетного менеджера, если использовали его для установки или вручную. Для удаления вручную следует удалить файлы ядра из папки /boot. Например:
sudo rm /boot/vmlinuz-5.13.7
sudo rm /boot/config-5.13.7
sudo rm /boot/initrd.img-5.13.7
sudo rm /boot/System.map-5.13.7
sudo rm -Rf /lib/modules/5.13.7/
А затем необходимо обновить конфигурацию Grub:
sudo update-grub2
После этого в вашей системе останутся только старые ядра.
Выводы
Вот и все. В этой статье мы подробно рассмотрели выполняется сборка ядра Linux из исходников. Это будет полезно всем желающим лучшие понять свою систему, и тем, кто хочет получить самую новую версию ядра в своей системе. Если остались вопросы, задавайте комментарии!