カーネル/Arch build system
Arch Build System を使うことで、公式の linux パッケージをベースにカスタムカーネルを作成することができます。このコンパイル方法は全体のプロセスを自動化でき、よくテストされたパッケージに基づいています。PKGBUILD を編集することでカスタムカーネルの設定やパッチの追加が可能です。
目次
材料の入手
makepkg を使用するため、以下のベストプラクティスに従ってください。例えば、makepkg を root あるいは sudo で実行することはできません。したがって、まずはホームディレクトリに build
ディレクトリを作成してください:
$ cd ~/ $ mkdir build $ cd build/
asp パッケージと base-devel パッケージグループをインストールしてください。
それからカスタマイズの起点になる綺麗なカーネルが必要になります。ABS からカーネルパッケージファイルを取得してください:
$ ASPROOT=. asp checkout linux
その後に、必要なファイル (例: カスタム設定ファイル, パッチ, etc.) を各自のソースから手に入れて下さい。
PKGBUILD の修正
PKGBUILD pkgbase
をあなたのカスタムパッケージの名前に変えて下さい、例えば:
pkgbase=linux-custom
PKGBUILD によっては linux.install
の名前も pkgbase
にあわせて変更する必要があります (例: linux-hardened)。
ドキュメントの作成を避ける
長い コンパイル 作業の大部分は、ドキュメントの作成に費やされています。 2020年5月の時点で、PKGBUILDへの次のパッチはその作成を回避します。
64d64 < make htmldocs 188c188 < pkgname=("$pkgbase" "$pkgbase-headers" "$pkgbase-docs") --- > pkgname=("$pkgbase" "$pkgbase-headers")
このパッチは行#64 を削除し、行#188 を変更します。 PKGBUILD ファイルが正しく適用されない場合は、手動で編集する必要がある場合があります。
prepare() の変更
prepare()
関数では、パッチの適用 やカーネルビルドの設定を変更することができます。
もし、いくつかの設定を変更する必要があるなら、ソースの設定ファイルを編集することができます。
また、GUI ツールを使ってオプションを調整することもできます。PKGBUILD の prepare() 関数に make olddefconfig
とコメントし、好きなツールを追加してください。
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 ...
既存の .config をロード
カーネルの .config
ファイルをすでに持っている場合は、nconfig
などのインタラクティブな設定ツールをアンコメントして、ツールを使って .config
をロードできます。こうすれば他の方法で発生するカーネルの名前付けの問題を避けられます。
新しいチェックサムを生成
Changing prepare() は、$_srcname/.config
への変更の可能性を示唆しています。 このパスはパッケージファイルのダウンロードが終了した場所ではないため、そのチェックサムは makepkg によってチェックされませんでした(実際の場所は $_srcname/../../config
をチェックしてください)
makepkg を実行する前に、ダウンロードした config
を別の設定ファイルに置き換えた場合は、 [インストール] pacman-contrib パッケージ。
次のコマンドを実行すると、新しいチェックサムが生成されます。
$ updpkgsums
コンパイル
普通のパッケージと同じビルドコマンド (makepkg
) を使ってカーネルをコンパイルします。
カーネルパラメータの設定に (menuconfig などの) インタラクティブなプログラムを選んだ場合は、コンパイル中に設定を行ってください。
$ makepkg -s
-s
パラメータによって xml やドキュメントなど最近のカーネルが必要とする依存パッケージがダウンロードされます。
インストール
makepkg が終わったら linux.install
ファイルの変数が変わっているのが見て取れるはずです。
後は、pacman (もしくは pacman に代わるプログラム) で通常通りにパッケージをインストールするだけです。カスタムカーネルで必要となる (nvidia ドライバーをインストールするときなど) カーネルヘッダーを先にインストールすると良いでしょう:
# pacman -U kernel-headers_package # pacman -U kernel_package
ブートローダー
これであなたのカスタムカーネルのフォルダとファイルが作成されました、例: /boot/vmlinuz-linux-test
。あなたのカーネルをテストするには、ブートローダーの設定ファイルを更新してカスタムカーネルに対応する新しいエントリ ('default' や 'fallback') を追加してください。PKGBUILD の pkgbase でカーネルの名前を変更した場合は pacman でインストールする前に $build/pkg/kernel/etc の initramfs.img
の名前を変える必要があります。そうすれば標準のカーネルとカスタムカーネルを選択できるようになります。
アップデート
更新したい arch kernel source を持っていると仮定すると、そのための一つの方法は https://git.archlinux.org/linux.git を使うことです。以下では、カーネルソースの最上位ディレクトリを ~/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/ ディレクトリの名前が異なることに注意してください。
$ cd ~/build/linux/archlinux-linux/
この例では、archlinux-linux/ にローカルにインストールされた bare git リポジトリソースの HEAD が最初に指されています
$ 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 カーネル v5.2.7-arch1 と Linux5.2.7 の間のいくつかの特定の archlinux パッチを示しています。 ここで重要なのは、 ArchLinux カーネル v5.2.7-arch1 と Linux5.2.7 です。 明らかに、他のバージョンには他のパッチがある可能性があります。そのため、 --max-count
の 7 を調整する必要があります。 同様に、f676926c7f60などのコミット識別子やカーネルバージョンは、他のバージョンでは異なります。
最新の PKGBUILD、および archlinux カーネル構成ファイルは、 asp
コマンドで取得できます。
$ cd ~/build/linux/ $ asp update linux $ asp export linux
ここで、 ~/build/linux/linux/*
にある Vim#Mergingfiles を ~/build/linux/
に配置する必要があります。 マージは手動で、または Comparison、diff、merge を使用して行うこともできます。 #Changing 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://www.kernel.org/doc/html/latest/kbuild/kconfig.html and the parent directory