Kernel (Русский)/Arch Build System (Русский)
Основная статья — Ядро.
С помощью Arch Build System можно собрать собственное ядро на основе официального пакета linux. Данный метод автоматизирует весь процесс компиляции и основан на тщательно протестированном пакете. Отредактировав PKGBUILD, вы можете выбрать произвольные настройки ядра или добавить некоторые патчи.
Подготовка
Сборка происходит при помощи makepkg, поэтому необходимо следовать "лучшим практикам", приведённым в соответствующей статье. Например, запустить makepkg от root/sudo не получится; следовательно, прежде всего необходимо создать каталог build
внутри домашнего каталога.
$ mkdir ~/build/ $ cd ~/build/
Установите пакета devtools и base-devel.
Для кастомизации необходимо чистое ядро. Следующие команды загрузят PKGBUILD и прочие файлы в каталог сборки:
$ pkgctl repo clone --protocol=https 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()
Внутри этой функции можно применить необходимые патчи или изменить настройки сборки.
Если необходимо изменить несколько опций, отредактируйте файл настроек в исходниках.
Также можно воспользоваться графическим инструментом для переключения опций. Закомментируйте строку make olddefconfig
в функции prepare() в файле PKGBUILD и добавьте свою утилиту.
PKGBUILD
... msg2 "Setting config..." cp ../config .config #make olddefconfig make nconfig # new CLI menu for configuration #make menuconfig # CLI menu for configuration #make xconfig # X-based configuration #make oldconfig # using old config from previous kernel version # ... or manually edit .config make prepare ...
/usr/share/doc/systemd/README
. Сверьтесь с ним перед компиляцией. Сами требования время от времени меняются, и поскольку Arch предполагает, что вы используете официальное ядро, то изменения никак не анонсируются. Перед установкой новой версии systemd изучите сообщение о релизе и убедитесь, что ваша конфигурация ядра соответствует новым требованиям systemd.Обновление контрольных сумм
#Изменение prepare() предполагает, что файл $_srcname/.config
может быть изменён. Поскольку этого файла не было во время загрузки файлов пакета, то makepkg не проверял его контрольную сумму (на самом деле проверен был файл $_srcname/../../config
).
Если вы заменили загруженный config
другим, то перед запуском makepkg установите пакет pacman-contrib и обновите котрольные суммы командой:
$ updpkgsums
Компиляция
Теперь можно скопилировать ядро командой makepkg
.
Если для настройки параметров ядра была выбрана интерактивная программа (например, menuconfig), то во время компиляции потребуется ваше присутствие.
$ makepkg -s
С параметром -s
makepkg загрузит все необходимые зависимости, используемые последними ядрами, такие как xml и docs.
- Исходные коды ядра подписаны PGP, и makepkg проверит подписи. Подробнее см. makepkg#Проверка цифровых подписей.
- Компиляция может занять несколько часов в зависимости от мощности компьютера. Параллельная компиляция позволяет значительно ускорить процесс на многоядерных системах.
Установка
После компиляции в каталоге ~/build/linux
появится два пакета, один для ядра и один — для заголовочных файлов. Их названия будут иметь примерно следующий вид:
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. В примерах ниже предполагается, что исходники находятся в каталоге ~/build/linux/
.
В Arch файлы с исходным кодом хранятся в двух локальных git-репозиториях. Репозиторий в каталоге archlinux-linux/
— локальный bare-репозиторий git, который указывает на https://github.com/archlinux/linux.git
. Второй, в каталоге src/archlinux-linux/
, скачивает исходники из первого. Локальные патчи и сборка ядра должны выполняться в src/archlinux-linux/
.
Изначально метка HEAD локального bare-репозитория в archlinux-linux/
указывает на
$ cd ~/build/linux/archlinux-linux/ $ git log --oneline --max-count 1 HEAD
4010b622f1d2 Merge branch 'dax-fix-5.3-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/nvdimm/nvdimm
т.е. где-то между 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
Проверить, что всё верно, можно следующим образом:
$ git log --oneline 5.2.7-arch1 --max-count=7
13193bfc03d4 Arch Linux kernel v5.2.7-arch1 9475c6772d05 netfilter: nf_tabf676926c7f60les: fix module autoload for redir 498d650048f6 iwlwifi: Add support for SAR South Korea limitation bb7293abdbc7 iwlwifi: mvm: disable TX-AMSDU on older NICs f676926c7f60 ZEN: Add CONFIG for unprivileged_userns_clone 5e4e503f4f28 add sysctl to disallow unprivileged CLONE_NEWUSER by default 5697a9d3d55f Linux 5.2.7
В выводе видно archlinux-патчи между ядрами Arch Linux kernel v5.2.7-arch1
и Linux 5.2.7
.
Новейшие PKGBUILD и настройки ядра можно скачать командой git
:
$ cd ~/build/linux/ $ git pull
Теперь необходимо объединить файлы ~/build/linux/linux/*
с файлами в каталоге ~/build/linux/
. Слияние можно выполнить вручную или с помощью подходящих утилит. Изучите раздел #Изменение prepare() и запустите вручную команды из PKGBUILD::prepare().
В этом месте необходимо выполнить makepkg --verifysource
. Во время компиляции не забудьте также добавить опцию --noextract
в команду makepkg
, поскольку пакеты должны собираться так, будто исходники были извлечены командой makepkg --nobuild
. Наконец, после этого можно вернуться к этапу #Установка.
Очистка
После объединения файлов имеет смысл удалить ~/build/linux/linux/
. Кроме того, ~/build/linux/src/archlinux
продолжит собирать ветки вида 5.2.7-arch1
при последующих обновлениях. Ненужную ветку тоже можно удалить:
$ cd ~/build/linux/src/archlinux $ git branch --delete --force --verbose 5.2.7-arch1
Смотрите также
- https://docs.kernel.org/kbuild/kconfig.html и родительский каталог