В этом документе содержатся инструкции для продвинутых пользователей, которые хотят пересобрать ядро.
Причины
Обычно пользователи пересобирают ядро по нескольким причинам:
- для тестирования патчей
- для переконфигурации существующего ядра
- для изучения ядра и его разработки
Также эти инструкции могут быт применены для простой генерации дерева исходных кодов ядра.
Предварительные действия
Перед началом убедитесь, что в системе установлены все необходимые пакеты, включая следующие:
- rpmdevtools
- yum-utils
Чтобы установить эти пакеты, воспользуйтесь командой:
$ su -c 'dnf install yum-utils rpmdevtools'
Получение исходных кодов
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
Изменения можно вносить прямо в код в дереве .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
на желаемое имя для нового патча.
Конфигурирование опций ядра
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-файлы ядра. Данный шаг необходим для сборки собственного ядра.
Используйте утилиту 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, paeonly и 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'