カーネル/Arch build system

提供: ArchWiki
2021年2月13日 (土) 17:08時点におけるKgx (トーク | 投稿記録)による版 (→‎参照: リンクを更新)
ナビゲーションに移動 検索に移動

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)。

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

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

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

64d64
<   make htmldocs
188c188
< pkgname=("$pkgbase" "$pkgbase-headers" "$pkgbase-docs")
---
> pkgname=("$pkgbase" "$pkgbase-headers")

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

prepare() の変更

prepare 関数で、必要なカーネルパッチをあてたりカーネルのビルド設定を変更できます。

変更するコンフィグオプションが少ないときは、ソース内のコンフィグファイルを編集してください。既存のコンフィグファイルを、64ビット環境の場合は config.x86_64 に32ビット環境の場合は config にコピーします。

また GUI ツールを使ってオプションを設定することも可能です。PKGBUILD の prepare() 関数内にある候補のどれかをアンコメントしてください、例えば:

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

既存の .config をロード

カーネルの .config ファイルをすでに持っている場合は、nconfig などのインタラクティブな設定ツールをアンコメントして、ツールを使って .config をロードできます。こうすれば他の方法で発生するカーネルの名前付けの問題を避けられます。

ノート: prepare() の 'make menuconfig' をアンコメントして使用し、menuconfig の gui を使って既存のコンフィグをロードした場合、作例されたパッケージでファイルが衝突する問題が発生します。これは PKGBUILD によってユニークなインストールパスに変更を加えられたデフォルトのコンフィグが上書きされるのが原因であり、特に LOCALVERSION と LOCALVERSION_AUTO コンフィグオプションが問題になります。この問題を修正するには、menuconfig で LOCALVERSION をカスタムカーネルの名前にリセットして LOCALVERSION_AUTO=n を設定してください。詳しくは、https://bbs.archlinux.org/viewtopic.php?id=173504 を参照。

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

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/etcinitramfs.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
ノート: asp コマンドは、新しい archlinux ソースタグがあっても Linux ファイルを更新しない場合があります。 考えられる理由は、archlinuxlinux ファイルが archlinuxlinux ソースより遅れていることです。

ここで、 ~/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

参照