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

第23回 ソースコード・リテラシー【実践編 2】

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

前回は本連載で紹介してきたソースコードリテラシーの実践編として,pmountコマンドを組み込む際に遭遇したトラブルとその調査,解決方法を紹介しました。今回は,もうひとつの実例として,最近,P-Plamoの開発時に遭遇したpivot_rootがらみのトラブルの調査,解決の例を紹介しましょう。

P-Plamo とは?

P-Plamoとは,筆者が現在開発を始めているDVDメディアから直接起動するPlamo Linuxの名称です。HDDにインストールする必要がなく,CDやDVD,USBメモリといったメディアから直接起動して利用できるLinuxシステムは,一般にLiveLinuxと呼ばれ,DebianベースのKnoppixやSlackwareベースのSlaxなどが有名です。

Plamo Linuxでも過去にCD-Plamoという名称で CDメディアから起動して使えるシステムを開発したことがありましたが,昨今の多機能,大規模化が進む各種ソフトウェアを700MバイトというCDメディアのサイズに合わせるために取捨選択するのが面倒で,長く放置したままになっていました。

一方,最近では,4.7GBまで使えるDVDメディアの価格も数年前のCDメディア程度にまで下ってきましたし,数Gバイト規模のUSBメモリも気軽に買える値段になってきました。4GバイトくらいあればKDEやGNOMEといったデスクトップ環境まで含めたPlamo Linuxがそのまま入りますし,LiveLinuxで広く使われている圧縮ファイルシステム機能を使えば,pTeXやOpenOfficeまで収めることも可能でしょう。

そこで,Plamo-4.6の開発が一段落したのに合わせて,久しぶりにPlamo LinuxベースのLiveLinuxに取り組んでみたのがP-Plamoです。P-Plamoでは,かってのように700MバイトというCDメディアのサイズには拘泥せず,4.7GバイトのDVDメディアに収まればいい,ただし,あまり節操無くパッケージを追加するのもどうかと思うので,2Gバイト程度のUSBメモリに,自分のファイルと共に書き込める規模を目指す,という方針で開発を始めました。

トラブル発生

一般的なLiveLinuxではCDやDVDメディア上に置いた実際のルートファイルシステムを使う前に,メモリに読み込んだファイルシステム上で必要な初期化処理を行います。この仕組みはPlamo Linuxのインストーラと同じなので,P-Plamoの起動処理の部分はインストーラ同様のinitramfs機能を用いて実装しました。

限られた容量に可能な限りファイルを詰め込むためのファイルシステムの圧縮にはSquashFSを,リードオンリーになるルートファイルシステムに設定ファイルやログファイルを書き込むためにはaufsを用いたunion mountを使うことにしました。いずれの技術もまだ公式のカーネルソースには含まれていませんが,Slax等のLiveLinuxで広く使われており,各種パッチも公開されています。

Linuxでは,従来からromfsやcramfsといった圧縮ファイルシステムがサポートされています。SquashFSはそれら既存の圧縮ファイルシステムに比べても,より高い圧縮効率を実現している圧縮ファイルシステムです。現在は上記サイトで公開されているパッチを適用する必要がありますが,2.6.29カーネルでは正式採用になるそうです。

aufsはLinuxにおけるunion mountの実装です。union mountとは複数のファイルシステムを重ね合わせて一つのファイルシステムに見せる機能で,通常のmountならば下層になったファイルシステムは見えなくなりますが,union mountを使えば下層になったファイルシステムの上のファイルも透過的に見え,修正等の変更は上層のファイルシステムで吸収することができます。

この機能を使えば,ROなCD/DVDメディアを仮想的にRW可能なメディアとして取り扱うことができます。union mountはBSD方面では昔から利用されている機能で,LinuxでもUnionFSとaufsの2つの実装が提案されています。

これらLiveLinuxに必要な機能を提供するモジュールとCD-ROM関連のモジュールを,メモリに読み込んだ初期化用ファイルシステム上でBusyBoxを使ってカーネルに組み込み,DVDのありそうなデバイスを総当り的に探してDVDメディアをマウント,見つかったDVDメディア上のSquashFS化した正式なルートファイルシステムをloopback形式でマウントして,switch_rootでルートファイルシステムを切り替えるという形で,とりあえず動くバージョンをまとめることができました。

BusyBoxはシェル(sh)やcat, lsといったUNIX/Linuxの標準的なコマンドをコンパクトに再実装しようという試みで,組み込み環境やインストーラなど,記録メディアや使用可能メモリの容量に制限がある環境で広く利用されているツールです。

とりあえず動くものができたので,P-Plamo 0.1としてメーリングリストで紹介したところ,「終了時にDVDをejectして欲しい」というリクエストがありました。確かに現状ではDVDメディアをマウントしたまま電源断してしまうので,DVDを取り出すためには再度電源を入れてejectしないといけないので不便です。

当初は,終了処理の最後にでもejectコマンドを実行すればいいだろう,と簡単に考えていましたが,調べ始めたところ,かなり深刻な問題に気づきました。

P-Plamo 0.1ではswitch_rootでルートファイルシステムを切り替えて,DVDメディア上のSquashFSにある/sbin/initに処理を委ねてしまうため,ランレベルを切り替えて終了処理を実行している際も(DVDメディア上にある)initが動き続けるのでDVDメディアをアンマウントできません。

さてどうしたものか…,と,BusyBoxのejectコマンドをメディアのロックを無視するように改造する方法や,initコマンドの最後でejectを呼ぶように改造する方法なども検討しましたが,ヘンにローカルに改造したBusyBoxを使うのも気持ちよくないし,使用中のメディアを強制排出するのも行儀よくないでしょう。

そのため処理的には多少面倒になりますが,ルートファイルシステムを切り替える際,古いルートファイルシステムを捨ててしまうswitch_rootではなく,別のディレクトリ以下に残しておけるpivot_rootを使い,終了時には古いルートファイルシステムに戻った上でDVDをアンマウトしようとしました。

ところが,switch_rootの代りにpivot_rootを使おうとするとInvalid argumentのエラーになり,ルートファイルシステムが切り替わってくれません。

....
CD_DEV:/dev/hda
pivot_root to /loop
pivot_root: Invalid argument
chroot: cannot execute /loop/sbin/init: No such file or directory
Kernel panic - not syncing: Attemted to kill init!

よく似た機能なのに switch_root と pivot_root って何が違うのかな,と調べてみることにしました。

著者プロフィール

こじまみつひろ

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

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

コメント

コメントの記入