< Kernel (Русский)

Kernel (Русский)/Arch Build System (Русский)

С помощью Arch Build System можно собрать собственное ядро на основе официального пакета linux. Данный метод автоматизирует весь процесс компиляции и основан на тщательно протестированном пакете. Отредактировав PKGBUILD, вы можете выбрать произвольные настройки ядра или добавить некоторые патчи.

Состояние перевода: На этой странице представлен перевод статьи Kernel/Arch Build System. Дата последней синхронизации: 30 октября 2021. Вы можете помочь синхронизировать перевод, если в английской версии произошли изменения.

Основная статья — Ядро.

Подготовка

Сборка происходит при помощи 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 и добавьте свою утилиту.

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
...

Обновление контрольных сумм

#Изменение prepare() предполагает, что файл может быть изменён. Поскольку этого файла не было во время загрузки файлов пакета, то makepkg не проверял его контрольную сумму (на самом деле проверен был файл $_srcname/../../config).

Если вы заменили загруженный другим, то перед запуском makepkg установите пакет и обновите котрольные суммы командой:

$ 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. В примерах ниже предполагается, что исходники находятся в каталоге ~/build/linux/.

В Arch файлы с исходным кодом хранятся в двух локальных git-репозиториях. Репозиторий в каталоге — локальный bare-репозиторий git, который указывает на . Второй, в каталоге , скачивает исходники из первого. Локальные патчи и сборка ядра должны выполняться в .

Изначально метка HEAD локального bare-репозитория в указывает на

$ 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

Проверить, что всё верно, можно следующим образом:

В выводе видно archlinux-патчи между ядрами и .

Новейшие PKGBUILD и настройки ядра можно скачать командой :

$ cd ~/build/linux/
$ asp update linux
$ asp export linux

Теперь необходимо объединить файлы с файлами в каталоге ~/build/linux/. Слияние можно выполнить вручную или с помощью подходящих утилит. Изучите раздел #Изменение prepare() и запустите вручную команды из PKGBUILD::prepare().

В этом месте необходимо выполнить . Во время компиляции не забудьте также добавить опцию --noextract в команду , поскольку пакеты должны собираться так, будто исходники были извлечены командой . Наконец, после этого можно вернуться к этапу #Установка.

Очистка

После объединения файлов имеет смысл удалить . Кроме того, продолжит собирать ветки вида при последующих обновлениях. Ненужную ветку тоже можно удалить:

$ cd ~/build/linux/src/archlinux
$ git branch --delete --force --verbose 5.2.7-arch1

Смотрите также

gollark: Actually, several exabytes.
gollark: If we assume there's 500 bytes of data per dragon... hmm... you'd need an exabyte of data storage to handle 72.1 petadragons.
gollark: Hmm, you may run into gendering issues; let's say 2 a week.
gollark: Of course, 72.1 petadragons would be harder.
gollark: You "only" need 56. One per week is easy.
This article is issued from Archlinux. The text is licensed under Creative Commons - Attribution - Sharealike. Additional terms may apply for the media files.