CentOS · 7 min read · Nov 09, 2025

Как скомпилировать ядро - по способу CentOS

Как скомпилировать ядро - по способу CentOS

Версия 1.0
Автор: Фалько Тимме

Каждое дистрибутив имеет свои специфические инструменты для сборки пользовательского ядра из исходников. Эта статья посвящена компиляции ядра на системах CentOS. В ней описывается, как собрать пользовательское ядро, используя последние немодифицированные исходники ядра с www.kernel.org (ванильное ядро), чтобы вы были независимы от ядер, поставляемых вашим дистрибутивом. Также показывается, как патчить исходники ядра, если вам нужны функции, которых там нет.

Я протестировал это на CentOS 4.4.

Прежде всего, хочу сказать, что это не единственный способ настройки такой системы. Существует множество способов достижения этой цели, но это тот путь, который я выбираю. Я не даю никаких гарантий, что это сработает для вас!

1 Предварительная заметка

В этой статье я опишу два способа сборки ядра для систем CentOS. Первый способ позволит вам получить пакет ядра rpm, который вы можете установить или поделиться с другими. Второй способ одинаков для всех дистрибутивов Linux, но вы не получите пакет rpm.

2 Сборка пакета ядра rpm

Эта глава показывает, как собрать ядро и получить пакет rpm, который вы можете установить и поделиться с другими.

2.1 Скачивание исходников ядра

Сначала мы скачиваем желаемое ядро в /usr/src. Перейдите на 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

2.2 Изменение /etc/modprobe.conf

Теперь мы должны закомментировать модуль mptscsi в /etc/modprobe.conf, потому что в противном случае мы получим ошибку, подобную этой:

No module mptscsi found for kernel 2.6.18.3-default, aborting.

когда мы попытаемся создать ramdisk для нашего нового ядра.

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 |

2.3 Применение патчей к исходникам ядра (по желанию)

Иногда вам нужны драйверы для оборудования, которое не поддерживается новым ядром по умолчанию, или вам нужна поддержка технологий виртуализации или какой-то другой передовой технологии, которая еще не попала в ядро. Во всех этих случаях вам нужно патчить исходники ядра (при условии, что патч доступен…).

Теперь предположим, что вы скачали необходимый патч (в этом примере я называю его patch.bz2) в /usr/src. Вот как вы применяете его к своим исходникам ядра (вы все еще должны находиться в директории /usr/src/linux):

bzip2 -dc /usr/src/patch.bz2 | patch -p1 –dry-run
bzip2 -dc /usr/src/patch.bz2 | patch -p1

Первая команда просто тест, она ничего не делает с вашими исходниками. Если она не показывает ошибок, вы можете запустить вторую команду, которая фактически применяет патч. Не делайте этого, если первая команда показывает ошибки!

Если ваши патчи сжаты с помощью gzip (.gz) вместо bzip2 (.bz2), тогда вы патчите свое ядро следующим образом:

gunzip -c /usr/src/patch.gz | patch -p1 –dry-run
gunzip -c /usr/src/patch.gz | patch -p1

Вы также можете применять предварительные патчи к своим исходникам ядра. Например, если вам нужна функция, которая доступна только в ядре 2.6.19-rc6, но полные исходники еще не были выпущены для этого ядра. Вместо этого доступен patch-2.6.19-rc6.bz2. Вы можете применить этот патч к исходникам ядра 2.6.18, но не к ядру 2.6.18.1 или 2.6.18.2 или 2.6.18.3 и т.д. Это объясняется на http://kernel.org/patchtypes/pre.html:

Предварительные патчи эквивалентны альфа-релизам для Linux; они находятся в тестовых директориях в архивах. Их следует применять с помощью утилиты patch(1) к исходному коду предыдущего полного релиза с трехчастным номером версии (например, предварительный патч 2.6.12-rc4 следует применять к исходникам ядра 2.6.11, а не, например, 2.6.11.10.)

Итак, если вы хотите скомпилировать ядро 2.6.19-rc6, вы должны скачать исходники ядра 2.6.18 (http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.18.tar.bz2) на шаге 2.1 вместо ядра 2.6.18.3!

Вот как вы применяете патч 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

2.4 Настройка ядра

Хорошей идеей будет использовать конфигурацию вашего текущего рабочего ядра в качестве основы для вашего нового ядра. Поэтому мы копируем существующую конфигурацию в /usr/src/linux:

make clean && make mrproper
cp /boot/config-uname -r ./.config

Затем мы запускаем

make menuconfig

что открывает меню конфигурации ядра. Перейдите в Загрузить альтернативный файл конфигурации и выберите .config (который содержит конфигурацию вашего текущего рабочего ядра) в качестве файла конфигурации:

Затем просмотрите меню конфигурации ядра и сделайте свои выборы. Убедитесь, что вы указали строку идентификации версии ядра в разделе Общие настройки —> () Локальная версия - добавьте к выпуску ядра. Я использую -default, чтобы наш пакет ядра rpm назывался kernel-2.6.18.3default-1.i386.rpm. Вы можете оставить строку пустой или указать другую, которая поможет вам идентифицировать ядро (например, -custom или что-то еще, что вам нравится).

