3 Сборка ядра традиционным способом

Введение
Глава объясняет универсальный подход к сборке ядра, который применим к любой системе Linux. Метод не зависит от конкретного дистрибутива, поэтому вы не получите RPM-пакет ядра — вы получите готовый двоичный образ и initrd.
Короткое определение: ядро — это центральная часть ОС, управляющая аппаратурой и ресурсами системы.
3 Сборка ядра
Ниже шаги приведены в практической последовательности. Во всех примерах предполагается работа с каталогом /usr/src и правами root там, где требуется.
3.1 Скачивание исходников ядра
Мы загружаем желаемую версию ядра в /usr/src. Зайдите на www.kernel.org и выберите нужный tarball, например linux-2.6.18.2.tar.bz2 (все ядра 2.6 доступны по адресу http://www.kernel.org/pub/linux/kernel/v2.6/). Затем можно скачать архив так:
cd /usr/src
wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.18.2.tar.bz2
Распакуйте исходники и создайте символьную ссылку linux на каталог с исходниками:
tar xjf linux-2.6.18.2.tar.bz2
ln -s linux-2.6.18.2 linux
cd /usr/src/linux
Важно: проверяйте контрольные суммы tarball’а, если дистрибутив или зеркало их предоставляет. Это снижает риск повреждённой или скомпрометированной архивации.
3.2 Применение патчей к исходникам (опционально)
Иногда требуется добавить драйверы или экспериментальные фичи, которых нет в стабильном релизе. Тогда доступен отдельный патч (например patch.bz2 или patch-2.6.19-rc5.bz2). Применяйте патчи только к совместимым версиям исходников.
Пример применения патча (сначала сухой прогон, затем реальное применение):
bzip2 -dc /usr/src/patch.bz2 | patch -p1 --dry-run
bzip2 -dc /usr/src/patch.bz2 | patch -p1
Если dry-run выдаёт ошибки, не применяйте патч. Предварительно сохраните оригинальные исходники или работайте в копии.
Пример для предрелизного патча (prepatch): чтобы собрать 2.6.19-rc5, скачайте исходники 2.6.18 и примените patch-2.6.19-rc5.bz2, а не пытайтесь наложить патч на 2.6.18.2.
cd /usr/src
wget http://www.kernel.org/pub/linux/kernel/v2.6/testing/patch-2.6.19-rc5.bz2
cd /usr/src/linux
bzip2 -dc /usr/src/patch-2.6.19-rc5.bz2 | patch -p1 --dry-run
bzip2 -dc /usr/src/patch-2.6.19-rc5.bz2 | patch -p1
Примечание: prepatch’ы служат тестированию и могут не пройти в продакшн. Рассматривайте их как аналог альфа-версий.
3.3 Конфигурация ядра
Хорошая практика — взять конфигурацию текущего работающего ядра как основу. Скопируйте файл конфигурации из /boot:
make mrproper
cp /boot/config-`uname -r` ./.config
Затем запустите текстовую конфигурацию:
make menuconfig
Выберите Load an Alternate Configuration File и укажите .config (это конфигурация текущего работающего ядра). После редактирования пройдите Exit и при вопросе “Do you wish to save your new kernel configuration?” ответьте Yes.
Совет: если вы не уверены в параметре — оставьте текущую настройку. Для новых драйверов используйте опцию M (модуль), чтобы облегчить отладку.
3.4 Сборка и установка ядра
Запустите следующие команды для сборки и установки ядра:
make all
make modules_install
make install
Сборка может занять от нескольких минут до нескольких часов в зависимости от конфигурации и производительности процессора. Команда make install обычно создаёт initrd (ramdisk) и обновляет файл /boot/grub/menu.lst.
Отредактируйте /boot/grub/menu.lst и убедитесь, что новая запись находится вверху списка и параметр default установлен в 0, чтобы по умолчанию загружалось новое ядро:
vi /boot/grub/menu.lst
Пример содержимого menu.lst:
# grub.conf generated by anaconda
#
# Note that you do not have to rerun grub after making changes to this file
# NOTICE: You have a /boot partition. This means that
# all kernel and initrd paths are relative to /boot/, eg.
# root (hd0,0)
# kernel /vmlinuz-version ro root=/dev/VolGroup00/LogVol00
# initrd /initrd-version.img
#boot=/dev/sda
default=0
timeout=5
splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
title Fedora Core (2.6.18.2)
root (hd0,0)
kernel /vmlinuz-2.6.18.2 ro root=/dev/VolGroup00/LogVol00
initrd /initrd-2.6.18.2.img
title Fedora Core (2.6.18-1.2798.fc6)
root (hd0,0)
kernel /vmlinuz-2.6.18-1.2798.fc6 ro root=/dev/VolGroup00/LogVol00
initrd /initrd-2.6.18-1.2798.fc6.img
Перезагрузите систему:
shutdown -r now
Проверьте версию ядра после загрузки:
uname -r
Ожидаемый вывод примерно такой:
2.6.18.2
Если система не загружается, перезагрузите и, при появлении подсказки GRUB, нажмите любую клавишу для входа в меню загрузчика:
Выберите старое рабочее ядро и загрузитесь. Затем исправьте проблему в конфигурации или соберите ядро заново. Не забудьте удалить запись о неработающем ядре из /boot/grub/menu.lst.
Когда этот способ подходит, а когда нет
- Подходит: когда нужен контроль над опциями ядра, требуется патчирование, сборка модулей или экспериментальные фичи.
- Не подходит: если вы хотите простой, поддерживаемый пакетный образ ядра (RPM/DEB). В таких случаях пользуйтесь механизмами дистрибутива (rpmbuild, apt, DKMS) или готовыми пакетами.
Контрпример: для быстрого обновления безопасности на продакшн-сервере лучше использовать обновления дистрибутива с проверенными пакетами, а не ручную сборку локального ядра.
Альтернативные подходы
- Использовать дистрибутивные пакеты ядра (RPM/DEB). Это упрощает обновления и интеграцию с менеджером пакетов.
- Использовать DKMS для автоматической сборки модулей при смене ядра.
- Собирать ядро в контейнере или в chroot, чтобы сохранить чистоту основной системы.
Быстрая методология (SOP) для сборки ядра
- Подготовка: обновите систему, установите инструменты (gcc, make, ncurses-devel, bzip2, perl, bc). Сделайте резервную копию /boot и grub.cfg.
- Скачивание: поместите исходники в /usr/src.
- Подготовка исходников: распакуйте, создайте ссылку linux.
- Патчинг (опционально): dry-run, затем apply.
- Конфигурация: скопируйте /boot/config-
uname -r
и запустите make menuconfig. - Сборка: make all; make modules_install; make install.
- Обновление загрузчика: проверьте /boot/grub/menu.lst или /boot/grub2/grub.cfg.
- Тестирование: перезагрузите, проверьте uname -r, загрузите в rescue при необходимости.
Ролевые чек-листы
Администратор:
- Подготовить резервные копии /boot и конфигурации GRUB.
- Убедиться в наличии удалённого доступа (консоль/serial) для восстановления.
Разработчик/инженер интеграции:
- Проверить зависимости сборки.
- Запустить автотесты ядра и модулей.
Тестировщик:
- Проверить загрузку, сетевые интерфейсы, файловые системы и ключевые сервисы после загрузки.
- Протестировать загрузку с initrd и без него.
План действий при неудачной загрузке (runbook)
- Перезагрузите систему.
- На подсказке GRUB нажмите любую клавишу и выберите предыдущее рабочее ядро.
- После загрузки удалите или исправьте проблемную запись в /boot/grub/menu.lst.
- Проверьте логи /var/log/messages или systemd-journal для ошибок модулей и драйверов.
- Если проблема в конфигурации, вернитесь к конфигу и отключите экспериментальные опции.
- При необходимости собрать ядро с минимальным набором опций и постепенно добавлять функции.
Критерии приёмки
- Система успешно загружается с новым ядром.
- uname -r показывает ожидаемую версию.
- Критичные службы (SSH, сеть, диск) работают без ошибок.
- Модули, необходимые в системе, загружаются (lsmod / dmesg).
Тесты и сценарии приёмки
- Проверка версии: uname -r == ожидаемая
- Тест загрузки в rescue: система входит в rescue-режим без ошибок
- Тест модулей: insmod/depmod выполняются без конфликтов
- Нагрузочное тестирование: сервисы выдерживают рабочую нагрузку
Ментальные модели и эвристики
- «Модифицируй конфиг постепенно»: добавляйте опции по одной и тестируйте. Это снижает количество причин ошибок.
- «Модуль вместо встроенного драйвера»: если не уверены, поместите драйвер как модуль, чтобы можно было выгрузить его без перезагрузки.
- «Стабильность важнее новизны для сервера»: предпочитайте стабильные релизы для продакшна.
Безопасность и риски
Важно: запускайте экспериментальные ядра на тестовой станции, а не на критичных продакшн-серверах. Риски включают потерю доступа по сети, несовместимость модулей и повреждение конфигурации загрузчика.
Митигаторы:
- Всегда имейте доступ к физической или виртуальной консоли.
- Держите старое рабочее ядро в списке загрузки.
- Делайте резервные копии /boot и конфигураций grub.
Факты и быстрые числа
- Большинство сборок ядра на современном железе занимает от 10 минут до нескольких часов, в зависимости от количества включённых опций и ядер CPU.
- Резервное копирование /boot и grub занимает обычно менее 100 МБ.
Сравнение подходов (кратко)
- Ручная сборка: гибкость, контроль, ответственность за обновления.
- Дистрибутивная сборка: поддержка, простые обновления, меньше ручной работы.
- DKMS: удобство для внешних модулей, автоматическая пересборка при смене ядра.
Заключение
Сборка ядра вручную даёт полный контроль над функциями и драйверами, но требует осторожности и навыков. Следуйте пошаговой методологии, тестируйте на отдельной машине и держите путь отката готовым.
Ссылки
- Fedora: http://fedora.redhat.com
- Fedora Wiki: http://fedoraproject.org/wiki
- The Linux Kernel Archives: http://www.kernel.org
Похожие материалы

Очистить память iPhone без удаления приложений

WireGuard на CentOS 8: установка и настройка

Освободите 24 ГБ в Windows 10 после Threshold 2

Как работать курьером и обеспечить стабильный доход

Как очистить кэш в Microsoft Edge
