From Fedora Project Wiki

Причины

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

Эта инструкция применима только к Fedora 12 и старше.

Обычно пользователи пересобирают ядро по нескольким причинам:

  • для тестирования патчей
  • для переконфигурации существующего ядра
  • для изучения ядра и его разработки

Также эти инструкции могут быт применены для простой генерации дерева исходных кодов ядра.

Предварительные действия

Перед началом убедитесь, что в системе установлены все необходимые пакеты, включая следующие:

  • rpmdevtools
  • yum-utils

Чтобы установить эти пакеты, воспользуйтесь командой:

$ su -c 'yum install yum-utils rpmdevtools'

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

Не собирайте пакеты под пользователем root. Сборка пакетов от пользователя root по своей сути опасна и не обязательна, даже для сборки ядра. Данная инструкция позволяет любому непривилегированному пользователю устанавливать исходники и собирать из них пакеты ядра.

1. Подготовьте окружение для создания пакетов в вашем домашнем каталоге, используя команду:

$ rpmdev-setuptree

Эта команда создаёт дерево каталогов ${HOME}/rpmbuild/SOURCES, ${HOME}/rpmbuild/SPECS и ${HOME}/rpmbuild/BUILD. Где ${HOME} — ваш домашний каталог.

2. Загрузите файл kernel-<version>.src.rpm. Для этого может потребоваться включение репозитория исходников параметром --enablerepo (yumdownloader --enablerepo=<repro_to_enable> --source kernel )

$ yumdownloader --source kernel

3. Установите зависимости исходников для сборки ядра командой (команда выполняется с привилегиями root):

$ su -c 'yum-builddep kernel-<version>.src.rpm'

4. Установите kernel-<version>.src.rpm командой:

$ rpm -Uvh kernel-<version>.src.rpm

Эта команда запишет содержимое rpm-пакета в ${HOME}/rpmbuild/SOURCES и ${HOME}/rpmbuild/SPECS, где ${HOME} это ваш домашний каталог.
Можно игнорировать все сообщения похожие на эти:

warning: user kojibuilder does not exist - using root
warning: group kojibuilder does not exist - using root
Необходимо свободное место на жёстком диске. Полный процесс сборки ядра требует несколько гигабайт свободного места на файловой системе в вашем домашнем каталоге.

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

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

1. Подготовьте дерево исходников используя следующие команды:

$ cd ~/rpmbuild/SPECS
$ rpmbuild -bp --target=uname -m kernel.spec

Теперь исходники находятся в каталоге ${HOME}/rpmbuild/BUILD/kernel-<version>/linux-<version>.<arch>, где ${HOME} это ваш домашний каталог.

Копирование исходников и создание патча

Этот шаг нужен для применения патча к исходникам ядра. Если патч не нужен, то перейдите к разделу "Конфигурирование опциий ядра".


Скопируйте дерево исходников для сохранения оригинала при внесении изменений:

$ cp -r ~/rpmbuild/BUILD/kernel-2.6.<version>/linux-2.6.<version>.<arch> ~/rpmbuild/BUILD/kernel-2.6.<version>.orig
$ cp -al ~/rpmbuild/BUILD/kernel-2.6.<version>.orig ~/rpmbuild/BUILD/kernel-2.6.<version>.new
Вторая команда жёстко связывает деревья .orig и .new, чтобы команда diff выполнялась быстрее. Большинство текстовых редакторов знают как разрушать жёсткие связи, избегая проблем.

Изменения можно вносить прямо в код в дереве .new или копируя изменённые файлы. Такие файлы могут быть от разработчиков, которым нужно тестирование, из основной ветки ядра (ванилла), или из любого другого источника.

После модификации ветки .new, создаём патч. Для этого запускаем снова команду diff над полными .new и .orig деревьями следующей командой:

$ cd ~/rpmbuild/BUILD
$ diff -uNrp kernel-2.6.<version>.orig kernel-2.6.<version>.new > ../SOURCES/linux-2.6-my-new-patch.patch

Замените linux-2.6-my-new-patch.patch на желаемое имя для нового патча.

Более подробную информацию о патчах можно найти в man для diff(1) и patch(1).

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

На данном шаге конфигурируем опции ядра. Это не обязательный шаг. Если изменение опций ядра не требуется, то переходите к разделу "Подготовка файлов сборки".

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

$ cd ~/rpmbuild/BUILD/kernel-2.6.<version>/linux-2.6.<version>.<arch>/

Если вы хотите сделать лишь незначительные изменения в исходное ядро, то переходите к шагу 4, и используйте один из двух инструментов для изменения исходного конфигурационного файла.

2. Выберите желаемый файл конфигурации из ~/rpmbuild/BUILD/kernel-2.6.<version>/linux-2.6.<version>.<version>/configs Скопируйте его в ~/rpmbuild/BUILD/kernel-2.6.<version>/linux-2.6.<version>.<arch>/.config:

$ cp configs/<желаемый-файл-конфигурации> .config

3. Выполните следующую команду:

