Установка Linux kernel 5.2 на CentOS 6


Компиляция Linux kernel 5.2 на CentOS 6 из исходников

Так как CentOS 6 перестал поддерживаться Elrepo kernel-ml, то единственный вариант поставить ядро пятой версии — это компилировать самому. Для этого установим следующие пакеты:

#yum install flex git nano
#yum groupinstall "Development Tools"
#yum install ncurses-devel
#yum install qt3-devel
#yum install hmaccalc zlib-devel binutils-devel elfutils-libelf-devel
#yum install rpm-build bison
#yum install libmpc-devel libmpc libmpcdec
#yum install centos-release-scl --enablerepo=centos-extras-unverified
#yum install devtoolset-8 --enablerepo=centos-sclo*

Сборку kernel рекомендуется делать с правами обычного пользователя. Создаём папку, в которой будем компилировать:

$mkdir -p ~/rpmbuild/{BUILD,BUILDROOT,SOURCES,RPMS,SRPMS,SPECS} && cd ~/rpmbuild/SOURCES

Скачиваем последнюю версию ядра:

$git clone https://github.com/torvalds/linux

Копируем config файл запущенного ядра:

$cd linux
$cp /boot/config-`uname -r` .config

Конфигурируем ядро с сохранением настроек и добавлением новых (1) и правим (2), например, отключаем всё лишнее оборудование, которого нет на компьютере и не будет никогда (make menuconfig с GNU Make 3.81 не запускается с gcc версии выше 6-ой, для работы с более новой версией gcc нужно установить devtools-8-make пакет):

$make oldconfig
$make menuconfig

Проверяем сценарий компиляции:

$make prepare

Если не появились ошибки, то набираем make:

$make

Если получаем сообщение о том, что gcc старой версии, то обновить можно его следующим образом: устанавливаем репозиторий centos-release-scl (1), пакет devtoolset-8 (2) и активируем среду разработки devtoolset-8 (3), в котором и есть gcc новой версии (можно установить только devtoolset-8-gcc).

#yum install centos-release-scl --enablerepo=centos-extras-unverified
#yum install devtoolset-8 --enablerepo=centos-sclo* (или yum install devtoolset-8-gcc --enablerepo=centos-sclo*)
#scl enable devtoolset-8 bash (или #source /opt/rh/devtoolset-8/enable)

После завершения компиляции запускаем установку:

#make modules_install install

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

Создание rpm и установка

Выполняем все предыдущие этапы, включая make, чтоб понять не возникает ли ошибка на этапе компиляции. Затем находим и скачиваем kernel.spec (например из ELREPO). Желательно скачать *.spec для самого нового ядра нашего репозитория. Правим файл kernel.spec под наши нужды, если не знаем как править, то запускаем команду и по логам определяем какая ошибка и устраняем. Обычно не хватает каких-то файлов или ссылка на файл неправильно воспринимается компилятором или указано в spec файле. Также ошибка может быть связано с недостающими пакетами. Ошибки будут в файле ~/rpmbuild/build-err.log.

$cd ~/rpmbuild
$rpmbuild -ba --target=`uname -m` ./SPECS/kernel.spec 2> ./build-err.log | tee ./build-out.log

Где:
—target=`uname -m` — платформа;
-ba — сборка бинарника и исходника, -bb — только бинарника, -bs — только исходника;
./SPECS/kernel.spec — нужный нам *.spec файл;
2> ./build-err.log | tee ./build-out.log — запись логов сборки (лог ошибки и самого процесса сборки).

При ошибке

Installed (but unpackaged) file(s) found:
/usr/lib/perf/examples/bpf/5sec.c
/usr/lib/perf/examples/bpf/augmented_raw_syscalls.c
/usr/lib/perf/examples/bpf/augmented_syscalls.c
/usr/lib/perf/examples/bpf/empty.c
/usr/lib/perf/examples/bpf/etcsnoop.c
/usr/lib/perf/examples/bpf/hello.c
/usr/lib/perf/examples/bpf/sys_enter_openat.c
/usr/lib/perf/include/bpf/bpf.h
/usr/lib/perf/include/bpf/linux/socket.h
/usr/lib/perf/include/bpf/pid_filter.h
/usr/lib/perf/include/bpf/stdio.h
/usr/lib/perf/include/bpf/unistd.h
/usr/share/doc/perf-tip/tips.txt

Добавляем все перечисленные файлы с расширением txt и README в секцию %doc файла kernel.spec, остальные после %files или %files -n python-perf (т.е. строкой ниже)

%doc /usr/share/doc/perf-tip/tips.txt

%files -n python-perf
/usr/lib/perf/examples/bpf/5sec.c
/usr/lib/perf/examples/bpf/augmented_raw_syscalls.c
/usr/lib/perf/examples/bpf/augmented_syscalls.c
/usr/lib/perf/examples/bpf/empty.c
/usr/lib/perf/examples/bpf/etcsnoop.c
/usr/lib/perf/examples/bpf/hello.c
/usr/lib/perf/examples/bpf/sys_enter_openat.c
/usr/lib/perf/include/bpf/bpf.h
/usr/lib/perf/include/bpf/linux/socket.h
/usr/lib/perf/include/bpf/pid_filter.h
/usr/lib/perf/include/bpf/stdio.h
/usr/lib/perf/include/bpf/unistd.h

После завершения компиляции в папке ~/rpmbuild/RPMS и ~/rpmbuild/SRPMS появятся бинарники и исходник.

Для установки набираем:

#yum localinstall ./RPMS/kernel-lt-5.2.0-1.el6.x86_64.rpm

Открываем файл grub.conf и в строке default=Х пишем номер нашего ядра (нумерация начинается с 0):

#nano /boot/grub/grub.conf

Перезапускаем систему:

#reboot

Если нужно перекомпилировать только определённый модуль, например, intel WiFi (1) или Qualcom Atheros WiFi (2), используем следующую команду:

$make M=drivers/net/wireless/intel
$make M=drivers/net/wireless/ath
Поделиться в: