何度か紹介しているように、
カーネルをビルドするさまざまな方法
本連載ではこれまでにも、
- 第333回
「カーネルパッケージをビルドしよう」
Ubuntuカーネルのgitリポジトリもしくはカーネルソースパッケージを利用した、Ubuntuのカーネルパッケージのビルド方法。 - 第524回
「Hades Canyon/ Kaby Lake GのdGPUを有効化する」
Ubuntuのメインラインビルドを利用したビルド済み最新カーネルのインストール方法。 - 第526回
「Ubuntuで最新のカーネルをお手軽にビルドする方法」
VanillaカーネルからDebianパッケージをビルドする方法。
個々のビルド方法についての詳細は各記事を参照してもらうことにして、
Ubuntuにおいて
- Ubuntuカーネル
-
Ubuntuで正式に採用されているカーネルもしくは採用される予定のカーネルです。特定のカーネルバージョンに対して、
各種Ubuntuに必要なパッチを適用した上で、 パッケージとして提供されています。 ソースコードの取得元はkernel.
ubuntu. です。Ubuntu用なので、com カーネルはUbuntuのリリースに合わせたバージョンのみが提供されます。たとえばUbuntu 19. 04であればKernel 5. 0ですし、 Ubuntu 18. 04 LTSならKernel 4. 15になります (HWEなら4. 18や5. 0です)。 既存のカーネルを少しだけ変更して利用したいなら、
Ubuntuカーネルをベースにすることになるでしょう。第333回ではUbuntuカーネルに少し修正を加えてビルドする方法を紹介しました。 - メインラインカーネル
(Mainline Kernel) -
Ubuntuでは不具合の原因追求や次期リリースに向けてのバージョン選定のために、
メインラインカーネルと呼ばれるオリジナルのLinuxカーネルをほぼそのまま利用した、 ビルドインフラストラクチャーを用意しています。 つまりKernelのmasterブランチの最新コミットや特定のタグを毎日ビルドし、
そのパッケージを公開しているのです。メインラインビルドは、 不具合がどのリリースから発生するようになったのか、 新しいリリースでは修正されているのかを追求するのに役に立ちます。リリースごとに再ビルドの必要がなく、 パッケージをダウンロードしてインストールするだけでトライアンドエラーを繰り返せます。 なおメインラインカーネルは、
基本的にLinux Kernelの内容そのままですが、 リリースごとに 「Ubuntu化」 用のパッチセットも併せて公開しています。つまり利用者は比較的簡単にUbuntu化されたカーネルを入手可能です。 また第524回では、
最新のカーネルでのみサポートしていたハードウェアを使うために、 メインラインビルドのパッケージをインストールしました。 - バニラカーネル
(Vanilla Kernel) -
Ubuntuによる修正がまったく加えられていないアップストリームのカーネルをバニラカーネルと呼んでいます。もちろん、
このバニラカーネルをビルドすれば、 Ubuntuで利用可能です。最近はMakefileにDebianパッケージを構築するターゲットが追加されているため、 比較的簡単にDebianパッケージ化も可能です。 ただし各種パッチが適用されていないこと、
コンフィグを自分で構築する必要があることから、 Ubuntuの各種コンポーネントが動かなかったり、 起動すらできないこともあります。あくまでカーネル開発者向けのオプションです。 第526回ではカーネルパッケージをビルドするひとつの方法として、
バニラカーネルを利用する手法を紹介しました。
どのカーネルをベースにするかは、
たとえば今回は第576回で紹介したようにGPD MicroPC向けのカーネルを作ることを考えてみましょう。GPD MicroPC向けのカーネルには次の制約が存在しました。
- 古いBIOSは5.
2.0-rc5以降のカーネルを使わないと画面の回転がおかしくなる - 新しいBIOSは5.
2.0にさらにパッチを適用しないと画面の回転がおかしくなる
執筆当時はUbuntuの開発版であるeoanでさえも、
つまりUbuntuカーネルだとバージョンアップが必要です。なおかつメインラインカーネルにしろバニラカーネルにしろ、
第526回のようにバニラカーネルをビルドしても良いのですが、
メインラインビルドの落とし穴
メインラインカーネルには、
- Ubuntuパッチ適用済みのリポジトリが存在するわけではない。メインラインカーネルから必要なタグをブランチして、
手作業でパッチを適用する必要がある。 - Ubuntuパッチを適用したからといって、
そのままDebianパッケージを構築できるわけではない。 「 debian/
」rules clean を実行してはじめて、 Debianパッケージ用のディレクトリが構築される。 - Ubuntuパッチを適用すると、
MakefileなどにUbuntu固有のターゲットが追加されるため、 そのままだと普通のカーネルのmakeに失敗する。 「 debian/
」rules clean を実行してはじめて、 カーネルのビルドのための準備が整う。 - 最近のUbuntuパッチには、
メインラインビルドだと動かない仕組み (Spectre緩和用のretpolineビルドを行うためのスクリプトの修正など) がいくつか追加されている。環境変数などでこれらの仕組みを無効化する必要がある。 - バージョンを重ねるにつれAPIが変わったり、
古いAPIが削除されたりする上に、 「5. x」 という表記に対応していなかったりすることもあるため、 Kernel 5. 0あたりを境に、 Ubuntu由来の動かなくなるものが稀にある。 - カーネルビルド時もDKMSを使う。
要するにdebian/
」
最後の
これはビルド時のスクリプトの中で、
もともとバージョン依存性の強い外部モジュールを、
メインラインビルド時は、
ビルド環境の準備
まずはビルド環境を準備しましょう。
最初に、
$ sudo apt install git build-essential kernel-package fakeroot \ libncurses5-dev libssl-dev
次にビルド方法に応じて次のいずれかのパッケージをインストールします。
ホスト上で直接ビルドを行いたい場合
ビルドのトライアンドエラーを繰り返すなら、
まずはソースパッケージリポジトリを有効化しておきます。デスクトップ環境があるなら
$ sudo sed -i "s/^# deb-src/deb-src/" /etc/apt/sources.list $ sudo apt update
次にlinuxパッケージをビルドするために必要なパッケージ一式をインストールします。
$ sudo apt build-dep -s --no-install-recommends linux
これで準備は完了です。
パッケージとしてクリーンビルドしたい場合
前述の環境でもビルドは可能ですが、
クリーンビルドする場合は次のパッケージをインストールします。
$ sudo apt install packaging-dev
次にビルド用のルートファイルシステムを構築します。
$ pbuilder-dist bionic create
「bionic」
カーネルソースコードの取得
ビルド環境の準備の最後に、
$ mkdir linux && cd $_ $ git clone git://git.launchpad.net/~ubuntu-kernel-test/ubuntu/+source/linux/+git/mainline-crack linux-gpd $ cd linux-gpd $ git checkout -b linux-gpd v5.2
最新リリースのKernel 5.
パッケージとしてビルドするために、
$ cd .. $ wget https://kernel.ubuntu.com/~kernel-ppa/mainline/v5.2/0001-base-packaging.patch $ wget https://kernel.ubuntu.com/~kernel-ppa/mainline/v5.2/0002-UBUNTU-SAUCE-add-vmlinux.strip-to-BOOT_TARGETS1-on-p.patch $ wget https://kernel.ubuntu.com/~kernel-ppa/mainline/v5.2/0003-UBUNTU-SAUCE-tools-hv-lsvmbus-add-manual-page.patch $ wget https://kernel.ubuntu.com/~kernel-ppa/mainline/v5.2/0004-debian-changelog.patch $ wget https://kernel.ubuntu.com/~kernel-ppa/mainline/v5.2/0005-configs-based-on-Ubuntu-5.2.0-8.9.patch $ wget -O gpd.patch https://patchwork.freedesktop.org/patch/313782/mbox/ $ cd linux-gpd
最後にGPD MicroPC向けのパッチもダウンロードしておきます。
すべてのパッチを一通り適用しましょう。
$ git am ../000*.patch $ git am ../gpd.patch
これでソースコード一式の準備完了です。
カーネルパッケージをビルドする
カーネルパッケージをビルドする方法は、
ホスト上で直接ビルドを行いたい場合
ホスト上で直接ビルドする場合、
まずあらかじめメインラインビルド用のオプションを有効化しておきます。
$ 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
普通に使うだけなら、
ちなみにカーネルパッケージはバージョン名まで含めてパッケージ名になります。これは複数のバージョンを共存してインストールするための措置です。
パッケージとしてクリーンビルドしたい場合
パッケージとしてクリーンビルドしたい場合は、debian/
」
$ fakeroot debian/rules clean
あとは次のコマンドでソースパッケージを構築できます。
$ debuild -S -d --no-tgz-check -uc -us
「-d
」apt build-dep linux
」
「--no-tgz-check
」
「-uc -us
」debian/
」
pbuilderを使う場合、~/.pbuilderrc
」
$ echo "export do_mainline_build=true" >> ~/.pbuilderrc
ようやく準備が整いましたのでビルドしてみましょう。
$ pbuilder-dist bionic build --use-network yes ../linux_5.2.0-050200.201907072331.dsc
ホストで直接ビルドするときに比べるとこちらはフルビルドになるため、~/pbuilder/
」
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
ホストで直接ビルドしたときと同じく、
おまけ:LXD上でビルドしたい場合
カーネルのビルドにはさまざまなパッケージのインストールが必要です。ホスト環境をできるだけきれいかつシンプルに保ちたいなら、
ホスト上で直接ビルドするケースなら、
$ lxc config set builder security.privileged true $ lxc config set builder security.nesting true $ lxc restart builder
ここではコンテナ名を