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

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

From ArchWiki
< Kernel (Русский)
Jump to navigation Jump to search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.
Состояние перевода: На этой странице представлен перевод статьи Kernel/Arch Build System. Дата последней синхронизации: 10 июля 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` пакета с заголовочными файлами.

### Отключение создания документации

Создание документации отнимает много времени в процессе компиляции. На данный момент (июнь 2020) следующий патч к PKGBUILD позволяет её отключить:

    62d62
    <   make htmldocs
    190c190
    < pkgname=("$pkgbase" "$pkgbase-headers" "$pkgbase-docs")
    ---
    > pkgname=("$pkgbase" "$pkgbase-headers")

Этот патч удаляет строку #62 и изменяет строку #190. Если изменения не получится применить корректно, отредактируйте файл вручную.

### Изменение 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://www.kernel.org/doc/html/latest/kbuild/kconfig.html и родительский каталог

Category:

- Kernel (Русский)