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-default2.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Если система не запускается, перезагрузите ее, и когда вы увидите это:
 нажмите любую клавишу, чтобы войти в меню GRUB:
Выберите ваше старое ядро и запустите систему. Теперь вы можете попробовать снова скомпилировать работающее ядро. Не забудьте удалить стanzas неработающего ядра из /boot/grub/menu.lst.
Get new posts in your inbox
No spam. Unsubscribe anytime.