Сборка ядра Linux - SuSE метод

Материал из openSUSE.

Содержание

От Переводчика

Это руководство является почти полным переводом этого HowTo. Отступления от оригинала производились в случае необходимости внести ясность в документ. Так же некоторые изменения были внесены в связи с удалением "разъясняющих" скриншотов и необходимостью исправления устаревшей информации.

От Автора

Каждый дистрибутив имеет свой, особенный набор инструментов для сборки ядра из исходных кодов. Эта небольшая инструкция о том, как собирать ядро в SuSE. Далее я расскажу как собрать ядро из немодифицированного исходного кода взятого с сайта www.kernel.org (vanilla kernel). Это позволит вам не быть зависимым от ядер подготавливаемых разработчиками дистрибутива. Я так же покажу как накладывать патчи на исходный код ядра на случай если вам понадобится функциональность нереализованная в официальном ядре.

Все тестировалось на SuSE 10.1 и SuSE 10.2

Прежде всего хочу сказать, что это не единственный возможный путь. Существует много способов получить аналогичный результат, а этот просто тот который использую я.


Введение

Задача этого руководства, собрать rpm пакет содержащий ядро готовое для инсталяции и которое вы могли бы использовать в других дистрибутивах SuSE. Что дает вам большие возможности в сравнении с "традиционным" путем получения и использования rpm пакетов содержащих ядро системы.


Установка пакетов необходимых для компиляции ядра

Мы должны установить ncurses-devel необходимый для выполнения команды make menuconfig с которой мы будем работать позже

yast -i ncurses-devel

Теперь нам нужно немного модифицировать инструменты необходимые для сборки ядра. Если этого не сделать, то в процессе сборки получим следующее сообщение об ошибке

/usr/lib/rpm/find-requires.ksyms: line 12: /usr/bin/nm: Argument list too long

и не сможем установить наш rpm пакет.

Прежде чем вносить изменения, давайте сделаем резервную копию модифицируемых файлов.

cp /usr/lib/rpm/find-provides.ksyms /usr/lib/rpm/find-provides.ksyms_orig
cp /usr/lib/rpm/find-requires.ksyms /usr/lib/rpm/find-requires.ksyms_orig
cp /usr/lib/rpm/find-supplements.ksyms /usr/lib/rpm/find-supplements.ksyms_orig

Теперь мы откроем каждый из этих файлов и заменим строку

kernel-*) is_kernel_package=1 ;;

на строку

kernel*) is_kernel_package=1 ;;


Получение исходных кодов ядра

Сейчас мы скачаем нужное нам ядро и положим его в директорию /usr/src. Идите на www.kernel.org и выберите ядро которое вы хотите установить, например linux-2.6.18.2.tar.bz2 (все ядра ветки 2.6 вы можете найти здесь www.kernel.org/pub/linux/kernel/v2.6/). Теперь скачайте его в /usr/src так как показано ниже.

cd /usr/src/
wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.18.2.tar.bz2

После того как ядро скачается распакуйте его и создайте ссылку linux на директорию с исходным кодом.

tar xjf linux-2.6.18.2.tar.bz2
ln -s linux-2.6.18.2 linux
cd /usr/src/linux


Наложение патчей на исходный код ядра

Возможно Вам понадобятся драйвера для устройств, которые не поддерживаются новым ядром, возможно поддержка виртуализации или любая другая технология настолько новая, что пока еще нереализованна разработчиками ядра. Во всех этих случаях Вы можете наложить патч (естественно при условии, что он вообще существует).

Полагаю, нужный патч у Вас уже имеется (далее я буду называть его patch.bz2) и сохранен в директории /usr/src. Ниже показанно как его наложить на исходный код ядра. (вы должны находится в директории /usr/src/linux)

bzip2 -c /usr/src/patch.bz2 | patch -pl --dry-run
bzip2 -dc /usr/src/patch.bz2 | patch -pl

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

Если ваш патч сжат архиватором gzip(gz) вместо bzip2(bz2) в этом случае ваши действия будут такими.

gunzip -c /usr/src/patch.gz | patch -pl --dry-run
gunzip -c /usr/src/patch.gz | patch -pl

Точно также накладываются так называемые препатчи ядра. Например,если Вам нужны какие либо возможности уже реализованные в ядре 2.6.19-rc6, а полный исходный код этой версии еще недоступен кроме как в виде патча patch-2.6.19-rc6.bz2. Вы можете накладывать этот патч на ядро 2.6.18, но не на ядро 2.6.18.1, 2.6.18.2 и т.д. Более подробно об этом Вы можете прочитать здесь http://www.kernel.org/putchtypes/pre.html)

Препатчи, суть альфа версии ядра Linux; они находятся в архиве в директории для тестируемых версий. Они накладываются при помощи утилиты patch(1) на исходный код предыдущей версии ядра номер которой состоит из трех частей (например: препатч 2.6.12-rc4 должен накладывается на ядро 2.6.11, но не на ядро версии 2.6.11.10)

Таким образом, если Вы хотите собрать ядро 2.6.19-rc6, Вы должны на шаге №3 скачать ядро версии 2.6.18 вместо 2.6.18.2 Ниже приведен пример как накладывать патч 2.6.19-rc6 на ядро 2.6.18

cd /usr/src
wget http://www.kernel.org/pub/linux/kernel/v2.6/testing/patch-2.6.19-rc6.bz2''
cd /usr/src/linux
bzip2 -c /usr/src/patch-2.6.19-rc6.bz2 | patch -pl --dry-run
bzip2 -dc /usr/src/patch-2.6.19-rc6.bz2 | patch -pl

Конфигурирование ядра

