岩松 信
洋
![]() |
2008 年末に 2.6.28 が出ましたが、 みなさんコンパイルしていますか? 2、 3 名ほどは毎朝昼晩 Linus ツリーから git pull して コンパイルされていると思いますが、 大抵の方は Debian が提供しているカーネルを使っていると思います。 使っている理由は 様々ですが、 コンフィグレーションがめんどうくさいとか、 どこを変えていいのかわからない、 などが理由だと思います。 *8
また、 最近で Linux カーネルも賢くなり、 ドライバをモジュールにしておくと、 ある程度自動的に必要なモジュールを ロードしてくれるようになったのも理由の一つかもしれません。 今回はユーザの立場からカーネルを触れる ようにする方法の一つとして、 Debian が提供しているカーネルからモジュールを組み込みにするためのス クリプトを作りました。 これによって、 どこを有効にすればいいのかわからないなどの問題がすべて解決し ます。
普通の Debian ユーザはカーネルをリコンパイルしないようです。 毎日狂ったようにリコンパイルしている人はカーネルハカー か、 変態さんぐらいでしょう。 彼らがカーネルコンパイル!コンパイル!と言っているからには何か理由があると思います。 カーネルをリコンパイルする理由として以下の事が考えられます。
カーネルをリコンパイルすることはメリットだけではなく、 デメリットもあります。
たぶん、 この文章を読んでいる人たちは前者の予備軍なので、 デメリットは気にせずに突き進んでいけると思い ます。
今回作ったプログラムは、 システム情報を元にシステムに必要なカーネルモジュールが組み込み指定に変換されたカーネルコン フィグファイルを出力するというものです。
今回のキモはどのようにして、 システム情報を取得するか、 にかかっています。 今動いているカーネルから得られる情報は以下 のものが考えられます。
|
これらの中で信用できて簡単に扱えるものは lsmod でしょう。 理由はロードしているモジュール=現在の Linux システ ムに必要なものなので、 わかりやすいためです。 よって、 今回は lsmod の出力を利用することにしました。 *9
以下に簡単な処理の流れを説明します。
lsmod を実行すると、 以下のような内容が出力されます。
$ lsmod
Module Size Used by i915 25280 2 drm 65256 3 i915 ipv6 235300 10 rfcomm 28272 2 l2cap 17248 9 rfcomm ........ |
modinfo コマンドを使うと、 指定したドライバモジュール名の情報を取得することができます。 -n オプションを使うと、 ドライバオブジェクトファイルのパスが出力されます。
$ modinfo -n i915
/lib/modules/2.6.26-1-amd64/kernel/drivers/char/drm/i915.ko |
上の結果を例にすると、 /lib/modules/2.6.26-1-amd64/kernel/ 以下とカーネルソースコードのパス構造は同じ なため、 ドライバモジュール名 i915 の Makefile のあるパスは drivers/char/drm/Makefile になります。 また、 ド ライバオブジェクトファイルは i915.ko であることが分かります。
ドライバオブジェクトファイル (i915.ko) とドライバモジュール名 (i915) は必ずしも一致す るとは限らないので、 ドライバモジュール名を使って、 ドライバコンフィグ名を検索します。 *10
.....
obj-$(CONFIG_DRM_I830) += i830.o obj-$(CONFIG_DRM_I915) += i915.o <- これ obj-$(CONFIG_DRM_SIS) += sis.o ..... |
正規表現を使って書き換えると、 以下のようになります。 m はモジュールを意味し、 y は組み込みを意味し ます。
変更前
....
CONFIG_DRM_I830=m CONFIG_DRM_I915=m CONFIG_DRM_MGA=m .... |
変更後
....
CONFIG_DRM_I830=m CONFIG_DRM_I915=y <- 書き換え CONFIG_DRM_MGA=m .... |
今回作成したソフトウェアは以下のように使います。 ちなみに、 lsmod の出力ファイルを指定しない場合は、 プログラムの中 で自動的に取得します。
$ moge -h
moge - Script to Kernel Module Enabler from lsmod command output Copyright (C) 2008,2009 Nobuhiro Iwamatsu <iwamatsu@nigauri.org> Usage: moge [options] -c, --configfile <file> Kernel config file name -k, --kernel Kernel source path -o, --output <file> outout file -l, --lsmod lsmod command output file -h, --help display this help screen and exit -v, --version show the version and exit By Nobuhiro Iwamatsu <iwmatsu@nigauri.org> $ moge -o sage -c config-2.6.26-1-686 -l lsmod.list -k /usr/src/linux-2.6-2.6.26/ |
さっそく、 作成されたコンフィグファイルを使ってカーネルをコンパイルしてみましょう。 カーネルコンパイルの方法は以下の 通りです。
$ sudo apt-get update
$ sudo apt-get install linux-source-2.6.26 kernel-package $ cd /usr/src/linux-source-2.6.26 $ make oldconfig $ fakeroot make-kpkg --revision=yourpc00 kernel_image kenrel_header $ ls ../ linux-image-2.6.26_yourpc00_i386.deb linux-headers-2.6.26_yourpc00_i386.deb ....... |
eeePC で試してみて、 どれぐらい変わったのか調べました。
変更前 61 モジュール
変更後 0 モジュール
|
bootchart でどれぐらい起動が速くなったか、 調べてみました。
上の起動チャート図より、 起動時のモジュールの読み込みがなくなり、 三秒ほど速くなっていることが分かり ます。
このソフトウェアは Perl の勉強のために作ってみましたが、 今後の展開としては以下のことを考えています。
make-kpkg は Perl で作られているので入れやすいかもしれません。
Debian パッケージ化するとユーザは喜ぶかもしれません。
lsmod の出力が分かれば Debian カーネルはコンパイルが容易なので、 サービス化するとユーザは喜ぶかもし れません。 が、 それぐらい自分でやれという感じです。
知らないとハマるので、 一致しておいた方がいいと思っています。
第
48 回東京エリア Debian 勉強会 2009 年 1 月
____________________________________________________________________________________________