カーネル/Arch build system

提供: ArchWiki
2023年6月9日 (金) 21:47時点におけるAshMyzk (トーク | 投稿記録)による版 (AshMyzk がページ「カーネル/コンパイル/Arch Build System」を「カーネル/Arch build system」に移動しました: 記事名を英語版と同じに)
ナビゲーションに移動 検索に移動

Arch Build System を使うことで、公式の linux パッケージをベースにカスタムカーネルをビルドすることができます。このコンパイル方法は全体のプロセスを自動化でき、よくテストされたパッケージに基づいています。PKGBUILD を編集することでカスタムカーネルの設定やパッチの追加が可能です。

材料の入手

makepkg を使用するので、以下のベストプラクティスに従ってください。例えば、makepkg を root ユーザとして実行することはできません。したがって、まずはホームディレクトリに build ディレクトリを作成してください:

$ mkdir ~/build/
$ cd ~/build/

パッケージ devtoolsbase-develインストールしてください。

カスタマイズを開始するには、クリーンなカーネルが必要です。以下を実行して、git を使って PKGBUILD ソースを取得し、他のいくつかのファイルも取得してください:

$ pkgctl repo clone --protocol=https linux

この時点で、ディレクトリツリーは以下のようになります(他にもいくつかファイルがあるかもしれません)

~/build/linux/-+
               +--config
               \__PKGBUILD

その後、必要なファイル (例:カスタム設定ファイル、パッチなど) をそれぞれのソースから取得してください。

PKGBUILD の修正

PKGBUILD を編集して、pkgbase パラメータをあなたのカスタムパッケージの名前に変えて下さい、例えば:

PKGBUILD
pkgbase=linux-custom
警告: linuxprovides 配列に 追加しないでください。カスタムカーネルは、そのカーネルに対して構築されたバイナリモジュールと互換性がないため、その依存関係を満たすことはできません。 同様に、同様の理由で、ヘッダーパッケージの provides 配列に linux-headers を追加しないでください。

ドキュメントの作成を避ける

長いコンパイル作業の大部分は、ドキュメントの作成に費やされています。2022年8月25日の時点で、PKGBUILD への次のパッチにより作成を回避します:

63c63
<   make htmldocs all
---
>   make all
195c195
< pkgname=("$pkgbase" "$pkgbase-headers" "$pkgbase-docs")
---
> pkgname=("$pkgbase" "$pkgbase-headers")

このパッチは行#63 と行#195 を変更します。 PKGBUILD ファイルが正しく適用されない場合は、手動で編集する必要がある場合があります。

prepare() の変更

prepare() 関数では、パッチの適用 やカーネルビルドの設定を変更することができます。

もし、いくつかの設定を変更する必要があるなら、ソースの config を編集することができます。

また、GUI ツールを使ってオプションを調整することもできます。PKGBUILD の prepare() 関数に make olddefconfig とコメントし、好きなツールを追加してください (利用可能な設定ターゲットをすべてリストアップするには make help を実行してください):

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)、特定の systemd の機能 (例: bootchart) を使用するために、設定する必要があるカーネルコンフィグが多数存在します。正しく設定しないとシステムの調子がおかしくなったり全く使えなくなったりします。必須あるいは推奨されているカーネルコンフィグのリストは /usr/share/doc/systemd/README に書かれています。コンパイルする前によく確認してください。必要なコンフィグはときどき変わっています。Arch では基本的に公式カーネルを使用することになっているので、要件が変わってもアナウンスはされません。新しいバージョンの systemd をインストールする前に、リリースノートをチェックして使用しているカスタムカーネルが新しい systemd の要件を満たしているか確認してください。

新しいチェックサムを生成

#prepare() の変更 では、$_srcname/.config への変更の可能性を示唆しています。 このパスはパッケージファイルのダウンロードが終了した場所ではないため、そのチェックサムは makepkg によってチェックされませんでした (実際は $_srcname/../../config をチェックしました)。

makepkg を実行する前に、ダウンロードした config を別の設定ファイルに置き換えた場合は、pacman-contrib パッケージをインストールし、以下を実行して新しいチェックサムを生成してください:

$ updpkgsums

コンパイル

これで、いつものコマンド makepkg を使って、あなたのカーネルをコンパイルできるようになりました。

カーネルパラメータの設定に (menuconfig などの) インタラクティブなプログラムを選んだ場合は、コンパイル中に設定を行ってください。

$ makepkg -s

-s パラメータによって xml やドキュメントなど最近のカーネルが必要とする依存パッケージがダウンロードされます。

ノート:
  • カーネルソースは PGP 署名 が付いており、makepkg は署名を検証します。詳しくは Makepkg#署名チェックを見てください。
  • ハードウェアのパフォーマンスによっては、コンパイルに数時間かかる可能性があります。マルチコアのシステムでは複数のコンパイルジョブを同時に実行することでコンパイル時間を大幅に削減することが可能です。
  • 上記の makepkgtime コマンドを使って実行すれば、コンパイルにどれだけの時間が掛かったのかを知ることができます。

インストール

コンパイルのステップを終えると、~/build/linux フォルダ内に 2 つのパッケージが作成されています。1 つはカーネルで、もう一つはカーネルのヘッダファイル群です。これらは以下のような名前かもしれません:

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 を変更した場合、ブートローダーの設定ファイルを更新し、関連する initramfs イメージとカスタムカーネルの新しいエントリ ('default' と 'fallback') を追加する必要があります。

アップデート

更新したい arch kernel source を持っていると仮定すると、そのための一つの方法は https://github.com/archlinux/linux を使うことです。以下では、カーネルソースの最上位ディレクトリを ~/build/linux/ とします。

一般に、arch は2つのローカル git リポジトリを持つ arch kernel source を設定します。archlinux-linux/ にあるのは、https://github.com/archlinux/linux.git を指しているローカルの裸の git リポジトリです。もう一つは src/archlinux-linux/ にあり、最初のリポジトリから取り出します。可能なローカルパッチとビルドは、src/archlinux-linux/ にあると期待されます。

この例では、archlinux-linux/ にローカルにインストールされた bare git リポジトリソースの HEAD が最初に指されています:

$ 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

これは、Arch Linux kernel v5.2.7-arch1Linux 5.2.7 の間のいくつかの特定の archlinux パッチを示しています。

最新の PKGBUILD および archlinux カーネルのコンフィグレーションファイルは、git を使ってパッケージディレクトリへ取得できます:

$ cd ~/build/linux/
$ git pull

~/build/linux/linux/* 内のファイルを ~/build/linux/マージする必要があります。マージは手動で行うことができますし、特定のユーティリティを使うこともできます。#prepare() の変更 を見て、PKGBUILD::prepare() のシェルコマンドを (全てではないにしろ) ほぼ全て手動で実行してください。

この時点で、 makepkg--verifysource は成功するはずです。#コンパイル の時には、makepkg --noextract オプションも追加してください。これによりソースが 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

参照

翻訳ステータス: このページは en:Kernel/Arch build system の翻訳バージョンです。最後の翻訳日は 2023-06-04 です。もし英語版に 変更 があれば、翻訳の同期を手伝うことができます。