「カーネル/Arch build system」の版間の差分

提供: ArchWiki
ナビゲーションに移動 検索に移動
(アップデートを翻訳して追加)
(2023-09-08版に同期)
 
(4人の利用者による、間の14版が非表示)
1行目: 1行目:
 
[[Category:カーネル]]
 
[[Category:カーネル]]
 
[[de:Eigenen Kernel erstellen]]
 
[[de:Eigenen Kernel erstellen]]
[[en:Kernels/Arch Build System]]
+
[[en:Kernel/Arch build system]]
[[it:Kernels/Arch Build System]]
+
[[ru:Kernel (Русский)/Arch Build System]]
[[ru:Kernels/Arch Build System]]
+
[[zh-hans:Kernel/Arch Build System]]
  +
[[Arch Build System]] を使うことで、公式の {{Pkg|linux}} パッケージをベースにカスタムカーネルをビルドすることができます。このコンパイル方法は全体のプロセスを自動化でき、よくテストされたパッケージに基づいています。PKGBUILD を編集することでカスタムカーネルの設定や[[パッチ]]の追加が可能です。
[[zh-hans:Kernels/Arch Build System]]
 
[[Arch Build System]] を使うことで、公式の {{Pkg|linux}} パッケージをベースにカスタムカーネルを作成することができます。このコンパイル方法は全体のプロセスを自動化でき、よくテストされたパッケージに基づいています。PKGBUILD を編集することでカスタムカーネルの設定やパッチの追加が可能です。
 
   
==材料の入手==
+
== 材料の入手 ==
   
[[makepkg]] を使用するため、以下のベストプラクティスに従ってください。例えば、makepkg を root あるいは sudo で実行することはできません。したがって、まずはホームディレクトリに {{ic|build}} ディレクトリを作成してください:
+
[[makepkg]] を使用するので、以下のベストプラクティスに従ってください。例えば、makepkg を [[root ユーザ]]として実行することはできません。したがって、まずはホームディレクトリに {{ic|build}} ディレクトリを作成してください:
$ cd ~/
 
$ mkdir build
 
$ cd build/
 
   
  +
$ mkdir ~/build/
{{Pkg|asp}} パッケージと {{Grp|base-devel}} パッケージグループを[[インストール]]してください。
 
  +
$ cd ~/build/
   
  +
パッケージ {{Pkg|devtools}} と {{Pkg|base-devel}} を[[インストール]]してください。
それからカスタマイズの起点になる綺麗なカーネルが必要になります。ABS からカーネルパッケージファイルを取得してください:
 
   
  +
