среда, 19 февраля 2014 г.

Пересобираем ядро для RHEL-like систем














А вот даже и не вспомню как давно приходилось пересобирать ядро Linux. Прошли те времена, когда с каждым новым релизом, устранялась какая-нибудь неприятная бага, или появлялась жизненно важная фича. Как правило всё работает из коробки, и нет числа новым адептам, праздно, без напильника, настраивающих свой свеженький Linux. Но всё же встречаются моменты когда приходится собирать кастомное ядро. Если у вас именно этот случай, тогда приступим.

Поскольку пересборку мне пришлось устраивать на RHEL-like системе, её то я и буду описывать.

Иногда, когда в одной системе нужно присовокупить к Enterprise системе Experemental фичи, приходится брать компилятор.

Нусс... приступим.
В моём случае и source и target системы являются Scientific Linux'ами, хотя, в принципе, между всеми RHEL'ами одной ветки должна быть бинарная совместимость. 

Подготовка окружения:

yum -y install vim yum-utils rpmdevtools ncurses-devel hmaccalc zlib-devel binutils-devel \
 elfutils-libelf-devel kernel-devel-$(uname -r) gcc make rpm-build elfutils-devel newt-devel \
 python-devel audit-libs-devel perl-ExtUtils-Embed
yum -y groupinstall "Development Tools"

Я не буду описывать создание пользователя "builder". В принципе, это может быть любой не привилегированный пользователь. 

Получение исходных кодов:

su - builder
rpmdev-setuptree
mkdir ~/tmp ; cd ~/tmp
    yumdownloader --source kernel-$(uname -r)
    rpm -ivh kernel-*.src.rpm
    cd ~

Подготовка дерева исходных кодов ядра:

Установим зависимости
su -c "yum-builddep --nogpgcheck /home/builder/tmp/kernel-*.src.rpm"
Распакуем исходные тексты
cd ~/rpmbuild/SPECS
    rpmbuild -bp --target=$(uname -m) kernel.spec


Настройка ядра:

Дабы уберечь вас от ошибки которая стоила мне нескольких часов, скажу, что при сборке ядра таким способом, я имею в виду через "spec" файл, старый, добрый, ламповый ".conf" файл генерируется изново. Что приводит к тому, что все изменения перезатираются. Генерируется он специальным perl'овым скриптом, из специальных файлов конфигурации, подключение которых можно обнаружить в "spec" файле.  

Список файлов конфигурации
grep -P 'Source\d+:' ~/rpmbuild/SPECS/kernel.spec
Сами файлы находятся тут ~/rpmbuild/SOURCES

Мне нужно только включить поддержку UFS в ядре, чем пожалуй и займусь.
cd ~/rpmbuild/SOURCES
    sed -i -e "s/.*CONFIG_UFS_FS.*/CONFIG_UFS_FS=m/g" config-generic-rhel
    sed -i -e "s/.*CONFIG_UFS_FS_WRITE.*/CONFIG_UFS_FS_WRITE=y/g" config-generic
Важно!
Для того, чтобы ядро не затёрлось при первом же официальном релизе, и чтобы самому понимать какое ядро установлено в системе, ядру следует присвоить кастомнный префикс.
cd ~/rpmbuild/SPECS
    sed -i -e "s/.*define buildid.*/%define buildid .mycompany/g" kernel.spec
И еще одно Важно!
Чтобы ядро с префиксом в последствии корректно установилось, его следует собрать с опцией "--with firmware".
Команду сборки лучше запускать через "time", чтобы можно мыло сказать как долго ого собиралось.
А теперь наберёмся терпения, и будем ждать пока оно соберётся.
Я делал сборку на слабых машинках, и время сборки у меня варьировалось от 1.5 до 4х часов.
К слову, на варнинги можно не обращать внимание, главное чтобы в конце было сообщение об удачной сборке.
time rpmbuild -bb --with firmware --target=`uname -m` kernel.spec
Когда весь чай выпит, а последний драйвер втиснут в rpm пакет, можно приступать к установке.
"kernel-firmware" необходимо устанавливать в первую очередь
su -
cd /home/builder/rpmbuild/RPMS/x86_64
    rpm -ivh kernel-firmware-*.rpm
    rpm -ivh kernel-*.rpm

Ну а теперь, перезагружаемся,  и радуемся новым фичам.


https://fedoraproject.org/wiki/Building_a_custom_kernel
http://jablonskis.org/2011/howto-rebuild-centos-6-0-linux-kernel/index.html
Enhanced by Zemanta