Пожалуйста, обратите внимание: После того, как вы установили kernel-2.6.18.3default-1.i386.rpm и решили скомпилировать другой пакет ядра 2.6.18.3, важно использовать другую строку версии, например, -default1, -default2 и т.д., потому что в противном случае вы не сможете установить ваше новое ядро, потому что rpm жалуется, что kernel-2.6.18.3default-1.i386.rpm уже установлен!

Когда вы закончите и выберете Выход, ответьте на следующий вопрос (Хотите ли вы сохранить вашу новую конфигурацию ядра?) Да:

2.5 Сборка ядра

Чтобы собрать ядро, просто выполните эту команду:

make rpm

Теперь будьте терпеливы, компиляция ядра может занять несколько часов, в зависимости от вашей конфигурации ядра и скорости вашего процессора.

2.6 Установка нового ядра

После успешной сборки ядра был создан пакет src.rpm и пакет rpm. Пакет src.rpm можно найти в директории /usr/src/redhat/SRPMS/, вы можете узнать его имя, выполнив

ls -l /usr/src/redhat/SRPMS/

На моей системе он назывался kernel-2.6.18.3default-1.src.rpm.

Пакет rpm можно найти в /usr/src/redhat/RPMS/i386/, /usr/src/redhat/RPMS/i586/, /usr/src/redhat/RPMS/i686/, /usr/src/redhat/RPMS/x86_64/ и т.д., в зависимости от вашей архитектуры. На моей системе он находился в /usr/src/redhat/RPMS/i386/, и выполнив

ls -l /usr/src/redhat/RPMS/i386/

я узнал, что его имя было kernel-2.6.18.3default-1.i386.rpm.

Теперь мы можем установить наш пакет ядра rpm следующим образом:

cd /usr/src/redhat/RPMS/i386/
rpm -ivh –nodeps kernel-2.6.18.3default-1.i386.rpm

Пожалуйста, обратите внимание на переключатель –nodeps: если вы не используете его, вы увидите ошибку, подобную этой:

error: Failed dependencies:
kernel >= 2.6.10 conflicts with lksctp-tools-1.0.2-6.4E.1.i386

Я обнаружил, что игнорирование этой зависимости не вызвало никаких проблем на моей системе.

Теперь вы даже можете перенести пакет ядра rpm на другие системы CentOS и установить его там точно так же, что означает, что вам не нужно снова компилировать ядро там.

Далее мы создаем ramdisk для нашего нового ядра, потому что в противном случае система, скорее всего, не загрузит наше новое ядро:

mkinitrd /boot/initrd-2.6.18.3-default.img 2.6.18.3-default

2.7 Настройка загрузчика GRUB

Теперь мы должны настроить наш загрузчик GRUB, чтобы наше новое ядро загружалось при перезагрузке системы.

Запустите

ls -l /boot

чтобы узнать о вашем новом ядре (обычно начинается с vmlinuz, например, vmlinuz-2.6.18.3-default) и ramdisk (обычно начинается с initrd, например, initrd-2.6.18.3-default.img).

Затем отредактируйте /boot/grub/menu.lst. Посмотрите на ваши существующие (рабочие) стanzas там и возьмите одну из них в качестве образца для вашей новой стanzas и замените ядро и ramdisk, затем добавьте стanzas выше всех других стanzas.

vi /boot/grub/menu.lst

Например, мой menu.lst выглядит так до того, как я добавлю новую стanzas:

| # grub.conf сгенерирован anaconda # # Обратите внимание, что вам не нужно повторно запускать grub после внесения изменений в этот файл # УВЕДОМЛЕНИЕ: У вас есть раздел /boot. Это означает, что # все пути к ядру и initrd относительны к /boot/, т.е. # 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.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 |

и вот так после:

| # grub.conf сгенерирован anaconda # # Обратите внимание, что вам не нужно повторно запускать grub после внесения изменений в этот файл # УВЕДОМЛЕНИЕ: У вас есть раздел /boot. Это означает, что # все пути к ядру и initrd относительны к /boot/, т.е. # 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-default) root (hd0,0) kernel /vmlinuz-2.6.18.3-default ro root=/dev/VolGroup00/LogVol00 initrd /initrd-2.6.18.3-default.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-default

Если система не запускается, перезагрузите ее, и когда вы увидите это:

![](/files/dc3a6f2d-b1a7-426d-bf0f-e8f3f6c15739.png) 

нажмите любую клавишу, чтобы войти в меню GRUB:

![](/files/38e75d67-5999-4269-bad4-c4ae566c059f.png)

Выберите ваше старое ядро и запустите систему. Теперь вы можете попробовать снова скомпилировать работающее ядро. Не забудьте удалить стanzas неработающего ядра из /boot/grub/menu.lst.

Share: X/Twitter LinkedIn

Get new posts in your inbox

No spam. Unsubscribe anytime.