3. Сборка ядра традиционным способом
Введение
Этот раздел описывает альтернативный подход к сборке ядра, который можно применить на любой системе Linux. Здесь нет ничего специфичного для CentOS, поэтому в результате вы не получите пакет RPM — вы получите готовое ядро, установленное в /boot и добавленное в конфигурацию загрузчика (GRUB).
Важно: перед началом сделайте резервную копию важных данных и текущих конфигурационных файлов (/boot, /etc/grub/menu.lst или /boot/grub/grub.cfg, /etc/modprobe.conf и т. п.). По возможности выполняйте эксперимент в виртуальной машине или на тестовом хосте.
Содержание
- Скачивание исходников
- Правка /etc/modprobe.conf
- Применение патчей (опционально)
- Конфигурация ядра
- Сборка и установка
- Откат и отладка
- Чек-листы, методология и сценарии приёма
3.1 Скачивание исходников ядра
Обычно исходники помещают в /usr/src. Перейдите на https://www.kernel.org и выберите нужную версию, например linux-2.6.18.3.tar.bz2 (все ядра 2.6 доступны по адресу http://www.kernel.org/pub/linux/kernel/v2.6/). Затем скачайте в /usr/src:
cd /usr/src
wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.18.3.tar.bz2Распакуйте исходники и создайте символьную ссылку linux на каталог с исходниками:
tar xjf linux-2.6.18.3.tar.bz2
ln -s linux-2.6.18.3 linux
cd /usr/src/linuxСовет: если у вас медленное соединение, можно использовать rsync зеркала kernel.org или предварительно скачать архив на локальную машину и перенести.
3.2 Изменение /etc/modprobe.conf
Перед сборкой рекомендуется закомментировать модули, которые могут отсутствовать в новом дереве модулей, чтобы избежать предупреждений при установке модулей. Например, закомментируем модуль mptscsi в /etc/modprobe.conf:
vi /etc/modprobe.confСодержимое (пример):
| alias eth0 pcnet32 alias scsi_hostadapter mptbase # alias scsi_hostadapter1 mptscsi alias scsi_hostadapter2 mptfc alias scsi_hostadapter3 mptspi alias scsi_hostadapter4 mptsas alias scsi_hostadapter5 mptscsih |
Примечание: после успешной сборки вы можете вернуть строки обратно, если модуль существует и нужен.
3.3 Применение патчей к исходникам (опционально)
Иногда необходимы драйверы или функции, которые отсутствуют в основной ветке ядра. Если доступен патч, примените его к исходникам.
Пример: патч в /usr/src/patch.bz2
bzip2 -dc /usr/src/patch.bz2 | patch -p1 --dry-run
bzip2 -dc /usr/src/patch.bz2 | patch -p1Первая команда выполняет тест (не изменяет файлы). Если ошибок нет, выполните вторую команду для реального применения.
Если патч упакован в gzip (.gz):
gunzip -c /usr/src/patch.gz | patch -p1 --dry-run
gunzip -c /usr/src/patch.gz | patch -p1Пример применения prepatch (псевдо-альфа): если нужен функционал из 2.6.19-rc6, но полноценных исходников ещё нет, скачайте prepatch для 2.6.19-rc6 и примените его к исходникам 2.6.18:
cd /usr/src
wget http://www.kernel.org/pub/linux/kernel/v2.6/testing/patch-2.6.19-rc6.bz2
cd /usr/src/linux
bzip2 -dc /usr/src/patch-2.6.19-rc6.bz2 | patch -p1 --dry-run
bzip2 -dc /usr/src/patch-2.6.19-rc6.bz2 | patch -p1Совет: внимательно читайте сопроводительную документацию к патчу — некоторые prepatch зависят от конкретной трёхчастной версии.
3.4 Конфигурация ядра
Рекомендуется начать с существующей конфигурации рабочего ядра. Скопируйте файл конфигурации в каталог исходников:
make clean && make mrproper
cp /boot/config-`uname -r` ./.configЗатем запустите интерактивную конфигурацию:
make menuconfigВ меню конфигурации выберите Загрузить альтернативный файл конфигурации и укажите .config (файл с конфигурацией вашего текущего работающего ядра). Это ускорит настройку и снизит вероятность пропуска важных опций.


