岩
松
![]() |
ここ数年で Debian の Linux カーネル開発体制や Linux カーネルに関するツールの使い方が変わってきました。 Debian JP の ML でもたまに Linux カーネルに関してハマっている方おられるようです。 昔と違って最近の ユーザは Debian から提供されているカーネルを使う人が多いようで、 ネット上でも情報がまとまっていませ ん。 今回は、 Debian Linux カーネル開発の背景と、 今時のカーネルコンパイル方法について簡単にまとめま した。
Debian の Linux カーネルは Debian Kernel Team によって開発およびメンテナンスされています。 もちろん Debian では Linux カーネルも Debian パッケージとして提供されており、 容易に利用可能です。 チームコアメンバは Bastian Blank, Frederik Schul, Maximilian Attems, Ben Hutchings で、 彼らがが中心になってメンテナンスしています。 各々はもちろん カーネル開発者です。 彼らだけでは全アーキテクチャの面倒を見きれないので、 各アーキテクチャメンテナとともにカーネル パッケージをメンテナンスしています。 アーキテクチャメンテナは Buildd メンテナや、 Debian-instller チーム、 eglibc メンテナなど、 カーネルに関係するパッケージをメンテナンスしている約 20 名の開発者によって構成され ます。
去年の 6 月頃までは Debian でベースとする Linux カーネルバージョンは決まっていましたが、 パッケージのリリースサイク ルはあまり決まっていませんでした。 去年の Debconf では Linux カーネルの stable リリースに合わせて開発を行うことが決ま り、 パッケージのバージョニングと開発/メンテナンススタイルもリリースサイクルに合わせて変更されま した。
Debian カーネルを扱うにあたり、 カーネルという言葉はいろんな意味を持ちます。 よく使われる用語をまとめてみま した。
開発体制プロセスの変更により、 カーネルパッケージのバージョンやアップロードのタイミングが変わりまました。 2010 年 5 月現在、 Linux の LTS サポートカーネルバージョンは 2.6.32、 最新版は 2.6.32.12 です。 このカーネルをベースに Debian パッ ケージにした場合、 パッケージバージョンは linux-2.6_2.6.32-12 になります。 stable リリースバージョンを Debian バージョンに置き換えており、 Debian バージョン = Linux カーネルの stable リリースバージョ ンになります。 これにより新しい stable リリースが出ない限り、 Debian パッケージもアップロードされま せん。
Linus カーネルからのバックポート(linux-2.6.34-rc7 で取り込まれたパッチを linux-2.6.32 に取り入れてもらうなど) は、 Debian パッケージに直接取り込まれることはなく、 stable カーネルからのみ受け付けます。 stable カーネルで採用されない限 りは Debian でも使えないということです。 取り込んでもらうには、 stable@kernel.org にメールし、 stable カーネルに取り込 んでもらうように交渉する必要があります。
バグがあった場合には、 Debian の BTS を利用できます。 パッチが用意できる場合には、 添付しましょう。 メンテナが Upstream(stabel カーネル、 場合によっては Linus/HEAD) に転送してくれます。
Debian Kernel Team で作成されたパッチは積極的に Linus カーネルに取り込まれるように働きかけています。 これらが、 Liuns/HEAD または stable カーネルに取り込まれない場合、 Debian specific パッチとして管理されます。 例えば、 ドライバ の non-free ファームウェアのパッチなどはまだ全て取り込まれておらず、 一部は Debian specifc パッチとして残ってい ます。
Debian Kernel Team では Linux カーネルに関するいくつかのパッケージをメンテナンスしています。 ここでは、 主要なパッ ケージと関係について説明します。
|
カーネルコンフィグ
linux-2.6 ソースパッケージで持っているカーネルコンフィグは基本 config , アーキテクチャ用 config , flavour 用 config 3 つ
に分けられており、 debian/config ファイルに格納されています。 これらのファイルはバイナリパッケージビルド時に一つにま
とめられ、 まとめられた config を使ってカーネルコンフィグが行われます。 ファイルで設定されているコンフィグは基本的に
重複しません。 しかし、 組み込みで使われるボードでは、 ドライバモジュールを組み込みにしないと動作しないものもあるた
め、 flavour 用の config ファイルによってオーバライドされます。 よって、 各ファイルの優先順位としては基本
config <アーキテクチャ用 config <flavour 用 config となります。 また、 コンフィグを各ファイルに自動的
で分割するプログラムは存在せず、 アーキテクチャメンテナがちまちまファイルを修正し、 アップデートし
ます。
linux-latest-2.6パッケージは Debian カーネルの最新 ABI を追従するためのメタパッケージを提供します。 例えば、 amd64 アーキテクチャ向けの基本 Linux カーネルイメージパッケージはlinux-image-2.6.32-5-amd64になりますが、 linux-latest-2.6ソースパッケージからビルドされるlinux-image-2.6-amd64はlinux-image-2.6.32-5-amd64 に依 存します。 パッケージ名に ABI のバージョン(上の例だと 5) を含めてるので、 ABI が変更された場合に カーネルアップデートがされません。 新規にパッケージをインストールする必要があるわけです。 例えば、 linux-image-2.6.32-4-amd64 とlinux-image-2.6.32-5-amd64では ABI が異なるので別パッケージ扱いになります。 こ のときに、 linux-image-2.6-amd64をインストールしておくと、 ABI が 4 から 5 にアップーデートされた場合に、 linux-image-2.6-amd64 もアップデートされ、 linux-image-2.6.32-5-amd64が自動的にインストールされ ます。
ABI のチェック
ABI のチェックは linux-2.6 パッケージ内にあるdebian/bin/buildcheck.pyを使って、 カーネルパッケージビルド時に実行
されます。 カーネルパッケージメンテナは手元でビルドしたときに、 ABI のアップデートをチェックし、 ABI を更新して
Debian にアップロードします。 といっても、 大幅な変更、 例えば sycall が追加/変更されるなどの変更がない場合には ABI を
変更しない場合もあるようです。
--省略--
make[3]: Leaving directory ‘/home/mattems/src/linux-2.6-2.6.32/debian/build/build_amd64_none_amd64’ python debian/bin/buildcheck.py debian/build/build_amd64_none_amd64 amd64 none amd64 ABI has changed! Refusing to continue. Added symbols: dev_attr_usbip_debug module: drivers/staging/usbip/usbip_common_mod, version: 0x79bd9084, export: EXPORT_SYMBOL_GPL getboottime module: vmlinux, version: 0x0619ca8a, export: EXPORT_SYMBOL_GPL monotonic_to_bootbased module: vmlinux, version: 0xdb274e52, export: EXPORT_SYMBOL_GPL --省略-- |
linux-kbuild-2.6はカーネルドライバ構築をサポートするためのスクリプトを持っています。 よって、 linux-headers パッ ケージに依存しています。 このパッケージのソースコードは linux-2.6 パッケージから作られず、 別途の stable カーネルのソー スコードから kbuild を行うために必要な部分を抽出して作られます。 これは、 kbuild システムが stable リリース毎に更新す る必要がないためです。
大抵のユーザは Debian で提供されているバイナリパッケージを使います。 しかし、 たまにビルドしたい人がいるわけです。 理 由としては以下のものが考えられます。
このような事から日頃からカーネルのビルドを行って置くことが重要です。 しかし、 Debian ではいくつかのカーネル構築方 法があります。 これらを一つずつみてみましょう。
まずは基本の Debian カーネルのリビルド方法を説明します。 ソースパッケージをダウンロードし、 debuild を実行すれば linux カーネルパッケージがビルドされますが、 この方法では自分の必要のない flavour までビルドします。 ここでは、 指定し た flavour のみをビルドする方法を説明します。
$ apt-get source linux-2.6
$ cd linux-2.6-2.6.32 |
$ sudo apt-get build-dep linux-2.6
|
$ make -f debian/rules clean
$ make -f debian/rules source-all |
debian/rules source-allでは、 全てのアーキテクチャ向けにパッチを適用してしまうので、 特定のアーキテクチャ のパッチを適用したい場合には以下のように実行します。
$ make -f debian/rules.gen source_amd64
|
$ fakeroot make -f debian/rules.gen setup_amd64_none_amd64
|
$ cd debian/build/build_amd64_none_amd64
$ make menuconfig $ cd ../../.. |
$ fakeroot make -f debian/rules.gen binary-arch_amd64_none_amd64
|
よく行うと思われるのが、 Debian カーネルをベースに自分が作ったパッチを当てて管理するというものです。 これを行うに は、 Debian のカーネルパッチ機構を知る必要があります。
Debian カーネルパッチ機構
基本的に通常のパッケージのパッチシステムと変わりません。 debian/patches にパッチが格納されています。 四つのディレク
トリがあり、 さらにアーキテクチャ毎にパッチが分かれています。
自分のパッチを適用したカーネルをビルドする方法
$ apt-get source linux-2.6
$ cd linux-2.6-2.6.32 |
$ dch --local +test -D UNRELEASED
|
パッチを debian/patches ディレクトリ以下にコピーします。
$ cp ~/oreore.patch debian/patches/bugfix/
|
$ echo ‘‘+ bugfix/oreore.patch’’ >> debian/patches/series/12+test1
|
$ ./debian/bin/gencontrol.py
|
$ make -f debian/rules clean
$ make -f debian/rules.gen source_amd64 |
$ fakeroot make -f debian/rules.gen binary-arch_amd64_none_amd64
|
エラーがなければ、 パッチが有効になったカーネルパッケージがビルドされます。
Debian カーネルを再ビルドする方法はもうひとつあり、 linux-source-2.6.XXパッケージを利用する方法です。 このパッ ケージにはアップストリームのソースコードのみを提供しています。 このパッケージからカーネルパッケージをビルドする方法 を説明します。
$ sudo apt-get build-dep linux-source-2.6.32
|
$ sudo apt-get install linux-source-2.6.32
|
$ fakeroot make-kpkg --revision=test00debian kernel_image kernel_headers
|
しかし、 これでは Debian パッケージにはパッチが適用されていない状態です。 linux-patch-debian-XXXXパッケージ をインストールし、 パッチを適用する必要があります。 -a でアーキテクチャ、 -f で flavour を指定します。
$ sudo apt-get install linux-patch-debian-2.6.32
$ /usr/src/kernel-patches/all/2.6.32/apply/debian -a x86_64 -f xen |
Linus や stable チームによってリリースされた Linux カーネルを Debian パッケージを作成するにはkernel-packageパッ ケ ー ジ を 使 う の が Debian 流です。
$ sudo apt-get install kernel-package fakeroot
|
$ make menuconfig
|
make-kpkg コマンドにはいくつかのオプションがありますが、 よく利用するオプションについて説明し ます。
例えば、 リビジョンをtest12345、 バージョンにappend67890指定し、 カーネルパッケージとカーネルヘッダパッケー ジをビルドする場合には以下のように実行します。 リビジョンの前に.(ピリオド) をつけているのは、 2.6.33.3 の場合に は 2.6.33.3.append67890 となるようにするためです。
$ fakeroot make-kpkg --revision=.test12345 --append-to-version=append67890 kernel_image
|
作成されるパッケージ名は以下のようになり、 --append-to-versionと--revisionは以下のように配置されます。
linux-image-(kernel-version)(--append-to-version)_(--revision)_(architecture).deb
|
$ sudo dpkg -i ../linux-image-2.6.33.3.append67890_testrev12345_amd64.deb
|
今時はカーネルがリリースされる度にカーネルのソースコードをダウンロードするのではなく、 常に git リポジトリを更 新し、 git リポジトリからビルドするのが通でしょう。 たぶん。 kernel-package パッケージでは、 git リポ ジトリからビルドできる機能があるのでこれを利用すると容易にカーネルパッケージを作成することができ ます。
$ git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git
|
linux-2.6 ディレクトリができるので移動します。
cd linux-2.6
|
$ git pull
|
$ make-kpkg clean
|
ビルドすると、 Makefile からバージョンを抽出し、 パッケージバージョンをつけてくれます。 git log --pretty=format:%h -1はチェックアウトしている HEAD の短縮されたハッシュ値を取得し、 --revision オプショ ンに渡しています。 これにより、 どのコミットから作成したカーネルイメージなのかわかるようになり ます。
$ fakeroot make-kpkg --revision=1+‘git log --pretty=format:\%h -1‘ --initrd kernel_image
-- 省略 -- $ ls ../ linux-2.6 linux-image-2.6.34-rc7_1+be83567_amd64.deb |
Debian カーネルパッケージでは、 多くのカーネルドライバモジュールが用意されています。 最近ではmodule-init-toolsの 仕様変更があり、 設定ファイルのサフィックスが変更されています。 ドライバモジュールの取り扱いについて一度簡単におさら いしてみましょう。
起動時に自動的にモジュールをロードする設定は、 /etc/modprobe.d/に新しいファイルを作成して、 そこに記述するし ます。
たとえば、 eth0 として eepro100 をロードさせたい場合、 /etc/modprobe.d/local.confファイルを用意して、 設定を記述 します。
echo ’alias eth0 e100’ >> /etc/modprobe.d/local.conf
|
とします。
パラメータの設定も/etc/modprobe.d/local.conf に記述します。 カーネルモジュールのパラメータを調べるには、 modinfoコ マンドを利用します。
$ modinfo e100
filename: /lib/modules/2.6.31-1-686/kernel/drivers/net/e100.ko firmware: e100/d102e_ucode.bin firmware: e100/d101s_ucode.bin firmware: e100/d101m_ucode.bin version: 3.5.24-k2-NAPI --省略-- vermagic: 2.6.31-1-686 SMP mod_unload modversions 686 parm: debug:Debug level (0=none,...,16=all) (int) parm: eeprom_bad_csum_allow:Allow bad eeprom checksums (int) parm: use_io:Force use of i/o access mode (int) |
設定する場合には以下のように記述します。
$ echo ’options e100 debug=16’ >> /etc/modprobe.d/local.conf
|
設定したら、 再起動を行うかカーネルモジュールを再読込します。
kernel-package パッケージが古いので lenny ではビルドできません。 testing/unstable にある kenrel-package パッケージを lenny にインストールすることによって対応できます。 kernel-package に依存しているパッケージも lenny 内から持ってくるこ とができるので、 特にシステムが壊れるということはないと思われます。
grub のメニューを変更して、 initrd を使わないようにしましょう。 というのは半分冗談で、 kenrel-pakcage 12.012 以降から initrd を作らない仕様に変更されました。 make-kpkgコマンドを使って initrd を含めたカーネルイメージを作成するには、 以 下を実行する必要があります。
$ sudo mkdir -p /etc/kernel/postinst.d/
$ sudo cp /usr/share/doc/kernel-package/examples/etc/kernel/postinst.d/initramfs \ /etc/kernel/postinst.d/ $ fakeroot make-kpkg --revision=1 --initrd kernel_image |
実行した後に再度カーネルパッケージを作ると、 インストール時に initrd イメージを構築します。
make-kpkg コマンドの DEBIAN_KERNEL_JOBS 変数を使いましょう。 例えば、 -j8 相当は以下のように実行します。
$ make-kpkg --revision=test00 kernel_image kernel_headers DEBIAN_KERNEL_JOBS=8
|
最新リリースカーネルの Debian パッケージは experimental ディストリビューションにアップロードされます。 2010 年 05 月の時点では、 バージョン 2.6.33 で、 linux-2.6_2.6.33-1 experimental.5 としてアップロードされて います。 カーネルはアップロードされているのですが、 linux-kbuild-2.6 パッケージが最新カーネル向けに アップロードされない事があるので、 使いたいユーザは自分で用意する必要がある場合があります。 作り方は http://wiki.debian.org/HowToRebuildAnOfficialDebianKernelPackage#Thestoryoflinux-kbuild-2.6 を参照し てください。 ちなみに 2.6.33 以降のパッケージを作成する場合には、 バグ (#573176) があります。 パッチを当てて、 ビルドし ましょう。