Внезапно, решил собрать и установить последнее стабильное ядро Linux в CentOS 6.4, ибо нет никаких причин этого не сделать. Также не видно ни одной причины, почему это может не заработать (ну, кроме кривых рук и/или идиотии, конечно). Итак, имеем CenOS 6.4 в роли поля для экспериментов:
[root@serv ~]# uname -a
Linux serv.lan 2.6.32-358.2.1.el6.x86_64 #1 SMP Wed Mar 13 00:26:49 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux
[root@serv ~]# cat /etc/redhat-release
CentOS release 6.4 (Final)
Возможно, в системе нет компилятора GCC, поэтому надо сперва установить его или вообще всю группу «Development tools». Также надо не забыть про калькулятор bc - скрипты сборки ядра его хотят:
[root@serv ~]# yum install gcc bc
или, соответственно:
[root@serv ~]# yum install bc
[root@serv ~]# yum groupinstall 'Development tools'
Также следует учесть, что сборка ядра потребует достаточно много места, распакованые исходники и собранное ядро с модулями у меня займёт 5.7 Гб, установка модулей в /lib/modules - ещё 1.2 Гб.
Итак, идём на
http://www.kernel.org/ и смотрим, какая там последняя стабильная версия ядра Linux. На момент написания этой статьи это было ядро 3.12.9 по адресу
https://www.kernel.org/pub/linux/kernel/v3.x/linux-3.12.9.tar.xz. Качаем его в какой-нить каталог:
[root@serv ~]# mkdir -p /usr/local/src
[root@serv ~]# cd /usr/local/src
[root@serv src]# wget
https://www.kernel.org/pub/linux/kernel/v3.x/linux-3.12.9.tar.xz
100%[======================================>] 76,397,560 2.1M/s in 36s
2066-66-66 66:66:66 (2.1 MB/s) - `linux-3.12.9.tar.xz' saved [76397560/76397560]
Далее распаковываем и очищаем перед сборкой (distclean - это ещё чище, чем mrproper, если кто понимает, о чём я):
[root@serv src]# tar -xf linux-3.12.9.tar.xz
[root@serv src]# cd linux-3.12.9
[root@serv linux-3.12.9]# make distclean
Далее хитрый хак. Так как устанавливать заново опции ядра мне лень и не нужно, берём конфиг от текущего ядра CentOS и все новые опции говорим устанавливать в дефолтные значения:
[root@serv linux-3.12.9]# cp /boot/config-2.6.32-358.2.1.el6.x86_64 .config
[root@serv linux-3.12.9]# make help
...skip...
Configuration targets:
oldconfig - Update current config utilising a provided .config as base
silentoldconfig - Same as oldconfig, but quietly, additionally update deps
olddefconfig - Same as silentoldconfig but sets new symbols to their default value
[root@serv linux-3.12.9]# make olddefconfig
HOSTCC scripts/basic/fixdep
HOSTCC scripts/kconfig/conf.o
SHIPPED scripts/kconfig/zconf.tab.c
SHIPPED scripts/kconfig/zconf.lex.c
SHIPPED scripts/kconfig/zconf.hash.c
HOSTCC scripts/kconfig/zconf.tab.o
HOSTLD scripts/kconfig/conf
scripts/kconfig/conf --olddefconfig Kconfig
.config:562:warning: symbol value 'm' invalid for PCCARD_NONSTATIC
# configuration written to .config
Теперь добавим уникальности и яркости в новое ядро, чтобы все, сцуко, знали, кто его собрал! Пишем в EXTRAVERSION после минуса и без пробелов чего захотим:
[root@serv linux-3.12.9]# vi Makefile
VERSION = 3
PATCHLEVEL = 12
SUBLEVEL = 9
EXTRAVERSION=-vladis
NAME = One Giant Leap for Frogkind
Далее, собственно, собираем ядро, модули и кладём их куда положено (и проверяем это). Это самый долгий этап, на слабом железе может занять несколько часов.
[root@serv linux-3.12.9]# make
[root@serv linux-3.12.9]# make modules_install
[root@serv linux-3.12.9]# cp arch/x86/boot/bzImage /boot/vmlinuz-3.12.9-vladis
[root@serv linux-3.12.9]# cp .config /boot/config-3.12.9-vladis
[root@serv linux-3.12.9]# ls /lib/modules/
2.6.32-358.2.1.el6.x86_64 3.12.9-vladis
Далее нам надо собрать начальный initrd или initramfs - это образ очень маленькой файловой системы, которую GRUB или другой загрузчик читает в память сразу после ядра и уже утилиты и модули из initrd обнаруживают настоящую корневую файловую систему и переключаются на неё. У каждого дистрибутива свой способ собирать initrd (включая дистрибутивы, которым он не нужен), инструкция выше подходит для любого дистрибутива, различия начинаются отсюда. В RHEL/CentOS 6 для сборки initramfs используется dracut. Опция -H создаёт значительно меньший initramfs, но только с драйверами нужными для загрузки конкретно этого сервера, для другого сервера с другим железом этот initramfs не подойдёт.
[root@serv ~]# dracut -f -H /boot/initramfs-3.12.9-vladis.img 3.12.9-vladis
[root@serv ~]# ls -lh /boot/initramfs-3.12.9-vladis.img /boot/vmlinuz-3.12.9-vladis
-rw-r--r-- 1 root root 5.1M Jan 66 66:66 /boot/initramfs-3.12.9-vladis.img
-rw-r--r-- 1 root root 4.2M Jan 66 66:66 /boot/vmlinuz-3.12.9-vladis
Далее надо добавить соответствующую запись о новом ядре и initramfs в загрузчик. Так как загрузчик у нас GRUB, то редактируем файл /boot/grub/grub.conf, добавим вот эту запись в конец. Разумеется, аргумент к команде root и параметры ядра на другом сервере могут быть (и будут) другие, их можно скопировать из предыдущей записи загрузчика.
[root@serv ~]# vi /boot/grub/grub.conf
title Linux Kernel 3.12.9-vladis
root (hd0,0)
kernel /vmlinuz-3.12.9-vladis ro root=/dev/mapper/sys-root LANG=en_US.UTF-8 rd_LVM_LV=sys/root rd_LVM_LV=sys/swap rd_NO_LUKS rd_NO_MD rd_NO_DM
initrd /initramfs-3.12.9-vladis.img
Наконец, волнительный момент - перезагрузка в новое ядро и проверка его версии:
[root@serv ~]# cat /etc/redhat-release
CentOS release 6.4 (Final)
[root@serv ~]# uname -a
Linux serv.lan 3.12.9-vladis #1 SMP Tue Jan 66 66:66:66 MSK 2066 x86_64 x86_64 x86_64 GNU/Linux
Тащемта, всё, допустим, сделано, например. Кто ниасилил или залип с какой-то ошибкой - тот криворукий идиот и/или неудачник.
Разумеется, есть более простые способы получить более-менее последнее ядро, например взять у кого-то, кто всё сделал для нас. Например, парни из
http://elrepo.org/ собирают последние mainline и long-term ядра для CentOS/RHEL 5 и 6. Посмотреть доступные ядра для, допустим, 64-битного CentOS 6 можно
прямо в репозитории. Чтобы установить одно из них, надо добавить gpg-ключ, установить пакет elrepo-release с сайта, разрешить репозиторий elrepo-kernel в файле /etc/yum.repos.d/elrepo.repo и установить, собственно, новое ядро как пакет kernel-ml (mainline) или kernel-lt (long-term). URL ниже валидны на момент написания статьи, используйте актуальные URL с сайта
http://elrepo.org/.
[root@serv ~]# rpm --import
https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
[root@serv ~]# rpm -Uvh
http://www.elrepo.org/elrepo-release-6-5.el6.elrepo.noarch.rpm
[root@serv ~]# cat /etc/yum.repos.d/elrepo.repo
...
[elrepo-kernel]
name=ELRepo.org Community Enterprise Linux Kernel Repository - el6
baseurl=
http://elrepo.org/linux/kernel/el6/$basearch/
mirrorlist=
http://elrepo.org/mirrors-elrepo-kernel.el6
enabled=1
...
[root@serv ~]# yum install kernel-ml
[root@serv ~]# reboot
...перезагрузка в новое ядро...
[root@serv ~]# uname -a
Linux serv.lan 3.13.3-1.el6.elrepo.x86_64 #1 SMP Fri Feb 66 66:66:66 MSK 2066 x86_64 x86_64 x86_64 GNU/Linux
Пыщь!
Оригинал поста размещен в блоге
Ад, ненависть и локалхост. Комментить?
Набигай. Подкат?
ОИНЧ.