第4章 カーネル関連の一般的な作業手順

目次

4.1. Debian カーネルソースを取得する
4.2. 公式の Debian カーネルパッケージをリビルドする
4.2.1. 準備
4.2.2. 簡単なパッチ適用とビルド実行
4.2.3. パッチの適用や設定の変更
4.2.4. パッケージを一度にビルドする
4.2.5. 特定のフレーバのためにパッケージをビルドする
4.3. Debian カーネルパッケージの開発用バージョンをビルドする
4.4. orig tarball をより新しいアップストリームの tarball からビルドする
4.5. Debian カーネルソースからカスタムカーネルをビルドする
4.6. 素のカーネルソースからカスタムカーネルをビルドする
4.7. ツリーの外にあるカーネルモジュールをビルドする

4.1. Debian カーネルソースを取得する

linux-source-version パッケージをインストールしてソースを展開するだけで Debian のカーネルソースを最新のパッチレベルで取得することができます。例えば:

# apt-get install linux-source-4.3
$ tar xaf /usr/src/linux-source-4.3.tar.xz

ソースツリーがlinux-source-4.3ディレクトリに展開されます。

4.2. 公式の Debian カーネルパッケージをリビルドする

全ての、または任意のカーネルパッケージは、以下の手順でビルドできます。潜在的なバグの修正をテストするために、リビルドが必要になる場合があります。

4.2.1. 準備

次のコマンドを実行します:

# apt-get install build-essential fakeroot
# apt-get build-dep linux

カーネルのビルド時に要求されるビルド依存がインストールされます。

$ apt-get source linux

linux ソースパッケージをダウンロードし、linux-versionディレクトリにツリー展開します。このパッケージのバージョン名のリビジョンの部分 (例えば、3.2.19-1 の 1 にあたる部分) は、常にオリジナルのアップストリームカーネルに対するパッチレベルをあらわしています。

$ cd linux-version

ソースディレクトリに入ります。

4.2.1.1. 必要なディスクの空きスペース

1 つのカーネルフレーバをデバッグ情報を有効にした状態でビルドするには (現在、686-paeamd64rt-686-paert-amd64s390x の設定で true になっています) パッケージディレクトリに最大で 10 GB 程度以上、/tmp (または $TMPDIR) に 300 MB 程度以上の空き容量が必要です。

デバッグ情報を無効にした場合は、それぞれ約 2GB と 25 MB 以上必要です。デバッグ情報は debian/config/arch/definesdebug-infoの値をfalseにすることで無効にできます。

i386 または amd64 のバイナリパッケージをビルドするには、今のところ約 20 GB の空き容量がパッケージディレクトリに必要です。デバッグ情報がなかったりドライバが少ない他のアーキテクチャに必要な空き容量はこれよりも少ないでしょう。

4.2.2. 簡単なパッチ適用とビルド実行

ソースパッケージには、追加のパッチを適用してビルドのプロセスを簡略化するためのスクリプトが含まれます。このスクリプトは次のコマンドで実行します:

# apt-get install devscripts
$ bash debian/bin/test-patches ../fix-bug123456.patch ../add-foo-driver.patch

このスクリプトにはフレーバやフィーチャセットの制御が可能なオプションが指定できます。オプションの概要を見るには、次のコマンドを実行して下さい:

$ bash debian/bin/test-patches

場合によっては、linux-base パッケージもビルドする必要があるかもしれません:

$ fakeroot make -f debian/rules.real install-linux-base

もし設定を変えたり変更を加えたりする必要がある場合、このスクリプトは使用せずに、次に説明する手順に従ってください。

4.2.3. パッチの適用や設定の変更

ビルドを開始する前に追加のパッチをソースに適用することができます。linux ソースパッケージには、トップディレクトリにデフォルト (フィーチャセットが無い状態) のパッチが自動的に適用されます。

パッチを適用したソースは次のディレクトリに格納されます。

デフォルトのソース:

最上位の階層

フィーチャセットを含むソース:

debian/build/source_featureset

追加のパッチは適切なディレクトリにそれぞれ適用してください。linux ソースパッケージでは、この作業に quilt を使用することができます。

設定をビルドする前に変更するには、例えば i386 の 686-pae フレーバの場合は次のコマンドを実行します:

