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

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

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

С помощью 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()

Внутри этой функции можно применить необходимые патчи или изменить настройки сборки.

Если необходимо изменить несколько опций, отредактируйте файл настроек в исходниках.

Также можно воспользоваться графическим инструментом для переключения опций. Закомментируйте строку `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
    ...

Важно: У systemd есть несколько требований к настройкам ядра как для стандартного режима работы, так и для отдельных вариантов использования (например, UEFI) и специфичной функциональности (например, bootchart). Несоблюдение требований может привести к нестабильной работе и отказу системы. Список необходимых и рекомендуемых параметров находится в файле `/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 и настройки ядра можно скачать командой `asp`:

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

Примечание: Иногда `asp` не обновляет файлы, даже если найдена более новая метка исходников archlinux. Это может быть связано с тем, что файлы сборки появляются лишь через некоторое время после добавления исходников.

Теперь необходимо объединить файлы `~/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 и родительский каталог

Category:

- Kernel (Русский)