Установка последнего стабильного ванильного ядра Linux на CentOS 6.4

Jan 28, 2014 00:55


Внезапно, решил собрать и установить последнее стабильное ядро 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
Пыщь! Оригинал поста размещен в блоге Ад, ненависть и локалхост. Комментить? Набигай. Подкат? ОИНЧ.
Previous post Next post
Up