Компиляция 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