FreeBSD の mount は 7.0 で壊れて、8.0 で更に悪化2009年03月14日 12時14分56秒

UNIX の mount(1) プログラムは、古来より mount_XXX を活用するように作られている。mount が扱えるのは、FreeBSD なら ufs 等といったように、システムのデフォルトのファイルシステムぐらいだ。

数あるファイルシステムを一つのコマンドで賄うのには無理がある。そこで、各ファイルシステムに特化したプログラムをと言った経緯で古い時代の UNIX から、外部コマンドに依存した形になっていた。

大まかな mount_XXX の経緯はこんなところだ。実際に、mount_ を探してみると、手元のシステムでもこんなに沢山の物が出て来る。


% locate mount_ | grep bin
/sbin/mount_cd9660
/sbin/mount_md
/sbin/mount_mfs
/sbin/mount_msdosfs
/sbin/mount_nfs
/sbin/mount_nfs4
/sbin/mount_ntfs
/sbin/mount_nullfs
/sbin/mount_udf
/sbin/mount_unionfs
/usr/local/sbin/mount_fusefs
/usr/sbin/mount_fusefs
/usr/sbin/mount_ntfs-fuse
/usr/sbin/mount_nwfs
/usr/sbin/mount_portalfs
/usr/sbin/mount_smbfs

残念ながら弊害として、似たようなコードが大量にでてくることだ。聞いた話だが、それが嫌でシステムコールの nmount で全てのファイルシステムをサポートしようと作業を 7.0-CURRENT で開始した人がいたようだ。

この作業に三つの大きな問題があった。

一つ目は、その方法。同じ関数や作業が重複しているのは GEOM など他にもある。GEOM も同じように各クラス毎に専用のコマンドがある。GEOM ではライブラリを用いることで、この重複を回避している。実際に、main も含めた大部分が共有化されていて、ライブラリ以前に書かれたものはともかく、最近の GEOM クラスは自前の特殊処理部分を処理するだけに過ぎない。libmount でも作って、似たような方法を取った方が後方互換を保つためにも、作業の独立性を保つ為にも優れていた。

二つ目は非現実的な計画。7-CURRENT で作業が始まったようだが、全然作業が進んでいない事。6.0-RELEASE は 2005 年の 11 月に出たので、三年以上経っている。また、ここ一年でそれらしき、変更を見たことはない。もしかしたら個別にやっているのかも知れないが、現在の nmount 関連は中途半端な状態で放置されている。

三つ目は意図的に非互換な実装をしている事。これらの変更のため、7.0-RELEASE から mount プログラムは外部のプログラムを呼ぶべきかの判定をしている。その実装が、陳腐なのだ。その実装とは、外部コマンドとして呼ぶべきファイルシステムを羅列しておき、それに該当する場合は外部コマンドを呼ぶ。愚の骨頂だ。外部コマンドを全て列挙できるはずがない。実際に、並べられているのは素のシステムで入る nmount がサポートしていない物だけだ。ports から入った mount_XXX はもちろん mount で失敗する。余りにも自明な問題なので、何人かが nmount が扱える物を列挙し、それ以外だったら外部コマンドを呼ぶように提言した。しごくもっともな話だ。システムの正常な起動な部分に関わるところなのだから、後方互換を保つのは当然の話だ。実際にこの問題のせいで、7.0-RELEASE を最初に試した時は、正しく起動すら出来なかった。しかし、そのような提案も気に入らないといった愚かな自負で却下され、現在の惨状に至っている。

そして、最近さらにそれを 助長する変更がされた。現在の mount が正しく外部コマンドを呼べないので、外部コマンドを指定して呼ぼうと言う事らしい。恥の上塗りだろう。そのために、8-CURRENT の mount は mount_XXX を正しく呼べないので、option 部分にファイルシステム型に追加して、わざわざ外部プログラムを呼ぶことを明記しなければいけない。ここには二つの深刻な欠陥がある。本来 mount_XXX を呼ぶのを前提に作られた mount プログラムが mount_XXX を正しく呼ぶことが出来ない。これを形容する言葉が見当たらない実装だ。そして、二つ目はシステムの起動に関する繊細な部分が二つのメジャーリリースにわたって、後方互換のない変更がなされている事。どんな nmount と mount の実装をしようと思っているのかは知らないが、早く以前と同じ書式で正しく動くような形での再実装を終わらせて欲しいものだ。

散々批判したが、パッチを当てれば動くし、正しく動作するシステムを自前で用意するのも無理なので、今のところは FreeBSD から他に移るつもりは無い。