カスタマイズを開始するには、クリーンなカーネルが必要です。以下を実行して、[[Arch Build System#PKGBUILD ソースを取得する|git を使って PKGBUILD ソースを取得]]し、他のいくつかのファイルも取得してください:
$ ASPROOT=. asp checkout linux
 
   
  +
$ pkgctl repo clone --protocol=https linux
その後に、必要なファイル (例: カスタム設定ファイル, パッチ, etc.) を各自のソースから手に入れて下さい。
 
   
  +
この時点で、ディレクトリツリーは以下のようになります(他にもいくつかファイルがあるかもしれません)
==PKGBUILD の修正==
 
PKGBUILD {{ic|pkgbase}} をあなたのカスタムパッケージの名前に変えて下さい、例えば:
 
pkgbase=linux-custom
 
   
  +
{{bc|~/build/linux/-+
PKGBUILD によっては {{ic|linux.install}} の名前も {{ic|pkgbase}} にあわせて変更する必要があります (例: {{Pkg|linux-hardened}})。
 
  +
+--config
  +
\__PKGBUILD
  +
}}
   
  +
その後、必要なファイル (例:カスタム設定ファイル、パッチなど) をそれぞれのソースから取得してください。
{{Warning|{{ic|linux}} を {{ic|provides}} 配列に '''追加しないでください''' カスタムカーネルは、そのカーネルに対して構築されたバイナリモジュールと互換性がないため、その依存関係を満たすことはできません。 同様に、同様の理由で、ヘッダーパッケージの {{ic|provides}} 配列に {{ic|linux-headers}} を追加しないでください。}}
 
  +
  +
== PKGBUILD の修正 ==
  +
  +
PKGBUILD を編集して、{{ic|pkgbase}} パラメータをあなたのカスタムパッケージの名前に変えて下さい、例えば:
  +
  +
{{hc|PKGBUILD|2=
  +
pkgbase=linux-custom}}
  +
  +
{{Warning|{{ic|linux}} を {{ic|provides}} 配列に '''追加しないでください'''。カスタムカーネルは、そのカーネルに対して構築されたバイナリモジュールと互換性がないため、その依存関係を満たすことはできません。 同様に、同様の理由で、ヘッダーパッケージの {{ic|provides}} 配列に {{ic|linux-headers}} を追加しないでください。}}
   
 
=== ドキュメントの作成を避ける ===
 
=== ドキュメントの作成を避ける ===
   
長い [https://wiki.archlinux.jp/index.php/%E3%82%AB%E3%83%BC%E3%83%8D%E3%83%AB/%E3%82%B3%E3%83%B3%E3%83%91%E3%82%A4%E3%83%AB/Arch_Build_System#.E3.82.B3.E3.83.B3.E3.83.91.E3.82.A4.E3.83.AB コンパイル] 作業の大部分は、ドキュメントの作成に費やされています。 20205月の時点で、PKGBUILDへの次のパッチはその作成を回避します
+
長い[[#コンパイル|コンパイル]]作業の大部分は、ドキュメントの作成に費やされています。2022825日の時点で、PKGBUILD への次のパッチにより作成を回避します:
   
 
{{bc|1=
 
{{bc|1=
  +
63c63
64d64
 
< make htmldocs
+
< make htmldocs all
  +
---
188c188
 
  +
> make all
  +
195c195
 
< pkgname=("$pkgbase" "$pkgbase-headers" "$pkgbase-docs")
 
< pkgname=("$pkgbase" "$pkgbase-headers" "$pkgbase-docs")
 
---
 
---
 
> pkgname=("$pkgbase" "$pkgbase-headers")
 
> pkgname=("$pkgbase" "$pkgbase-headers")
 
}}
 
}}
このパッチは行#64 を削除し、行#188 を変更します。 PKGBUILD ファイルが正しく適用されない場合は、手動で編集する必要がある場合があります。
 
   
  +
このパッチは行#63 と行#195 を変更します。 PKGBUILD ファイルが正しく適用されない場合は、手動で編集する必要がある場合があります。
===prepare() の変更===
 
   
  +
=== prepare() の変更 ===
prepare 関数で、必要なカーネルパッチをあてたりカーネルのビルド設定を変更できます。
 
   
  +
{{ic|prepare()}} 関数では、[[パッケージにパッチを適用#パッチの適用|パッチの適用]] やカーネルビルドの設定を変更することができます。
変更するコンフィグオプションが少ないときは、ソース内のコンフィグファイルを編集してください。既存のコンフィグファイルを、64ビット環境の場合は {{ic|config.x86_64}} に32ビット環境の場合は {{ic|config}} にコピーします。
 
  +
[https://gitlab.archlinux.org/archlinux/packaging/packages/linux/-/commit/fbf5b3b8adaf4274e53f35634124e1c3d2e4d328 2018-08-01]以降、PKGBUILDは自動的にソース内の{{ic|*.patch}}ファイルを適用します。
  +
  +
もし、いくつかの設定を変更する必要があるなら、ソースの {{ic|config}} を編集することができます。
  +
  +
また、GUI ツールを使ってオプションを調整することもできます。PKGBUILD の prepare() 関数に {{ic|make olddefconfig}} とコメントし、好きなツールを追加してください (利用可能な設定ターゲットをすべてリストアップするには {{ic|make help}} を実行してください):
   
また GUI ツールを使ってオプションを設定することも可能です。PKGBUILD の prepare() 関数内にある候補のどれかをアンコメントしてください、例えば:
 
 
{{hc|PKGBUILD|
 
{{hc|PKGBUILD|
 
...
 
...
  +
msg2 "Setting config..."
# load configuration
 
  +
cp ../config .config
# Configure the kernel. Replace the line below with one of your choice.
 
  +
#make olddefconfig
  +
  +
make nconfig # new CLI menu for configuration
 
#make menuconfig # CLI menu for configuration
 
#make menuconfig # CLI menu for configuration
make nconfig # new CLI menu for configuration
+
#make xconfig # X-based configuration
  +
#make oldconfig # using old config from previous kernel version
#make xconfig # X-based configuration
 
#make oldconfig # using old config from previous kernel version
 
 
# ... or manually edit .config
 
# ... or manually edit .config
  +
make prepare
 
...
 
...
 
}}
 
}}
   
{{Warning|systemd には特定のユースケース (例: UEFI) の場合や特定の systemd の機能 (例: bootchart) を使用するために、設定する必要があるカーネルコンフィグが多数存在します。正しく設定しないとシステムの調子がおかしくなったり全く使えなくなったりします。必須あるいは推奨されているカーネルコンフィグのリストは {{ic|/usr/share/doc/systemd/README}} に書かれています。コンパイルする前によく確認してください。必要なコンフィグはときどき変わっています。Arch では基本的に公式カーネルを使用することになっているので、要件が変わってもアナウンスはされません。新しいバージョンの systemd をインストールする前に、リリースノートをチェックして使用しているカスタムカーネルが新しい systemd の要件を満たしているか確認してください。}}
+
{{Warning|systemd には、汎用的なユースケース、特定のユースケース (例: UEFI)特定の systemd の機能 (例: bootchart) を使用するために、設定する必要があるカーネルコンフィグが多数存在します。正しく設定しないとシステムの調子がおかしくなったり全く使えなくなったりします。必須あるいは推奨されているカーネルコンフィグのリストは {{ic|/usr/share/doc/systemd/README}} に書かれています。コンパイルする前によく確認してください。必要なコンフィグはときどき変わっています。Arch では基本的に公式カーネルを使用することになっているので、要件が変わってもアナウンスはされません。新しいバージョンの systemd をインストールする前に、リリースノートをチェックして使用しているカスタムカーネルが新しい systemd の要件を満たしているか確認してください。}}
   
==== 既存の .config ロード ====
+
=== 新しいチェックサム生成 ===
   
  +
[[#prepare() の変更]] では、{{ic|$_srcname/.config}} への変更の可能性を示唆しています。 このパスはパッケージファイルのダウンロードが終了した場所ではないため、そのチェックサムは makepkg によってチェックされませんでした (実際は {{ic|$_srcname/../../config}} をチェックしました)。
カーネルの {{ic|.config}} ファイルをすでに持っている場合は、{{ic|nconfig}} などのインタラクティブな設定ツールをアンコメントして、ツールを使って {{ic|.config}} をロードできます。こうすれば他の方法で発生するカーネルの名前付けの問題を避けられます。
 
   
  +
makepkg を実行する前に、ダウンロードした {{ic|config}} を別の設定ファイルに置き換えた場合は、{{Pkg|pacman-contrib}} パッケージを[[インストール]]し、以下を実行して新しいチェックサムを生成してください:
{{Note|prepare() の 'make menuconfig' をアンコメントして使用し、menuconfig の gui を使って既存のコンフィグをロードした場合、作例されたパッケージでファイルが衝突する問題が発生します。これは PKGBUILD によってユニークなインストールパスに変更を加えられたデフォルトのコンフィグが上書きされるのが原因であり、特に LOCALVERSION と LOCALVERSION_AUTO コンフィグオプションが問題になります。この問題を修正するには、menuconfig で LOCALVERSION をカスタムカーネルの名前にリセットして LOCALVERSION_AUTO&#61;n を設定してください。詳しくは、https://bbs.archlinux.org/viewtopic.php?id&#61;173504 を参照。}}
 
   
===新しいチェックサムを生成===
 
[https://wiki.archlinux.jp/index.php/%E3%82%AB%E3%83%BC%E3%83%8D%E3%83%AB/%E3%82%B3%E3%83%B3%E3%83%91%E3%82%A4%E3%83%AB/Arch_Build_System#prepare.28.29_.E3.81.AE.E5.A4.89.E6.9B.B4 Changing prepare()] は、{{ic|$_srcname/.config}} への変更の可能性を示唆しています。 このパスはパッケージファイルのダウンロードが終了した場所ではないため、そのチェックサムは makepkg によってチェックされませんでした(実際の場所は {{ic|$_srcname/../../config}} をチェックしてください)
 
 
makepkg を実行する前に、ダウンロードした {{ic|config}} を別の設定ファイルに置き換えた場合は、 [インストール] {{Pkg|pacman-contrib}} パッケージ。
 
次のコマンドを実行すると、新しいチェックサムが生成されます。
 
 
$ updpkgsums
 
$ updpkgsums
   
==コンパイル==
+
== コンパイル ==
   
普通パッケージと同じビルドコマンド ({{ic|makepkg}}) を使ってカーネルをコンパイル
+
これで、いつものコマンド {{ic|makepkg}} を使って、あなたのカーネルをコンパイルできるようになりした
   
 
カーネルパラメータの設定に (menuconfig などの) インタラクティブなプログラムを選んだ場合は、コンパイル中に設定を行ってください。
 
カーネルパラメータの設定に (menuconfig などの) インタラクティブなプログラムを選んだ場合は、コンパイル中に設定を行ってください。
88行目: 98行目:
 
{{ic|-s}} パラメータによって xml やドキュメントなど最近のカーネルが必要とする依存パッケージがダウンロードされます。
 
{{ic|-s}} パラメータによって xml やドキュメントなど最近のカーネルが必要とする依存パッケージがダウンロードされます。
   
{{Tip|
+
{{Note|
 
* カーネルソースは [https://www.kernel.org/signature.html#kernel-org-web-of-trust PGP 署名] が付いており、makepkg は署名を検証します。詳しくは [[Makepkg#署名チェック]]を見てください。
 
* カーネルソースは [https://www.kernel.org/signature.html#kernel-org-web-of-trust PGP 署名] が付いており、makepkg は署名を検証します。詳しくは [[Makepkg#署名チェック]]を見てください。
* マルチコアのシステムでは[[Makepkg#MAKEFLAGS|複数のコンパイルジョブを同時に実行する]]ことでコンパイル時間を大幅に削減することが可能です。}}
+
* ハードウェアのパフォーマンスによっては、コンパイルに数時間かかる可能性があります。マルチコアのシステムでは[[Makepkg#並列コンパイル|複数のコンパイルジョブを同時に実行する]]ことでコンパイル時間を大幅に削減することが可能です。
  +
* 上記の {{ic|makepkg}} を {{ic|time}} コマンドを使って実行すれば、コンパイルにどれだけの時間が掛かったのかを知ることができます。
  +
}}
   
==インストール==
+
== インストール ==
''makepkg'' が終わったら {{ic|linux.install}} ファイルの変数が変わっているのが見て取れるはずです。
 
   
  +
コンパイルのステップを終えると、{{ic|~/build/linux}} フォルダ内に 2 つのパッケージが作成されています。1 つはカーネルで、もう一つはカーネルのヘッダファイル群です。これらは以下のような名前かもしれません:
後は、pacman (もしくは pacman に代わるプログラム) で通常通りにパッケージをインストールするだけです。カスタムカーネルで必要となる ([[NVIDIA#カスタムカーネル|nvidia]] ドライバーをインストールするときなど) カーネルヘッダーを先にインストールすると良いでしょう:
 
# pacman -U ''kernel-headers_package''
 
# pacman -U ''kernel_package''
 
   
  +
linux-custom-5.8.12-x86_64.pkg.tar.zst
==ブートローダー==
 
  +
linux-custom-headers-5.8.12-x86_64.pkg.tar.zst
これであなたのカスタムカーネルのフォルダとファイルが作成されました、例: {{ic|/boot/vmlinuz-linux-test}}。あなたのカーネルをテストするには、[[ブートローダー]]の設定ファイルを更新してカスタムカーネルに対応する新しいエントリ ('default' や 'fallback') を追加してください。''PKGBUILD の pkgbase'' でカーネルの名前を変更した場合は pacman でインストールする前に ''$build/pkg/kernel/etc'' の {{ic|initramfs.img}} の名前を変える必要があります。そうすれば標準のカーネルとカスタムカーネルを選択できるようになります。
 
  +
  +
ベストプラクティスは、両方のパッケージを一緒に[[インストール]]することです。両方とも必要になるかもしれませんから (例えば [[DKMS]]):
  +
  +
# pacman -U ''linux-custom-headers-5.8.12-x86_64.pkg.tar.zst'' ''linux-custom-5.8.12-x86_64.pkg.tar.zst''
  +
  +
(先のフォルダ内にあるファイルの実際の名前に置き換えてください)
  +
  +
== ブートローダー ==
  +
  +
新しいカーネルをデフォルトのカーネルと共存させるために {{ic|pkgbase}} を変更した場合、ブートローダーの設定ファイルを更新し、関連する initramfs イメージとカスタムカーネルの新しいエントリ ('default' と 'fallback') を追加する必要があります。
   
 
== アップデート ==
 
== アップデート ==
更新したい arch kernel source を持っていると仮定すると、そのための一つの方法は https://git.archlinux.org/linux.git を使うことです。以下では、カーネルソースの最上位ディレクトリを ~/build/linux/ とします。
 
   
  +
更新したい arch kernel source を持っていると仮定すると、そのための一つの方法は https://github.com/archlinux/linux を使うことです。以下では、カーネルソースの最上位ディレクトリを {{ic|~/build/linux/}} とします。
一般に、arch は2つのローカル git リポジトリを持つ arch kernel source を設定します。archlinux-linux/ にあるのは、git://git.archlinux.org/linux.git を指しているローカルの裸の git リポジトリです。もう一つは '''src/'''archlinux-linux/ にあり、最初のリポジトリから取り出します。可能なローカルパッチとビルドについては、 '''src/'''archlinux-linux/ を参照してください。 archlinux-linux/ と '''src/'''archlinux-linux/ ディレクトリの名前が異なることに注意してください。
 
   
  +
一般に、arch は2つのローカル git リポジトリを持つ arch kernel source を設定します。{{ic|archlinux-linux/}} にあるのは、{{ic|<nowiki>https://github.com/archlinux/linux.git</nowiki>}} を指しているローカルの裸の [[git]] リポジトリです。もう一つは {{ic|'''src/'''archlinux-linux/}} にあり、最初のリポジトリから取り出します。可能なローカルパッチとビルドは、{{ic|'''src/'''archlinux-linux/}} にあると期待されます。
$ cd ~/build/linux/archlinux-linux/
 
  +
  +
この例では、{{ic|archlinux-linux/}} にローカルにインストールされた bare git リポジトリソースの HEAD が最初に指されています:
  +
  +
{{hc|1=
  +
$ cd ~/build/linux/archlinux-linux/
  +
$ git log --oneline --max-count 1 HEAD|2=
  +
4010b622f1d2 Merge branch 'dax-fix-5.3-rc3' of <nowiki>git://git.kernel.org/pub/scm/linux/kernel/git/nvdimm/nvdimm</nowiki>
  +
}}
   
この例では、archlinux-linux/ にローカルにインストールされた bare git リポジトリソースの HEAD が最初に指されています
 
{{bc|
 
$ 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の間のどこかにあります。
 
v5.2.5-arch1とv5.2.6-arch1の間のどこかにあります。
  +
 
$ git fetch --verbose
 
$ git fetch --verbose
  +
 
取得した新しいタグを出力するため、最新の archlinux タグである v5.2.7-arch1 をフェッチしたことがわかります。 新しいタグが取得されなかった場合、利用可能な新しい archlinux ソースはありません。
 
取得した新しいタグを出力するため、最新の archlinux タグである v5.2.7-arch1 をフェッチしたことがわかります。 新しいタグが取得されなかった場合、利用可能な新しい archlinux ソースはありません。
   
 
これで、実際のビルドが行われる場所でソースを更新できます。
 
これで、実際のビルドが行われる場所でソースを更新できます。
  +
{{bc|
 
$ cd ~/build/linux/src/archlinux-linux/
+
$ cd ~/build/linux/src/archlinux-linux/
$ git checkout master
+
$ git checkout master
$ git pull
+
$ git pull
$ git fetch --tags --verbose
+
$ git fetch --tags --verbose
$ git branch --verbose 5.2.7-arch1 v5.2.7-arch1
+
$ git branch --verbose 5.2.7-arch1 v5.2.7-arch1
$ git checkout 5.2.7-arch1
+
$ git checkout 5.2.7-arch1
}}
 
   
 
次のような方法で状況が進んでいることを確認できます
 
次のような方法で状況が進んでいることを確認できます
  +
{{bc|1=
 
$ git log --oneline 5.2.7-arch1 --max-count=7
+
{{hc|1=$ git log --oneline 5.2.7-arch1 --max-count=7|2=
 
13193bfc03d4 '''Arch Linux kernel v5.2.7-arch1'''
 
13193bfc03d4 '''Arch Linux kernel v5.2.7-arch1'''
 
9475c6772d05 netfilter: nf_tabf676926c7f60les: fix module autoload for redir
 
9475c6772d05 netfilter: nf_tabf676926c7f60les: fix module autoload for redir
138行目: 161行目:
 
5697a9d3d55f '''Linux 5.2.7'''
 
5697a9d3d55f '''Linux 5.2.7'''
 
}}
 
}}
これは、ArchLinux カーネル v5.2.7-arch1 と Linux5.2.7 の間のいくつかの特定の archlinux パッチを示しています。 ここで重要なのは、 ArchLinux カーネル v5.2.7-arch1 と Linux5.2.7 です。 明らかに、他のバージョンには他のパッチがある可能性があります。そのため、 {{ic|--max-count}} の 7 を調整する必要があります。 同様に、f676926c7f60などのコミット識別子やカーネルバージョンは、他のバージョンでは異なります。
 
   
  +
これは、{{ic|Arch Linux kernel v5.2.7-arch1}} と {{ic|Linux 5.2.7}} の間のいくつかの特定の archlinux パッチを示しています。
最新の PKGBUILD、および archlinux カーネル構成ファイルは、 {{ic|asp}} コマンドで取得できます。
 
   
  +
最新の PKGBUILD および archlinux カーネルのコンフィグレーションファイルは、{{ic|git}} を使ってパッケージディレクトリへ取得できます:
{{bc|
 
  +
$ cd ~/build/linux/
 
$ asp update linux
+
$ cd ~/build/linux/
  +
$ git pull
$ asp export linux
 
  +
}}
 
  +
{{ic|~/build/linux/linux/*}} 内のファイルを {{ic|~/build/linux/}} へ[[Vim#ファイルのマージ|マージする]]必要があります。マージは手動で行うことができますし、[[アプリケーション一覧#Comparison, diff, merge|特定のユーティリティ]]を使うこともできます。[[#prepare() の変更]] を見て、PKGBUILD::prepare() のシェルコマンドを (全てではないにしろ) ほぼ全て手動で実行してください。
  +
  +
この時点で、 {{ic|makepkg--verifysource}} は成功するはずです。[[#コンパイル]] の時には、{{ic|makepkg}} {{ic|--noextract}} オプションも追加してください。これによりソースが makepkg --nobuild によって抽出されたかのようにパッケージをビルドできるはずです。そして [[#インストール]] に戻ります。
  +
  +
=== クリーンアップ ===
  +
  +
マージした後、{{ic|~/build/linux/linux/}} を削除したい場合があるでしょう。{{ic|~/build/linux/src/archlinux}} は、より新しい更新がこの方法で行われた場合、{{ic|5.2.7-arch1}} の形でブランチを蓄積します。 これらは以下で削除することができます:
  +
  +
$ cd ~/build/linux/src/archlinux
  +
$ git branch --delete --force --verbose 5.2.7-arch1
   
  +
== 参照 ==
{{note|{{ic|asp}} コマンドは、新しい archlinux ソースタグがあっても Linux ファイルを更新しない場合があります。 考えられる理由は、archlinuxlinux ファイルが archlinuxlinux ソースより遅れていることです。}}
 
ここで、 {{ic|~/build/linux/linux/*}} にある [https://wiki.archlinux.jp/index.php/Vim#.E3.83.95.E3.82.A1.E3.82.A4.E3.83.AB.E3.81.AE.E3.83.9E.E3.83.BC.E3.82.B8_.28vimdiff.29 Vim#Mergingfiles] を {{ic|~/build/linux/}} に配置する必要があります。 マージは手動で、または [https://wiki.archlinux.jp/index.php/%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E4%B8%80%E8%A6%A7#Comparison.2C_diff.2C_merge Comparison、diff、merge] を使用して行うこともできます。 [https://wiki.archlinux.jp/index.php?title=%E3%82%AB%E3%83%BC%E3%83%8D%E3%83%AB/%E3%82%B3%E3%83%B3%E3%83%91%E3%82%A4%E3%83%AB/Arch_Build_System&action=submit#prepare.28.29_.E3.81.AE.E5.A4.89.E6.9B.B4 #Changing prepare()] を確認し、 PKGBUILD::prepare() のシェルコマンドのすべてではないにしてもほとんどを手動で実行します。
 
   
  +
* https://docs.kernel.org/kbuild/kconfig.html とその親ディレクトリ
この時点で、 {{ic|makepkg--verifysource}} は成功するはずです。 [https://wiki.archlinux.jp/index.php?title=%E3%82%AB%E3%83%BC%E3%83%8D%E3%83%AB/%E3%82%B3%E3%83%B3%E3%83%91%E3%82%A4%E3%83%AB/Arch_Build_System&action=submit#.E3.82.B3.E3.83.B3.E3.83.91.E3.82.A4.E3.83.AB #コンパイル] の時には、 {{ic|makepkg}} --noextract オプションも追加してください、これによりソースが makepkg --nobuild によって抽出されたかのようにパッケージをビルドできるはずです。 [https://wiki.archlinux.jp/index.php?title=%E3%82%AB%E3%83%BC%E3%83%8D%E3%83%AB/%E3%82%B3%E3%83%B3%E3%83%91%E3%82%A4%E3%83%AB/Arch_Build_System&action=submit#.E3.82.A4.E3.83.B3.E3.82.B9.E3.83.88.E3.83.BC.E3.83.AB #インストール] に戻ります。
 
   
  +
{{TranslationStatus|Kernel/Arch build system|2023-06-04|780280}}
==参照==
 
* https://kernel.org/doc/Documentation/kbuild/kconfig.txt
 

2023年9月27日 (水) 21:29時点における最新版

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() 関数では、パッチの適用 やカーネルビルドの設定を変更することができます。 2018-08-01以降、PKGBUILDは自動的にソース内の*.patchファイルを適用します。

もし、いくつかの設定を変更する必要があるなら、ソースの 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 です。もし英語版に 変更 があれば、翻訳の同期を手伝うことができます。