カーネル/Arch build system
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 とその親ディレクトリ