ソースコード・リテラシーのススメ

第16回 トラブルの状況を読む

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

カーネルの設定オプションの調査

CONFIG_LSFというのはカーネルをコンパイルする際のオプション指定のようなので,カーネルのビルドオプション設定ファイルである/usr/src/linux/.configを調べました。下記でgrepに与えている-C 3オプションは,該当する行の前後3行を合わせて表示するという指定です。

# grep -C 3 CONFIG_LSF /usr/src/linux/.config
CONFIG_BLOCK=y
CONFIG_LBD=y
# CONFIG_BLK_DEV_IO_TRACE is not set
# CONFIG_LSF is not set
CONFIG_BLK_DEV_BSG=y

なるほど,確かにCONFIG_LSFという設定はコメントアウトされて有効になっていません。このオプションはどこで指定するのだろう…,とmenuconfigの画面をあちこち探し回って,ようやく,Enable the block layer -> Support for Large Single Filesというオプションを発見しました。解説によると,2Tバイトを越えるような巨大なファイルを扱いたい時に指定するオプションだそうです。そんな巨大なファイルを扱う必要はないだろうと考えて,Plamo-4.5用のカーネル設定ではオフにしていた機能ですが,ext4 fsのヘルプメッセージにあったように,ext4 fsは16Tバイトを越えるようなファイルを扱えるように設計されているため,この機能を必要とするのでしょう。

改めてmake menuconfigでこのオプションを有効にした上でカーネルを再構築したところ,ようやくext4devファイルシステムが使えるようになりました。

# mount /dev/sda2 /mnt -t ext4dev
# dmesg | tail
...
EXT4 FS on sda2, internal journal
EXT4-fs: mounted filesystem with ordered data mode.
EXT4-fs: file extents enabled
EXT4-fs: mballoc enabled

なお,インストーラでOOM killerが発生していたのは,インストール用のパーティションがマウントできなかったため, ramdisk上のmntディレクトリ以下にパッケージが展開されてしまい,ramdiskがメモリを使い果たしたせいでした。最新のカーネルといえども,利用可能なメモリがどんどん少なくなっていくという異常な状況は如何ともしがたかったようです。

grubの更新

上記の作業でext4 fsがルートファイルシステムの一種として利用可能になったものの,実際にext4 fsをルートファイルシステムに指定してインストールテストを行うと,インストールは無事終了するものの,再起動しようとするとgrubが正しく起動しません。

当初は「grubのインストールをミスったのかな?」と思って,インストーラのgrubからHDD上のカーネルを読み込ませようとしましたが,インストーラのgrubもファイルシステムの種類こそ ext2fs だと認識するものの,⁠Bad file or directory type⁠ 言ってファイルシステムの中身を読んでくれません。

図3 grubのエラーメッセージ

図3 grubのエラーメッセージ

一方,インストーラのシェルを操作して,手動でこのパーティションをマウントすることは可能です。

「どうもgrubがext4に対応していないみたいだ」と考えて,Googleでext4とgrubをキーワードに検索してみると,grub legacy(grub-0.97) はext4 fsで追加されたextents機能に対応していないこと,対応するためのパッチがすでにgrub開発者のメーリングリスト(bug-grub@gnu.org)に投稿されていることなどがわかりました。

かってLinux上で広く使われていたブートローダであるliloでは,ロードすべきカーネルイメージをHDDの絶対番地(CHSやLBA)で指定していました。そのため,カーネルを更新するたびに/sbin/liloコマンドを再実行し,カーネルイメージの絶対番地を再登録してやる必要がありました。一方,grubではカーネルイメージはファイル名で指定できて便利なのですが,そのためにはgrub自身がカーネルイメージを置いたファイルシステムの構造を理解する必要があり,ext4 fsのような新しい構造のファイルシステムに対応するにはそのためのコードが必要となります。

本文中では触れませんでしたが,今回のトラブルでもliloは問題なくext4 fs上のカーネルを起動することができたので,liloのシンプルさは捨てたものじゃないな,と改めて感心しました。

パッチがあれば話は簡単,とブラウザからカット&ペーストしてパッチファイルを作り,ext4 fsに対応するためのパッチを適用しようとしましたが,画面を見易くするために長い行はブラウザが自動的に改行コードを挿入してくれるのか,カット&ペーストのままではあちこちでパッチファイルの不整合が生じています。

それでは,とソースコードをダウンロードして使おうとしても&等のHTMLのスペシャルキャラクタが邪魔をしてやはり正しく適用されません。

結局,パッチファイルを手で整形した上で,適用しそこねた部分は手動で修正し,再度差分を取り直すことで,何とか ext4 対応の grub をパッケージ化できました。作成した新しいgrubパッケージを使えば,TABキーを叩くとext4 fs上のファイル名もきちんと補完してくれました。

このgrubパッケージをPlamo-4.5のツリーに移して,ようやくext4 fsをルートファイルシステムとして使えるようになりました。

今回の例ではインストーラでの動作チェックやマウント状況の確認,grubでの動作チェックなど,段階を踏んで進めることができたため,それぞれの段階で発生した問題を比較的容易に解決できましたが,このトラブルが「ext4 fs 上にインストールすると起動しない」といった形で重合して発生した場合,要因の切り分けや原因の特定にはもっと時間がかかったことでしょう。トラブル解決の際には少々遠回りに見えても,ひとつひとつ条件を確認した上で進む方が,結局はより速く目的地に到着することがよくあります。

著者プロフィール

こじまみつひろ

Plamo Linuxとりまとめ役。もともとは人類学的にハッカー文化を研究しようとしていたのが,いつの間にかミイラ取りがミイラになってOSSを仕事にするようになってしまいました。最近はスペシャリスト養成を目的とした専門職大学院で教壇に立ったりもしています。

URLhttp://www.linet.gr.jp/~kojima/Plamo/index.html