После прохождения меню и нажатия Exit вам предложат сохранить новую конфигурацию — ответьте Yes:

Советы по конфигурации:
- Если не уверены, используйте опцию M (модуль) для драйверов, которые не обязательны.
- Для дисковых контроллеров и файловых систем оставляйте поддержку, которая есть в текущем ядре, чтобы снизить риск загрузки без доступа к корневому разделу.
- Включайте отладку только при необходимости — это увеличивает объём бинарников и время компиляции.
3.5 Сборка и установка ядра
Для сборки и установки выполните эти команды:
make all
make modules_install
make installСтандартный цикл может занимать от нескольких минут до нескольких часов в зависимости от конфигурации и производительности процессора.
Команда make install обычно создаёт initramfs/initrd по умолчанию и обновляет конфигурацию загрузчика (в старых системах — /boot/grub/menu.lst).
Отредактируйте /boot/grub/menu.lst и убедитесь, что stanza для нового ядра стоит первой или что параметр 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 CentOS (2.6.18.3) root (hd0,0) kernel /vmlinuz-2.6.18.3 ro root=/dev/VolGroup00/LogVol00 initrd /initrd-2.6.18.3.img title CentOS (2.6.9-42.0.3.EL) root (hd0,0) kernel /vmlinuz-2.6.9-42.0.3.EL ro root=/dev/VolGroup00/LogVol00 initrd /initrd-2.6.9-42.0.3.EL.img title CentOS-4 i386 (2.6.9-42.EL) root (hd0,0) kernel /vmlinuz-2.6.9-42.EL ro root=/dev/VolGroup00/LogVol00 initrd /initrd-2.6.9-42.EL.img |
Перезагрузите систему:
shutdown -r nowПроверьте текущую версию ядра после загрузки:
uname -rОжидаемый вывод (пример):
2.6.18.3Откат и отладка при неудачной загрузке
Если система не стартует с новым ядром, при появлении экрана GRUB нажмите любую клавишу для входа в меню GRUB:


