В этом документе содержатся инструкции для продвинутых пользователей, которые хотят пересобрать ядро.
Причины
Обычно пользователи пересобирают ядро по нескольким причинам:
- для тестирования патчей
- для переконфигурации существующего ядра
- для изучения ядра и его разработки
Также эти инструкции могут быт применены для простой генерации дерева исходных кодов ядра.
Предварительные действия
Перед началом убедитесь, что в системе установлены все необходимые пакеты, включая следующие:
- 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'
