2012-03-19

Linuxのディレクトリ構造について

Windowsにおける、ユーザーが見るディレクトリ構造は、ドライブレターを用いてる。これは、物理的なHDDなどの記憶装置による分割はもちろん、その上に構築されるパーティションによる論理的な分割もある。

一方、Linuxのディレクトリ構造は論理的なもので、ユーザー側からは、通常の利用においては、あまり物理的な記憶装置を意識しないようになっている。

もちろん、最近は両OSとも、古典的なファイルシステムや物理的な記憶装置、パーティション管理を捨てて、ソフトウェア側で複数の記憶装置を、あたかもひとつの巨大な記憶装置のように使う手法を提供している。Windowsでも、今やシンボリックリンクはサポートされている。とはいえ、依然としてWindowsではシンボリックリンクが一般的ではなく、本来そういったハードウェア上の詳細を知らなくてもいいはずの末端ユーザーでも、ドライブレターを意識しなければならない。もちろん、これはWindowsではシンボリックリンクが一般的ではなかったので、急にGUIのエクスプローラーにシンボリックリンク作成の機能を付け加えても、混乱が大きいことにもよろう。それに、Windowsの顧客層を考えれば、ドライブレターという従来の仕組みを急に捨て去ることは難しい。

Linuxの問題は、ディレクトリ構造がディストリごとに微妙に異なるということだ。一応、Filesystem Hierarchy Standardという規格はある。しかし、この規格は本当に基本的で大雑把な構造を規定しているだけだ。それに、標準的なディレクトリパスを取得する標準の方法がない。Windowsでいう、SHGetKnownFolderPath関数のようなAPIがないのだ。Linuxでディストロ間のバイナリ互換性を保証するのが難しい理由の一つに、ディレクトリ構造の差異によるものがあると聞く。

追記:FHSによれば、ユーザーのホームディレクトリを取得するには、getpwentを使うことが推奨されている。

それに、FHSはすべてのディストリで守られているわけではない。たとえば、DebianはFHSに完全には従っていない。とくに、DebianはFHSのmultiarchの場当たり的でx86とx86-64限定の対応に不満を持っていて、もっと汎用的な方法を独自に考案し、今移行中である。Ubuntu 12.04では移行するらしい。もっとも、/lib32や/lib64へはシンボリックリンクを貼るので、ある程度の互換性は保たれるようだが。

Debian Policy Manual - The Operating System
Multiarch - Debian Wiki

ともかく、慣習的に、Linuxではパスは大抵ハードコードされている。移植性を考えたソフトウェアは、使用時やビルド時にパスを指定する機能を提供している。これは、ユーザーは最低限のプログラミングの知識を有していることが期待され、ソフトウエアはソースコードの形で提供するというUNIX文化ならばうまく動く。また、主要なディストリには、公式なパッケージの仕組みがあり、需要のある有名なソフトウェアやライブラリには、専門のメンテナーがいて、そのディストリ用にあらかじめ調整してくれているので、大多数のユーザーは、そのような詳細にかかずらう必要がない。Debianが大胆なmultiarch対応を実行に移せるのも、このような文化の違いにもよろう。

もちろん、Windowsより優れている点もある。公式パッケージの仕組みもそうだし、ヘッダーファイルやライブラリファイルの標準のパスがあるので、ソースコードをコンパイルする際に都合がいいということだ。こと、他人の書いた大規模なソースコードをコンパイルする場合に関しては、Windowsよりよっぽど楽だ。あるソースコードをコンパイルするために、今まで使ったことがないコンパイラーやインタプリターやビルドシステムやライブラリの手動インストールに悪戦苦闘する必要はない。もちろん、これはソフトウェアをソースコードの形で提供する文化から生まれた必然性であろう。プログラマーは無駄な単純作業を忌み嫌うからだ。

いま理解に苦戦しているのは、Linuxでソフトウェアを作る際、どういう風にディレクトリを使えばいいのかということだ。どうも、binには実行可能ファイルだけをいれ、設定ファイルやドキュメントやその他のリソースは、それぞれ別の対応するディレクトリに入れるのが一般的らしい。しかし、binは単に/binだけではなく、複数あり、それぞれ役割が違う。それぞれの役割はFHSで規定されていて、ほとんどのディストリはこれを守っているようなので、とりあえず今はFHSを頭に入れておけば十分だろう。

ともかく、別のプラットフォームに移行するのは苦労する。このような、初心者でも当然知っているべき基本的なことから学ばなければならないのだから。もはやWindowsはプログラマーの使うデスクトップOSとして未来がない以上、しかたのないことだ。

No comments: