Ubuntu Weekly Recipe

第578回 メインラインカーネルにパッチをあてる

この記事を読むのに必要な時間:およそ 6 分

カーネルパッケージをビルドする

カーネルパッケージをビルドする方法は,ホスト上で直接ビルドする方法とパッケージをクリーンビルドする方法の2種類が存在します。

ホスト上で直接ビルドを行いたい場合

ホスト上で直接ビルドする場合,準備さえ行えば第333回と対して違いはありません。

まずあらかじめメインラインビルド用のオプションを有効化しておきます。

$ export do_mainline_build=true

これによりメインラインビルドでは対応しにくいいくつかの機能が無効化されます。ZFSなども無効化されるので,これが無効化されると困る場合は上記設定をせずにビルドできるよう適宜調整してください。

あとは次の手順でもろもろのパッケージをビルドするだけです。

debian/controlやビルドディレクトリのセットアップ
$ fakeroot debian/rules clean

アーキテクチャに依存するパッケージのビルド
$ fakeroot debian/rules binary-generic

アーキテクチャに依存しないパッケージのビルド
$ fakeroot debian/rules binary-indep

これにより次のようなパッケージが作られます。

linux-buildinfo-5.2.0-050200-generic_5.2.0-050200.201907072331_amd64.deb
linux-cloud-tools-common_5.2.0-050200.201907072331_all.deb
linux-doc_5.2.0-050200.201907072331_all.deb
linux-headers-5.2.0-050200-generic_5.2.0-050200.201907072331_amd64.deb
linux-headers-5.2.0-050200_5.2.0-050200.201907072331_all.deb
linux-image-unsigned-5.2.0-050200-generic_5.2.0-050200.201907072331_amd64.deb
linux-modules-5.2.0-050200-generic_5.2.0-050200.201907072331_amd64.deb
linux-source-5.2.0_5.2.0-050200.201907072331_all.deb
linux-tools-common_5.2.0-050200.201907072331_all.deb
linux-tools-host_5.2.0-050200.201907072331_all.deb

普通に使うだけなら,linux-image-unsignedとlinux-modulesのみがあれば十分です。DKMSを使うならlinux-headersも必要になります。Hyper-Vなどの上で使うなら,linux-cloud-toolsが必要になるでしょう。

ちなみにカーネルパッケージはバージョン名まで含めてパッケージ名になります。これは複数のバージョンを共存してインストールするための措置です。

パッケージとしてクリーンビルドしたい場合

パッケージとしてクリーンビルドしたい場合は,まずソースパッケージを作る必要があります。ソースパッケージを作るためにはdebianディレクトリを構築する必要があるのですが,カーネルの場合はまずdebian/rules cleanを実行する必要があるのです。

$ fakeroot debian/rules clean

あとは次のコマンドでソースパッケージを構築できます。

$ debuild -S -d --no-tgz-check -uc -us

-dオプションはBuild-Dependsなパッケージがインストールされているかどうかをチェックしないためのオプションです。これがないとapt build-dep linuxなどによりビルドに必要なパッケージをインストールしていない環境ではエラーになります。

--no-tgz-checkはソースコードのアーカイブがあるかどうかをチェックしないためのオプションです。今回はgitをクローンしたので,ソースコードのアーカイブは自前で生成する必要があります。よってこのオプションを付けて,確認なしに自動的に作ってもらいます。

-uc -usはソースパッケージやchangesファイルに署名しないオプションです。ローカルでビルドしてローカルでインストールするなら署名は不要です。最終的にPPAなどを利用する場合は,このオプションを外して署名してください。署名をする場合は,GPG鍵を用意したりdebian/changelogを更新したりといろいろ事前設定が必要です。詳細は本連載の第46回などを参照してください。

pbuilderを使う場合,メインラインビルド用の環境変数は~/.pbuilderrcに書く必要があります。

$ echo "export do_mainline_build=true" >> ~/.pbuilderrc

ようやく準備が整いましたのでビルドしてみましょう。

$ pbuilder-dist bionic build --use-network yes ../linux_5.2.0-050200.201907072331.dsc

ホストで直接ビルドするときに比べるとこちらはフルビルドになるため,時間もかかります。また,多くのパッケージが作られます。ちなみに成果物は~/pbuilder/bionic_result/に作られます。

Debianパッケージのみに限定すれば次のような感じです。

linux-buildinfo-5.2.0-050200-generic_5.2.0-050200.201907072331_amd64.deb
linux-buildinfo-5.2.0-050200-lowlatency_5.2.0-050200.201907072331_amd64.deb
linux-cloud-tools-common_5.2.0-050200.201907072331_all.deb
linux-doc_5.2.0-050200.201907072331_all.deb
linux-headers-5.2.0-050200-generic_5.2.0-050200.201907072331_amd64.deb
linux-headers-5.2.0-050200-lowlatency_5.2.0-050200.201907072331_amd64.deb
linux-headers-5.2.0-050200_5.2.0-050200.201907072331_all.deb
linux-image-unsigned-5.2.0-050200-generic_5.2.0-050200.201907072331_amd64.deb
linux-image-unsigned-5.2.0-050200-lowlatency_5.2.0-050200.201907072331_amd64.deb
linux-libc-dev_5.2.0-050200.201907072331_amd64.deb
linux-modules-5.2.0-050200-generic_5.2.0-050200.201907072331_amd64.deb
linux-modules-5.2.0-050200-lowlatency_5.2.0-050200.201907072331_amd64.deb
linux-source-5.2.0_5.2.0-050200.201907072331_all.deb
linux-tools-common_5.2.0-050200.201907072331_all.deb
linux-tools-host_5.2.0-050200.201907072331_all.deb

ホストで直接ビルドしたときと同じく,普通に使うだけなら,linux-image-unsignedとlinux-modulesのみがあれば十分です※3⁠。DKMSを使うならlinux-headersも必要になります。Hyper-Vなどの上で使うなら,linux-cloud-toolsが必要になるでしょう。

※3
do_mainline_buildをtrueにしなかった場合は,do_extras_packageがtrueになります。このときlinux-modulesの一部はlinux-modules-extraに分離されます。大抵の利用環境においては,linux-modules-extraのパッケージも必要になるので注意してください。

おまけ:LXD上でビルドしたい場合

カーネルのビルドにはさまざまなパッケージのインストールが必要です。ホスト環境をできるだけきれいかつシンプルに保ちたいなら,カーネルのビルドもLXDのコンテナ上で行いたいことでしょう。

ホスト上で直接ビルドするケースなら,LXDのコンテナをそのまま利用できます。もしpbuilderを利用するケースなら,追加でコンテナに次の設定が必要です。

$ lxc config set builder security.privileged true
$ lxc config set builder security.nesting true
$ lxc restart builder

ここではコンテナ名を「builder」と仮定しています。必要に応じて変更してください。一度ビルドした環境を第574回で紹介している方法でスナップショットをとっておいたり,他のマシンにインスタンスをコピーしておけば,gitのクローンなどの時間が省けて便利です。

著者プロフィール

柴田充也(しばたみつや)

Ubuntu Japanese Team Member株式会社 創夢所属。数年前にLaunchpad上でStellariumの翻訳をしたことがきっかけで,Ubuntuの翻訳にも関わるようになりました。