$ fakeroot make -f debian/rules.gen setup_i386_none_686-pae
$ make -C debian/build/build_i386_none_686-pae nconfig

パッチまたは変更した設定が、カーネルの型定義を変更する場合、 ABI 名を変更する必要があるかもしれません。「ABI 名」を参照して下さい。

4.2.4. パッケージを一度にビルドする

可能な全てのアーキテクチャ用にパッケージをビルドする場合は次のコマンドを実行して下さい:

$ fakeroot debian/rules binary

アーキテクチャ依存の全てのパッケージをビルドする場合は次のコマンドを実行して下さい:

$ fakeroot debian/rules binary-arch

全てのアーキテクチャ非依存のパッケージをビルドする場合は次のコマンドを実行して下さい:

$ fakeroot debian/rules binary-indep

4.2.5. 特定のフレーバのためにパッケージをビルドする

例えば、 i386アーキテクチャで 686-pae フレーバだけのバイナリパッケージをビルドする場合は次のコマンドを実行して下さい:

$ fakeroot debian/rules source
$ fakeroot make -f debian/rules.gen binary-arch_i386_none_686-pae

このコマンドのターゲットは次の書式で汎化されています: target_arch_featureset_realフィーチャセットが不要な場合、featuresetnone に置き換えます。このコマンドは linux イメージとカーネルヘッダパッケージをビルドします。場合によっては linux-headers-version-common バイナリパッケージも必要かもしれません。次のコマンドでビルドできます:

$ fakeroot debian/rules source
$ fakeroot make -f debian/rules.gen binary-arch_i386_none_real

このコマンドのターゲットは次の書式で汎化されています: target_arch_featureset_real

4.3. Debian カーネルパッケージの開発用バージョンをビルドする

カーネルチームがまだリリースしていない開発バージョンのカーネルイメージをビルドするには、次のコマンドを実行します:

# apt-get install build-essential fakeroot rsync git
# apt-get build-dep linux

最後の 2 つのコマンドはカーネルのビルドプロセス中に必要なビルド依存をインストールします。

$ git clone -b dist --single-branch https://anonscm.debian.org/git/kernel/linux.git

Debian パッケージをチェックアウトします。dist には、wheezysid (unstable) などのディストリビューションのコードネームが入ります。アップストリームのリリース候補版をベースにした最新のバージョンを入手したい場合はtrunkからチェックアウトして下さい。数百メガバイトのデータをダウンロードするのでご注意ください。

$ apt-get source -d linux

linux のアップストリームのソース (と最新の Debian パッチ) をダウンロードします。ビルドしようとしているバージョンによって APT のバージョン選択を上書きするか、かわりにpeople.debian.orgから tarball をダウンロードする必要があります。

$ cd linux
$ debian/rules orig

アップストリームのソースを展開し、Debian のパッケージとマージします。

$ debian/rules debian/control

現在ビルドすることができる様々なカーネルフレーバの定義にもとづいて、Debian パッケージの control ファイルを生成します。

$ fakeroot debian/rules target

「公式の Debian カーネルパッケージをリビルドする」 で説明したバイナリパッケージをビルドします。

4.4. orig tarball をより新しいアップストリームの tarball からビルドする

まず、新しいアップストリームバージョンの変更履歴を追加します。新しいバージョンがリリース候補版なら、バージョン文字列の -rc~rc に変更して下さい。(Debian のパッケージでは、サフィックス~がプレリリース用に使われています )

'orig' tarball はgenorig.pyスクリプトによって生成されます。このスクリプトは tarball、オプションのパッチ、または kernel.org の git リポジトリへのパスを引数にとります。まず、必要なツールがインストールされているか確認します:

# apt-get install unifdef

tarball が手元にある場合は次のようなコマンドを実行します:

$ debian/bin/genorig.py ../linux-4.3.tar.xz ../patch-4.4-rc1.xz

git リポジトリが手元にある場合は、そのディレクトリ名を引数に渡します:

$ debian/bin/genorig.py ~/src/linux

どちらを実行した場合も、../orig/linux_3.5~rc1.orig.tar.xz のようなファイルが生成されるでしょう。この tarball を次のコマンドで Debian パッケージに統合にします:

$ debian/rules orig

4.5. Debian カーネルソースからカスタムカーネルをビルドする

