「カーネル/Arch build system」の版間の差分
(PKGBUILD へのパッチ内容を英文Wiki記述の2022年8月25日時点の記述に変更。) |
(2023-09-08版に同期) |
||
(2人の利用者による、間の7版が非表示) | |||
1行目: | 1行目: | ||
[[Category:カーネル]] |
[[Category:カーネル]] |
||
[[de:Eigenen Kernel erstellen]] |
[[de:Eigenen Kernel erstellen]] |
||
− | [[en: |
+ | [[en:Kernel/Arch build system]] |
− | [[ |
+ | [[ru:Kernel (Русский)/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]] を使用するので、以下のベストプラクティスに従ってください。例えば、makepkg を [[root ユーザ]]として実行することはできません。したがって、まずはホームディレクトリに {{ic|build}} ディレクトリを作成してください: |
− | $ mkdir build |
||
− | $ cd build/ |
||
+ | $ mkdir ~/build/ |
||
− | {{Pkg|asp}} パッケージと {{Grp|base-devel}} パッケージグループを [[インストール]] します。 |
||
+ | $ cd ~/build/ |
||
+ | パッケージ {{Pkg|devtools}} と {{Pkg|base-devel}} を[[インストール]]してください。 |
||
− | カスタマイズを開始するには、クリーンなカーネルが必要です。[[Arch Build System#Git を使って PKGBUILD ソースを取得|Git を使って PKGBUILD ソースを取得]] といくつかのファイルをビルドディレクトリにコピーしてください。 |
||
+ | カスタマイズを開始するには、クリーンなカーネルが必要です。以下を実行して、[[Arch Build System#PKGBUILD ソースを取得する|git を使って PKGBUILD ソースを取得]]し、他のいくつかのファイルも取得してください: |
||
− | $ asp update linux |
||
+ | |||
− | $ asp export linux |
||
+ | $ pkgctl repo clone --protocol=https linux |
||
この時点で、ディレクトリツリーは以下のようになります(他にもいくつかファイルがあるかもしれません) |
この時点で、ディレクトリツリーは以下のようになります(他にもいくつかファイルがあるかもしれません) |
||
27行目: | 26行目: | ||
}} |
}} |
||
− | その後、必要なファイル (例:カスタム設定ファイル、パッチなど) をそれぞれのソースから取得し |
+ | その後、必要なファイル (例:カスタム設定ファイル、パッチなど) をそれぞれのソースから取得してください。 |
+ | |||
+ | == PKGBUILD の修正 == |
||
+ | PKGBUILD を編集して、{{ic|pkgbase}} パラメータをあなたのカスタムパッケージの名前に変えて下さい、例えば: |
||
− | ==PKGBUILD の修正== |
||
− | PKGBUILD {{ic|pkgbase}} をあなたのカスタムパッケージの名前に変えて下さい、例えば: |
||
− | pkgbase=linux-custom |
||
+ | {{hc|PKGBUILD|2= |
||
− | PKGBUILD によっては {{ic|linux.install}} の名前も {{ic|pkgbase}} にあわせて変更する必要があります (例: {{Pkg|linux-hardened}})。 |
||
+ | pkgbase=linux-custom}} |
||
− | {{Warning|{{ic|linux}} を {{ic|provides}} 配列に '''追加しないでください''' |
+ | {{Warning|{{ic|linux}} を {{ic|provides}} 配列に '''追加しないでください'''。カスタムカーネルは、そのカーネルに対して構築されたバイナリモジュールと互換性がないため、その依存関係を満たすことはできません。 同様に、同様の理由で、ヘッダーパッケージの {{ic|provides}} 配列に {{ic|linux-headers}} を追加しないでください。}} |
=== ドキュメントの作成を避ける === |
=== ドキュメントの作成を避ける === |
||
− | 長い |
+ | 長い[[#コンパイル|コンパイル]]作業の大部分は、ドキュメントの作成に費やされています。2022年8月25日の時点で、PKGBUILD への次のパッチにより作成を回避します: |
{{bc|1= |
{{bc|1= |
||
51行目: | 51行目: | ||
> pkgname=("$pkgbase" "$pkgbase-headers") |
> pkgname=("$pkgbase" "$pkgbase-headers") |
||
}} |
}} |
||
+ | |||
このパッチは行#63 と行#195 を変更します。 PKGBUILD ファイルが正しく適用されない場合は、手動で編集する必要がある場合があります。 |
このパッチは行#63 と行#195 を変更します。 PKGBUILD ファイルが正しく適用されない場合は、手動で編集する必要がある場合があります。 |
||
56行目: | 57行目: | ||
{{ic|prepare()}} 関数では、[[パッケージにパッチを適用#パッチの適用|パッチの適用]] やカーネルビルドの設定を変更することができます。 |
{{ic|prepare()}} 関数では、[[パッケージにパッチを適用#パッチの適用|パッチの適用]] やカーネルビルドの設定を変更することができます。 |
||
+ | [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() 関数に {{ic|make olddefconfig}} とコメントし、好きなツールを追加してください。 |
||
{{hc|PKGBUILD| |
{{hc|PKGBUILD| |
||
... |
... |
||
66行目: | 69行目: | ||
#make olddefconfig |
#make olddefconfig |
||
− | make nconfig # new CLI menu for configuration |
+ | make nconfig # new CLI menu for configuration |
#make menuconfig # CLI menu for configuration |
#make menuconfig # CLI menu for configuration |
||
− | #make xconfig # X-based configuration |
+ | #make xconfig # X-based configuration |
− | #make oldconfig # using old config from previous kernel version |
+ | #make oldconfig # using old config from previous kernel version |
# ... or manually edit .config |
# ... or manually edit .config |
||
make prepare |
make prepare |
||
75行目: | 78行目: | ||
}} |
}} |
||
− | {{Warning|systemd には特定のユースケース (例: UEFI) |
+ | {{Warning|systemd には、汎用的なユースケース、特定のユースケース (例: UEFI)、特定の systemd の機能 (例: bootchart) を使用するために、設定する必要があるカーネルコンフィグが多数存在します。正しく設定しないとシステムの調子がおかしくなったり全く使えなくなったりします。必須あるいは推奨されているカーネルコンフィグのリストは {{ic|/usr/share/doc/systemd/README}} に書かれています。コンパイルする前によく確認してください。必要なコンフィグはときどき変わっています。Arch では基本的に公式カーネルを使用することになっているので、要件が変わってもアナウンスはされません。新しいバージョンの systemd をインストールする前に、リリースノートをチェックして使用しているカスタムカーネルが新しい systemd の要件を満たしているか確認してください。}} |
− | ===新しいチェックサムを生成=== |
+ | === 新しいチェックサムを生成 === |
+ | |||
− | [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}} をチェックしてください) |
||
+ | [[#prepare() の変更]] では、{{ic|$_srcname/.config}} への変更の可能性を示唆しています。 このパスはパッケージファイルのダウンロードが終了した場所ではないため、そのチェックサムは makepkg によってチェックされませんでした (実際は {{ic|$_srcname/../../config}} をチェックしました)。 |
||
+ | |||
+ | makepkg を実行する前に、ダウンロードした {{ic|config}} を別の設定ファイルに置き換えた場合は、{{Pkg|pacman-contrib}} パッケージを[[インストール]]し、以下を実行して新しいチェックサムを生成してください: |
||
− | makepkg を実行する前に、ダウンロードした {{ic|config}} を別の設定ファイルに置き換えた場合は、 [インストール] {{Pkg|pacman-contrib}} パッケージ。 |
||
− | 次のコマンドを実行すると、新しいチェックサムが生成されます。 |
||
$ updpkgsums |
$ updpkgsums |
||
== コンパイル == |
== コンパイル == |
||
− | + | これで、いつものコマンド {{ic|makepkg}} を使って、あなたのカーネルをコンパイルできるようになりました。 |
|
カーネルパラメータの設定に (menuconfig などの) インタラクティブなプログラムを選んだ場合は、コンパイル中に設定を行ってください。 |
カーネルパラメータの設定に (menuconfig などの) インタラクティブなプログラムを選んだ場合は、コンパイル中に設定を行ってください。 |
||
96行目: | 100行目: | ||
{{Note| |
{{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# |
+ | * ハードウェアのパフォーマンスによっては、コンパイルに数時間かかる可能性があります。マルチコアのシステムでは[[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 |
||
144行目: | 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 |
||
− | $ asp export linux |
||
− | }} |
||
+ | $ cd ~/build/linux/ |
||
− | {{note|{{ic|asp}} コマンドは、新しい archlinux ソースタグがあっても Linux ファイルを更新しない場合があります。 考えられる理由は、archlinuxlinux ファイルが archlinuxlinux ソースより遅れていることです。}} |
||
+ | $ git pull |
||
− | ここで、 {{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() のシェルコマンドのすべてではないにしてもほとんどを手動で実行します。 |
||
+ | {{ic|~/build/linux/linux/*}} 内のファイルを {{ic|~/build/linux/}} へ[[Vim#ファイルのマージ|マージする]]必要があります。マージは手動で行うことができますし、[[アプリケーション一覧#Comparison, diff, merge|特定のユーティリティ]]を使うこともできます。[[#prepare() の変更]] を見て、PKGBUILD::prepare() のシェルコマンドを (全てではないにしろ) ほぼ全て手動で実行してください。 |
||
− | この時点で、 {{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 #インストール] に戻ります。 |
||
+ | |||
+ | この時点で、 {{ic|makepkg--verifysource}} は成功するはずです。[[#コンパイル]] の時には、{{ic|makepkg}} {{ic|--noextract}} オプションも追加してください。これによりソースが makepkg --nobuild によって抽出されたかのようにパッケージをビルドできるはずです。そして [[#インストール]] に戻ります。 |
||
=== クリーンアップ === |
=== クリーンアップ === |
||
+ | |||
− | マージした後、{{ic|~/build/linux/linux/}} を削除したい場合や。 {{ic|~/build/linux/src/archlinux}} は、より新しい更新がこの方法で行われた場合、{{ic|5.2.7-arch1}} の形式でブランチを蓄積します。 これらは以下でで削除することができます |
||
+ | マージした後、{{ic|~/build/linux/linux/}} を削除したい場合があるでしょう。{{ic|~/build/linux/src/archlinux}} は、より新しい更新がこの方法で行われた場合、{{ic|5.2.7-arch1}} の形でブランチを蓄積します。 これらは以下で削除することができます: |
||
$ cd ~/build/linux/src/archlinux |
$ cd ~/build/linux/src/archlinux |
||
$ git branch --delete --force --verbose 5.2.7-arch1 |
$ git branch --delete --force --verbose 5.2.7-arch1 |
||
− | ==参照== |
+ | == 参照 == |
+ | |||
− | * https://www.kernel.org/doc/html/latest/kbuild/kconfig.html and the parent directory |
||
+ | * https://docs.kernel.org/kbuild/kconfig.html とその親ディレクトリ |
||
+ | |||
+ | {{TranslationStatus|Kernel/Arch build system|2023-06-04|780280}} |
2023年9月27日 (水) 21:29時点における最新版
Arch Build System を使うことで、公式の linux パッケージをベースにカスタムカーネルをビルドすることができます。このコンパイル方法は全体のプロセスを自動化でき、よくテストされたパッケージに基づいています。PKGBUILD を編集することでカスタムカーネルの設定やパッチの追加が可能です。
目次
材料の入手
makepkg を使用するので、以下のベストプラクティスに従ってください。例えば、makepkg を root ユーザとして実行することはできません。したがって、まずはホームディレクトリに build
ディレクトリを作成してください:
$ mkdir ~/build/ $ cd ~/build/
パッケージ devtools と base-devel をインストールしてください。
カスタマイズを開始するには、クリーンなカーネルが必要です。以下を実行して、git を使って PKGBUILD ソースを取得し、他のいくつかのファイルも取得してください:
$ pkgctl repo clone --protocol=https linux
この時点で、ディレクトリツリーは以下のようになります(他にもいくつかファイルがあるかもしれません)
~/build/linux/-+ +--config \__PKGBUILD
その後、必要なファイル (例:カスタム設定ファイル、パッチなど) をそれぞれのソースから取得してください。
PKGBUILD の修正
PKGBUILD を編集して、pkgbase
パラメータをあなたのカスタムパッケージの名前に変えて下さい、例えば:
PKGBUILD
pkgbase=linux-custom
ドキュメントの作成を避ける
長いコンパイル作業の大部分は、ドキュメントの作成に費やされています。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 ...
新しいチェックサムを生成
#prepare() の変更 では、$_srcname/.config
への変更の可能性を示唆しています。 このパスはパッケージファイルのダウンロードが終了した場所ではないため、そのチェックサムは makepkg によってチェックされませんでした (実際は $_srcname/../../config
をチェックしました)。
makepkg を実行する前に、ダウンロードした config
を別の設定ファイルに置き換えた場合は、pacman-contrib パッケージをインストールし、以下を実行して新しいチェックサムを生成してください:
$ updpkgsums
コンパイル
これで、いつものコマンド makepkg
を使って、あなたのカーネルをコンパイルできるようになりました。
カーネルパラメータの設定に (menuconfig などの) インタラクティブなプログラムを選んだ場合は、コンパイル中に設定を行ってください。
$ makepkg -s
-s
パラメータによって xml やドキュメントなど最近のカーネルが必要とする依存パッケージがダウンロードされます。
インストール
コンパイルのステップを終えると、~/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-arch1
と Linux 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
参照
- https://docs.kernel.org/kbuild/kconfig.html とその親ディレクトリ