Выберите старое ядро и загрузитесь. После успешного старта:
- Удалите stanza неработающего ядра из /boot/grub/menu.lst.
- Проанализируйте причину падения: проверьте /var/log/messages, dmesg (в случае если система загрузилась в rescue), доступность модулей, initrd и параметры root= в GRUB.
Совет: храните копию старого initrd и vmlinuz перед удалением.
Чек-листы и роли
Чек-лист системного администратора
- Создана полная резервная копия /boot и важных конфигов
- Резервная копия системы или снимок VM
- Текущая конфигурация ядра скопирована в /usr/src/linux/.config
- Комментарии в /etc/modprobe.conf при необходимости
- Проверены зависимости модулей и initramfs
- GRUB настроен на возможность быстрого отката
Чек-лист разработчика/инженера ядра
- Проверены патчи и их применимость к версии исходников
- Выполнен –dry-run для всех patch команд
- Сборка отрабатывает без ошибок на тестовой машине
- Запущены unit/интеграционные тесты для критичных подсистем
Мини-методология сборки ядра (шаг за шагом)
- Подготовка окружения: обновите инструменты сборки (gcc, make, bc, ncurses-devel и т. п.).
- Скачивание исходников: положите их в /usr/src.
- (Опционально) Примените патчи с –dry-run.
- Скопируйте текущую конфигурацию в .config.
- Пройдите make menuconfig и сохраните.
- Соберите ядро (make all).
- Установите модули (make modules_install).
- Установите ядро (make install) и проверьте /boot и GRUB.
- Перезагрузите и проверьте uname -r.
- При проблемах — используйте старое ядро, исправьте конфигурацию и повторите.
Decision tree для решения, стоит ли собирать ядро вручную
flowchart TD
A[Нужна ли функция/драйвер в текущем ядре?] -->|Нет| B[Не требуется сборка]
A -->|Да| C[Есть ли собранный пакет/модуль от дистрибутива?]
C -->|Да| D[Установить готовый пакет]
C -->|Нет| E[Соответствует ли upstream kernel требуемой версии?]
E -->|Да| F[Скачать исходники и собрать]
E -->|Нет — нужен prepatch| G[Применить prepatch к предыдущей полной версии и собрать]
F --> H[Тестировать в VM/тестовой среде]
G --> H
H --> I{Загрузка успешна?}
I -->|Да| J[Внедрить в прод]
I -->|Нет| K[Откат и анализ ошибок]Быстрый шпаргалка (cheat sheet)
- Скачивание: wget http://www.kernel.org/pub/linux/kernel/vX.Y/linux-X.Y.Z.tar.bz2
- Распаковка: tar xjf linux-X.Y.Z.tar.bz2
- Применение патча: bzip2 -dc patch.bz2 | patch -p1
- Конфигурация: make menuconfig
- Сборка: make all
- Установка модулей: make modules_install
- Установка ядра: make install
- Проверка: uname -r
Критерии приёмки
- Система успешно загружается с новым ядром на тестовом хосте.
- Все критичные сервисы (SSH, сеть, файловые системы) работают после загрузки.
- Нет ошибок в логах, указывающих на отсутствующие драйвера для корневого тома.
- Если использовался модульный драйвер — он загружается автоматически или присутствует в /lib/modules/
uname -r.
Примеры, когда подход не подходит
- Если вам нужен управляемый пакет для централизированного развертывания (RPM/Deb), лучше собрать пакет вместо «голой» сборки.
- На системах с нестандартным загрузчиком (systemd-boot, UEFI с shim/secure boot) процесс установки и подписи ядра требует дополнительных шагов.
Альтернативные подходы
- Сборка пакета (.rpm, .deb) для удобного развёртывания и отката.
- Использование дистрибутивных backport-паков и готовых модулей.
- Использование живых образов/контейнеров для тестирования новых ядер без установки в /boot.
Безопасность и резервное копирование
- Подписывайте ядра на системах с Secure Boot или отключайте Secure Boot на время тестирования.
- Всегда сохраняйте старую конфигурацию GRUB и файлы vmlinuz/initrd.
- Ограничьте доступ к процессу сборки (права root) и проверяйте целостность исходников (GPG-подписи на kernel.org).
Краткая инструкция по откату (runbook)
- Если загрузка с новым ядром не проходит — перезагрузите и войдите в меню GRUB.
- Выберите предыдущую запись ядра и загрузитесь.
- Проверьте логи и исправьте ошибки конфигурации.
- Удалите проблемную запись из /boot/grub/menu.lst или обновите GRUB.
- Повторите сборку после исправлений.
Быстрый глоссарий (1 строка)
- initrd/initramfs — временная файловая система, загружаемая ядром для инициализации до монтирования корня;
- .config — файл конфигурации ядра;
- make menuconfig — текстовый интерфейс настройки опций ядра;
- patch/prepatch — изменения к исходникам ядра, иногда требуемые для новых функций.
Суммарные рекомендации
- Всегда тестируйте сборку в безопасной среде перед внедрением в прод.
- Используйте существующую конфигурацию как основу и применяйте опцию модулей для непроверенных драйверов.
- Храните резервные копии и план отката.
Ссылки
- CentOS: http://www.centos.org
- The Linux Kernel Archives: http://www.kernel.org
Важно: этот материал даёт практический пошаговый план — адаптируйте параметры под вашу архитектуру и версию дистрибутива.
Похожие материалы
Несколько аккаунтов Skype: Multi Skype Launcher
Журнал для работы: повысить продуктивность
Персональные звуки уведомлений на Android
Скачивание шоу Hulu для офлайн‑просмотра
Microsoft Start: персонализированная новостная лента