このセクションでは "Debian way" でカスタムカーネルをビルドするための可能な限りシンプルな手順を紹介します。カーネルの設定やビルドプロセスにある程度の知識があることを前提とします。もし、そうでない場合はカーネルドキュメンテーションと素晴らしいオンラインのリソースに目を通しましょう。

Debian カーネルのソースからカスタムカーネル (オフィシャルパッケージで使われている設定とは違う設定のカーネル) をビルドするための最も簡単な方法は linux-source パッケージと make deb-pkg ターゲットを使うことです。まず、カーネルツリーを準備します:

# apt-get install linux-source-4.3
$ tar xaf /usr/src/linux-source-4.3.tar.xz
$ cd linux-source-4.3

次に、カーネルの設定が必要になります。つまり、カーネルのオプションを設定しどのドライバを含めるか、ビルトインにするか外部モジュールにするか、などを決めなければなりません。カーネルのビルド機構は多くのターゲットに対応しており、異なる設定用フロントエンドを起動することができます。たとえばコンソールベースのメニュー形式の設定画面は、次のコマンドで起動でます:

$ make nconfig

nconfig のかわりに config (テキストベースの 1 行ずつ設定を行うフロントエンド) や、 xconfig (グラフィカルな設定フロントエンド) なども利用できます。古い設定ファイルは .config ファイルとしてトップディレクトリに配置し、設定するターゲットの起動コマンドを実行するか (なにかを設定し直す場合)、make oldconfig コマンドを実行する (設定を保持する場合) ことで再利用できます。フロントエンドによっては、正常に動作するためにライブラリやユーティリティをインストールする必要があるかもしれないことに注意して下さい。例えば、menuconfigフロントエンドは執筆時点では libncurses5-dev パッケージとして提供されている ncurses ライブラリが必要です。

CONFIG_DEBUG_INFO オプションが無効化されている場合は (「必要なディスクの空きスペース」 参照) ビルドに必要な空きディスクスペースは少なく済みます。デバッグ情報は、crash、kgbd、SystemTap のようなカーネル上のバイナリオブジェクトツールを使わない場合は不要です。

$ scripts/config --disable DEBUG_INFO

設定プロセスの終了後、変更または新規に作成されたカーネルの設定は トップレベルディレクトリの .config ファイルとして保存されます。ビルドは次のコマンドで開始します:

$ make clean
$ make deb-pkg

生成されたカスタムカーネルパッケージ linux-image-3.2.19_3.2.19-1_i386.deb (ファイル名にはカーネルのバージョンとビルド番号が反映されます) がツリーのトップレベルの 1 つ上の階層に生成されます。このファイルは他のパッケージと同様に、 dpkg コマンドでインストールできます:

# dpkg -i ../linux-image-3.2.19_3.2.19-1_i386.deb

このコマンドはカーネルを展開し、もし必要であれば initrd を生成し (詳細は 7章起動用RAMイメージ (initramfs) アーカイブの管理 を参照)、 新規でインストールしたカーネルがデフォルトとなるようにブートローダを設定します。このコマンドが問題無く完了したら、

# shutdown -r now

コマンドで再起動すると新しいカーネルで起動します。

ブートローダとその設定方法に関しての詳細は man liloman lilo.confman grub、などのコマンドでそれぞれのドキュメントを参照してください。ドキュメントは /usr/share/doc/package ディレクトリから探すこともできます。packageには関連するパッケージ名を指定してください。

4.6. 素のカーネルソースからカスタムカーネルをビルドする

www.kernel.orgとそのミラーで配布されている 素 ("pristine" = 訳注: 原始の、汚されていない、の意) ("vanilla" と呼ばれることもあります) のカーネルソースからビルドすることは、デバッグやより新しいカーネルのバージョンが必要な場面で役に立ちます。その方法は、カーネルソースの入手方法のみが違います。Debian パッケージからカーネルソースを入手するかわりに、素のカーネルソースをブラウザでダウンロードしてくるか、wget で次のように取得します: follows:

$ wget https://kernel.org/pub/linux/kernel/v4.x/linux-4.3.tar.xz

アーカイブの整合性はそれぞれの暗号化シグネチャを検証することで確認できます。

$ wget https://kernel.org/pub/linux/kernel/v4.x/linux-4.3.tar.sign