$ make oldconfig

4. Затем выполните команду для выбора и сохранения требуемых опций в консольном (псевдографическом) режиме:

$ make menuconfig

При этом должны быть установлены пакеты ncurses и ncurses-devel. Для их установки выполните:

$ su -c 'yum install ncurses ncurses-devel'

Или в графическом режиме:

$ make xconfig

5. Проверьте наличие в самом начале конфигурационного файла строки, содержащей название платформы, для которой создаётся ядро (вывод команды uname -i). В начале этой строки должен стоять знак #. Например, для архитектуры x86_64 должно быть:

# x86_64

6. Скопируйте файл конфига в ~/rpmbuild/SOURCES/:

$ cp .config ~/rpmbuild/SOURCES/config-<arch>-generic

Подготовка файлов сборки

На данном шаге вносим необходимые изменения в файл kernel.spec. Данный шаг необходим для сборки собственного ядра.

1. Переходим в каталог ~/rpmbuild/SPECS:

$ cd ~/rpmbuild/SPECS

2. Открываем файл kernel.spec для редактирования.

3. Даём ядру уникальное имя. Важно убедиться, что имя вашего ядра отличается от имён релизных (исходных и будущих) ядер. Добавьте уникальную строку в название ядра, отредактировав строку buildid. Измените .local на ваши инициалы, дату или любое другое уникальное значение.

Отредактируйте эту строку:

#% define buildid .local

К такому виду:

%define buildid .<custom_text>

4. Если вы создали патч, то добавьте его в файл kernel.spec, желательно в конец всех существующих патчей и прокомментируйте его:

# cputime accounting is broken, revert to 2.6.22 version
Patch2220: linux-2.6-cputime-fix-accounting.patch
Patch9999: linux-2.6-samfw-test.patch

Затем надо добавить команду применения патча в spec-файл. Снова, добавьте в конец файла и прокомментируйте:

ApplyPatch linux-2.6-cputime-fix-accounting.patch
ApplyPatch linux-2.6-samfw-test.patch

Сборка нового ядра

На этом шаге создаются RPM-файлы ядра. Данный шаг необходим для сборки собственного ядра.

В большинстве случаев, проще собрать с включёнными файлами firmware (см. последний блок кода ниже). Такая сборка является предпочтительной в большинстве случаев. Если вы не уверены, то выбирайте именно её.

Используйте утилиту rpmbuild для сборки нового ядра:
Для создания всех возможных файлов:

$ rpmbuild -bb --target=uname -m kernel.spec

Для исключения специфичных файлов из сборки (для более быстрой сборки):

$ rpmbuild -bb --without <option> --target=uname -m kernel.spec

Возможные значения для "option": xen, smp, up, pae, kdump, debug и debuginfo. Указание --without debug уберёт некоторый отладочный код из ядра, а указание --without debuginfo отменит создание пакетов kernel-debuginfo.

Для сборки только конкретного ядра:

$ rpmbuild -bb --with <option> --target=uname -m kernel.spec

Возможные значения для "option": xenonly, smponly, and baseonly.
Например, для сборки пакетов kernel и kernel-devel команда выглядит так:

$ rpmbuild -bb --with baseonly --without debuginfo --target=uname -m kernel.spec

Для сборки с включёнными файлами firmware:

$ rpmbuild -bb --with baseonly --with firmware --without debuginfo --target=uname -m kernel.spec 

Процесс сборки занимает много времени. Множество сообщений выводится на экран. На эти сообщения можно не обращать внимания, если сборка заканчивается без ошибок. В результате, собранные пакеты будут лежать в ~/rpmbuild/RPMS/<arch>.

Совместимость со стандартными руководствами

Многие руководства и примеры по разработке ядра подразумевают, что исходники ядра установлены в /usr/src/linux/. Чтобы эти руководства работали установите исходники как сказано выше и создайте символическую ссылку:

$ su -c 'ln -s /usr/src/kernels/<version>.<release>-<arch> /usr/src/linux'

Для этой операции нужен пароль root.

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

На данном шаге устанавливаем новое ядро в систему. Для этого потребуются права root.

Для установки нового ядра используйте команду rpm -ivh, т.е. без опции -U или --upgrade:

$ cd ~/rpmbuild/RPMS/<arch>/
$ su -c 'rpm -ivh kernel-<version>.<arch>.rpm'

Если вместо установки появится ошибка, что более новый пакет уже установлен, то добавьте опцию --oldpackage.
Если вы правильно изменили имя вашего ядра, то ваши firmware и заголовочные файлы ядра (kernel headers) не будут соответствовать. Простейшее решение — это собрать новые firmware, как указано выше в "Сборка нового ядра", а затем выполнить следующее:

$ cd ~/rpmbuild/RPMS/<arch>/
$ su -c 'rpm -ivh kernel-<version>.<arch>.rpm kernel-firmware-<version>.<arch>.rpm kernel-headers-<version>.<arch>.rpm kernel-devel-<version>.<arch>.rpm'