【翻訳】/binと/usr/binが分裂してる訳

Busyboxメーリングリストでのやり取りより

Posted by midchildan on May 22, 2015

1969年、どのようにケン・トンプソンとデニス・リッチーはPDP-7でUnixを開発したか知っているだろうか。実は1971年に彼らは1.5MBのRK05ディスクパックを2つ搭載したPDP-11にアップグレードした。

彼らのOSが大きくなり、ルートファイルシステムとして使ってた1個目のディスクに収まりきらなくなったとき、保存しきれなくなったファイルは2個目のディスクに移した。このディスクにはもともとユーザーのホームディレクトリが保存されてたために /usr という名前でマウントされていた。こうして第二ディスクに /bin , /sbin , /lib , /tmp などOSのディレクトリを複製して新しいファイルをそこに書き込むことで容量不足を解消した。しばらくして彼らが2個目のRK05ディスクパックを入手したとき、全ユーザーのホームディレクトリは新たにここに移されて /home にマウントされた。よってOSが使用できるディスク容量は最初の2つのディスク併せて3MBまで増えたのだ。

知っての通り彼らは「システムが起動する初期の段階で/usrをマウント出来ようにする必要があるため、mountコマンドのようにシステム起動に不可欠なコマンドは/usr/binに保存してはならない。もしそのようなことをすれば鶏と卵の問題が生じシステムを立ち上げることが不可能になる」という決まりを作った。非常にわかりやすい決まりではあるがv6 Unixが開発されたハードウェアにひどく依存している。

/bin/usr/bin の分裂は1970年代のハードウェア固有の問題によって生まれた実装詳細であり、なぜそのようなことを行なうのかを疑問に思わないお役所主義者によって今にも引き継がれている。しかし以下の理由によりLinuxが開発される前からすでにこの決まりは意味を成さなくなっていた。

  1. システム起動の初期段階はinitrdやinitramfsの役割であり、「このファイルをロードする前に別のファイルが必要だ」みたいな問題は解決してくれる。システム本体を起動するための一時的なシステムならもうすでに間に合っている。
  2. BSDでの共有ライブラリの導入により /lib/usr/bin は互いに依存するになり、これらが咬み合わないと動作しなくなった。1974年の時点ではそのようなことはなく、全ては静的にリンクされていたためある程度の独立性を保っていた。
  3. 低価格ハードディスクの容量が100MBを超えたのは1990年あたりになってのことであり、パーティションのリサイズソフトが登場したのもこの頃である(partition magic 3.0は1997年に出荷された)。

一度決まりができてしまった以上、人々はそれを正当化する決め事を他にも色々考えた。ルートディレクトリはアップストリームから来たOS関係のファイルに使用し、 /usr は独自に導入するファイルのために使用した。やがてその決まりは変わり / にAT&Tから入手したファイルを、/usr はIBM AIXやDec UltrixやSGI Irixなどのディストロが追加したファイルを、そして /usr/local にユーザー自身がインストールしたソフトウェアに必要なファイルを保存する決まりになった。しかしさらにその後誰かが /usr/local は新しくパッケージを入れる場所としては不適切だから新たに /opt を追加しようと言い出した。この調子だと /opt/local が出現する日もきっと近いだろう。

それから30年が経ち状況は更に悪化してディストロ固有のルールが数多く生まれては消えていった。「/tmpの中身は再起動ごとに消えるが /usr/tmp はこの限りではない」みたいなルールもその一例である。もちろん、Ubuntuでは /usr/tmp は存在しないしGentooでは /usr/tmp/var/tmp へのシムリンクになっていて再起動ごとに中身は消えない決まりになっている。もっとも、これらは全てtmpfs以前の話であり、実に様々なことが絡んだ結果であった。例えば読み込み専用ルートファイルシステムの存在や /usr が特定の条件で読み込み専用にされたこと、書き込みが行える領域として /var が設定されていたこと。 / はほぼ読み込み専用であったが /etc の一部は書き込み可能であり、それを /var に移そうという試みがあったことなども。/etc/var/etc にシムリンクされていたりすることもよくある訳で…

Linux Foudationのような規格策定のお役所さんはこのような決まりを嬉々として規格化してますます状況を複雑にしているが、そもそもなぜそのような決まりが存在してるのかについて問うことはしない。ケンとデニスは容量不足解消のためにOSの一部を /home と同等のパーティションに保存したという事実などお構いなしだ。

結局 //usr にファイルを分ける意味はもはや無い。自分は /bin, /sbin, /lib などは /usr にある同等のディレクトリにシムリンクしている。

元記事: The busybox Archives: Understanding the bin, sbin, usr/bin, usr/sbin split