Kernel (Русский)/Arch Build System (Русский)
С помощью Arch Build System можно собрать собственное ядро на основе официального пакета linux. Данный метод автоматизирует весь процесс компиляции и основан на тщательно протестированном пакете. Отредактировав PKGBUILD, вы можете выбрать произвольные настройки ядра или добавить некоторые патчи.
Основная статья — Ядро.
Подготовка
Сборка происходит при помощи makepkg, поэтому необходимо следовать "лучшим практикам", приведённым в соответствующей статье. Например, запустить makepkg от root/sudo не получится; следовательно, прежде всего необходимо создать каталог build
внутри домашнего каталога.
$ mkdir ~/build/ $ cd ~/build/
Установите пакет asp и группу base-devel.
Для кастомизации необходимо чистое ядро. Следующие команды загрузят PKGBUILD и прочие файлы в каталог сборки:
$ asp update linux $ asp export linux
В данный момент дерево файлов в каталоге должно иметь примерно следующий вид (могут быть дополнительные файлы):
~/build/linux/-+ +--config \__PKGBUILD
Наконец, добудьте из соответствующих источников прочие файлы, которые могут потребоваться (файлы с новыми настройками ядра, патчи и т.п.).
Редактирование PKGBUILD
Внесите необходимые изменения в PKGBUILD
. Обратите внимание на параметр pkgbase
— в нём следует указать название вашего нового пакета, например:
PKGBUILD
pkgbase=linux-custom
linux
в массив provides
. Ваше ядро не будет совместимо с двоичными модулями стандартного ядра, поэтому удовлетворить такую зависимость будет невозможно. По той же причине не добавляйте linux-headers
в provides
пакета с заголовочными файлами.Отключение создания документации
Создание документации отнимает много времени в процессе компиляции. На данный момент (16 июня 2021) следующий патч к PKGBUILD позволяет её отключить:
63d63 < make htmldocs 194c194 < pkgname=("$pkgbase" "$pkgbase-headers" "$pkgbase-docs") --- > pkgname=("$pkgbase" "$pkgbase-headers")
Этот патч удаляет строку #63 и изменяет строку #194. Если изменения не получится применить корректно, отредактируйте файл вручную.
Изменение prepare()
Внутри этой функции можно применить необходимые патчи или изменить настройки сборки.
Если необходимо изменить несколько опций, отредактируйте файл настроек в исходниках.
Также можно воспользоваться графическим инструментом для переключения опций. Закомментируйте строку в функции prepare() в файле PKGBUILD и добавьте свою утилиту.
Обновление контрольных сумм
#Изменение prepare() предполагает, что файл $_srcname/.config
может быть изменён. Поскольку этого файла не было во время загрузки файлов пакета, то makepkg не проверял его контрольную сумму (на самом деле проверен был файл ).
Если вы заменили загруженный другим, то перед запуском makepkg установите пакет pacman-contrib и обновите котрольные суммы командой:
$ updpkgsums
Компиляция
Теперь можно скопилировать ядро командой .
Если для настройки параметров ядра была выбрана интерактивная программа (например, menuconfig), то во время компиляции потребуется ваше присутствие.
$ makepkg -s
С параметром makepkg загрузит все необходимые зависимости, используемые последними ядрами, такие как xml и docs.
Установка
После компиляции в каталоге появится два пакета, один для ядра и один — для заголовочных файлов. Их названия будут иметь примерно следующий вид:
linux-custom-5.8.12-x86_64.pkg.tar.zst linux-custom-headers-5.8.12-x86_64.pkg.tar.zst
Лучше всего установить оба пакета одной командой, т.к. они могут потребоваться одновременно (например, для DKMS).
# pacman -U linux-custom-headers-5.8.12-x86_64.pkg.tar.zst linux-custom-5.8.12-x86_64.pkg.tar.zst
(замените названия пакетов на свои).
Загрузчик
Если вы изменили значение pkgbase
, чтобы новое ядро устанавливалось рядом со стандартным, то необходимо внести изменения в настройки загрузчика, добавив новые значения ('default' и 'fallback') для вашего ядра и его initramfs-образа.
Обновление
Предположим, имеется набор файлов с исходным кодом ядра Arch и их необходимо обновить. Это можно сделать с помощью https://github.com/archlinux/linux. В примерах ниже предполагается, что исходники находятся в каталоге .
В Arch файлы с исходным кодом хранятся в двух локальных git-репозиториях. Репозиторий в каталоге — локальный bare-репозиторий git, который указывает на . Второй, в каталоге src/archlinux-linux/
, скачивает исходники из первого. Локальные патчи и сборка ядра должны выполняться в src/archlinux-linux/
.
Изначально метка HEAD локального bare-репозитория в указывает на
т.е. где-то между v5.2.5-arch1 и v5.2.6-arch1.
$ git fetch --verbose
А эта команда (показывает последнюю по времени метку) вывела более свежую метку archlinux, v5.2.7-arch1. Отсутствие новых меток означало бы, что исходники archlinux не изменились.
Теперь можно обновить файлы с исходным кодом:
$ cd ~/build/linux/src/archlinux-linux/ $ git checkout master $ git pull $ git fetch --tags --verbose $ git branch --verbose 5.2.7-arch1 v5.2.7-arch1 $ git checkout 5.2.7-arch1
Проверить, что всё верно, можно следующим образом:
В выводе видно archlinux-патчи между ядрами и Linux 5.2.7
.
Новейшие PKGBUILD и настройки ядра можно скачать командой :
$ cd ~/build/linux/ $ asp update linux $ asp export linux
Теперь необходимо объединить файлы с файлами в каталоге . Слияние можно выполнить вручную или с помощью подходящих утилит. Изучите раздел #Изменение prepare() и запустите вручную команды из PKGBUILD::prepare().
В этом месте необходимо выполнить . Во время компиляции не забудьте также добавить опцию в команду , поскольку пакеты должны собираться так, будто исходники были извлечены командой makepkg --nobuild
. Наконец, после этого можно вернуться к этапу #Установка.
Очистка
После объединения файлов имеет смысл удалить . Кроме того, продолжит собирать ветки вида при последующих обновлениях. Ненужную ветку тоже можно удалить:
$ cd ~/build/linux/src/archlinux $ git branch --delete --force --verbose 5.2.7-arch1
Смотрите также
- https://docs.kernel.org/kbuild/kconfig.html и родительский каталог