コマンドを実行し、次のコマンドを実行してください。(gnupg パッケージがインストールされていなければなりません)

$ unxz -c linux-4.3.tar.xz | gpg --verify linux-4.3.tar.sign -

検証に成功した場合、次に示すような出力を得ることができます。

gpg: Signature made Mon 21 May 2012 01:48:14 AM CEST using RSA key ID 00411886
gpg: Good signature from "Linus Torvalds <torvalds@linux-foundation.org>"
gpg: WARNING: This key is not certified with a trusted signature!
gpg:          There is no indication that the signature belongs to the owner.
Primary key fingerprint: ABAF 11C6 5A29 70B1 30AB  E3C4 79BE 3E43 0041 1886

検証が済んだら、次のコマンドでアーカイブを展開しましょう。

$ tar xaf linux-4.3.tar.xz
$ cd linux-4.3

展開されたカーネルツリー (linux-3.4ディレクトリ) の設定をする準備ができました。手始めに、すでにある設定ファイルを使うと良いでしょう。

$ cp /boot/config-3.2.0-2-686-pae ./.config

設定フロントエンドのどれかを使い (make oldconfigmake configmake nconfig、などで起動します) 設定が完了したら、すでに説明した make deb-pkg ターゲットを使い、ビルドを開始できます。

4.7. ツリーの外にあるカーネルモジュールをビルドする

カーネルモジュールのなかには、アップストリームや Debian カーネルソースには含まれずに、サードパーティのソースパッケージとして提供されているものがあります。ツリー外のカーネルモジュールの中でも特に有名なものは、Debian カーネル用にビルドしたモジュールの、バイナリの Debian パッケージが提供されている場合があります。例えば linux-image-3.2.0-2-686-pae パッケージからインストールした、Debian カーネル 3.2.0-2-686-pae を使っていて (uname -r コマンドでバージョンの確認ができます) squashファイルシステムを使いたくなった場合は、そのために必要なバイナリのカーネルモジュールを提供している squashfs-modules-3.2.0-2-686-pae パッケージをインストールするだけで利用可能になります。

残念ながら使いたいモジュールのバイナリパッケージがアーカイブにない場合でも、 カーネルモジュールのソースパッケージが Debian アーカイブにある可能性もあります。 パッケージ名の最後に -source とついているパッケージは、このようなパッケージの典型例です。例えばsquashfs-sourcethinkpad-sourcert2x00-sourceなどがありますが、他にも多数あります。これらのパッケージには、 Debian 化したカーネルモジュールのソースコードが含まれています。ビルドには module-assistant パッケージのmodule-assistant (または m-a) スクリプトを使うと便利です。Debian 化したソースからカーネル 3.2.0-2-686-pae (uname -rコマンドの返答値) 用のカスタムバイナリモジュールパッケージをビルドする場合の大まかな流れを説明します。

まず、ビルドしたいモジュールに適切なカーネルヘッダをインストールします。

# apt-get install linux-headers-3.2.0-2-686-pae

ソースを含んでいるパッケージをインストールします。

# apt-get install squashfs-source

module-assistant (または m-a) を実行し、ビルドをします。

# m-a build squashfs

その結果、Debian パッケージがビルドされ、/usr/src に配置されます。いつも通り dpkg -i でインストールすることもできます。最後の 2 つのステップ (ビルドとインストール) は次のコマンドで 1 つにまとめることもできます:

# m-a auto-install squashfs

で 1 つにまとめることもできます。その他のオプションと使い方について、もっと詳しく知りたい場合は、module-assistant のドキュメント (man module-assistant) を参照してください。

とても稀なケースではありますが、カーネルモジュールのパッケージをアップストリームのソースからビルドする必要があるかもしれません。その場合、モジュールをビルドするためのパッケージに付属しているドキュメントの指示に従って下さい。もしビルドプロセスの途中で現在使用中のカーネルに合わせたカーネルヘッダを含むディレクトリを指定しなければならない場合、Debian の 素のカーネルのディレクトリは /usr/src/linux-headers-uname で、linux-headers-uname パッケージによって提供されます。ここでの unameuname -r コマンドの出力結果です。もし独自でカスタマイズしたカーネルを使っている場合は、オリジナルのビルドツリーを手元に置いておくと良いでしょう。ビルドツリー外にあるモジュールをビルドする際にも役立ちます。