Хорошим подспорьем для будет возможность использовать конфигурационный файл текущего рабочего ядра как основу для нового ядра

make mrproper
cp /boot/config-`uname -r` ./.config

Затем выполним

make menuconfig

Данная команда запустит интерфейс конфигурирования ядра. Выберите Load an Alternate Configuration File и введите .config в качестве имени конфигурационного файла.

Теперь пройдитесь по всему меню конфигурирования ядра и выберите те опции которые вам понадобятся. Я советую вам обязательно изменить строку с идентификатором версии General Setup --> (default) Local version По умолчанию значение этого параметра выставлено в -defaul. Если оставить его, то RPM пакет с ядром будет назван kernel-2.6.18.2default-1.i386.rpm. Вы вольны менять это значение по своему усмотрению.

В этом руководстве я буду использовать умолчанное значение -default

После того как вы установите ядро из пакета kernel-2.6.18.2default-1.i386.rpm, а позже захотите пересобрать, то не забудьте изменить строку с идентификатором версии. Иначе вы просто не сможете установить его, так как пакет kernel-2.6.18.2default-1.i386.rpm уже установлен в систему.


В связи с тем, что начиная с ядер версии 2.6.19 драйвер Serial ATA вынесены в отдельную ветку, то при использовании конфигурационного файла от ядер версии 2.6.18 и ниже драйвера для SATA устройств не будут выбраны автоматически. Соответственно если вы не добавите их в процессе конфигурирования ядра самостоятельно, то система не будет видеть SATA устройства.
-> Device Drivers
     -> Serial ATA (prod) and Parallel ATA (experimental) drivers
          -> ATA device support

Так же в этой подсекции будет список поддерживаемых контроллеров. Выберите ваш контроллер, либо, если не знаете, включите все модулем (точно не ошибетесь).


Когда закончите с настройками, выберите Exit, и ответьте на вопрос (Do you wish to save your new kernel configuration) Yes.

Сборка ядра

Чтобы собрать ядро, просто выполните эту команду.

make rpm

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

Установка ядра

В результате успешной сборки ядра будут созданы два RPM пакета src.rpm и .rpm. Пакет src.rpm будет находится в директории /usr/src/packages/SRPM

ls -l /usr/src/packages/SRPMS/

В моей системе он называется kernel-2.6.18.2default-1.src.rpm.

RPM пакет с двоичными данными (собственно то, что мы компилировали) находится в директории /usr/src/packages/RPMS/i386, /usr/src/packages/RPMS/i586, /usr/src/packages/RPMS/i686 и т.д. в зависимости от архитектуры вашей машины. В моей системе это была директория /usr/src/packages/RPMS/i386, а сам пакет назывался kernel-2.6.18.2default-1.i386.rpm.

Теперь мы можем установить наш rpm пакет.

cd /usr/src/packages/RPMS/i386
rpm -ivh kernel-2.6.18.2default-1.i386.rpm

(Вы можете устанавливать это rpm пакет в любой другой системе SuSE точно так же как это было описано выше. Это избавит вас от необходимости компилировать ядро)

Следующим этапом будет создание ram диска для нашего ядра. Иначе наше ядро скорее всего просто не загрузится.

mkinitrd

(Обычно результатом выполнения команды является создание ram диска для каждого ядра в директории /boot)

Настройка загрузчика Grub

Нам осталось только настроить загрузчик Grub, чтобы после перезагрузки система грузилась уже с нашим новым ядром. В место редактирования файла /boot/grub/menu.1st руками мы с делаем это с помощью

yast
Если у вас помимо OpenSuSE и Windows установлено еще пара-тройка операционных систем, то лучше всеже править конфигурационный файл напрямую из текстового редактора. По моим наблюдениям OpenSuSE некорректно определяет другие дистрибутивы Linux.


Выберите из списка System -> Boot Loader. Перед вами появится текущий список выбора загрузчика Grub. Нажмите Добавить для создания новой записи. На следующем экране выберите Clone Selected Section, чтобы сделать копию рабочей загрузочной записи Grub и нажмите Дальше. Теперь введите имя для вашего ядра, например SuSE 10.2 - 2.6.18.2 и жмите Kernel -> Browse. Вы увидите список файлов директории /boot в которой и находится ваше ядро. Выберите ваше недавно созданное ядро, обычно его название начинается с vmlinuz. Далее точно так же выбираем Initial Ram диск. Это файл с названием initrd-версия.вашего.ядра. Жмем ОК и возвращаемся в главное меню. Если все сделано правильно, вы увидите новую запись для вашего ядра. Кнопками Вверх и Вниз переместите эту запись на необходимую вам позицию и нажмите Set as Default. Нажмите Finishv. Нажмите Quit и закончите работу с Yast.

Все. Закончили. Для верности вы можете открыть файл /boot/grub/menu.lst в текстовом редакторе (именно его мы редактировали с помощью Yast) и проверить наличие новой секции с нашим ядром в ней. Сделать это можно набрав

vim /boot/grub/menu.lst

Заодно проверьте правильно ли вы написали название ядра и Ram диска. Сравните с тем, что показывает.

ls -l /boot

Осталось перегрузить систему

shutdown -r now

И если вы все сделали правильно, загрузится с новым ядом. Проверить это можно набрав

uname -r

В ответ вы увидите, что то вроде этого

2.6.18.2-default

Если система не загрузится перезапустите ее и в меню Grub выберите ваше предыдущее рабочее ядро. Вы сможете загрузить систему и исправить ошибки или собрать новое ядро, но при этом незабудьте удалить неработающую загрузочную запись из /boot/grub/menu.1st.