Skip to main content.

/bin/usr/bin が同一なのはなぜか

/bin/usr/bin が分かれていないという事実に対する、簡単な説明です。

Cygwin のデフォルトでは、「C:\Cygwin\bin」が「/usr/bin」に、「C:\Cygwin\lib」が「/usr/lib」にそれぞれマウントされています。これでは、/bin(= C:\Cygwin\bin)と /usr/bin/lib(= C:\Cygwin\lib)と /usr/lib が全く同じディレクトリを指すということになってしまいます。「なぜこのようなマウントが採用されているのか」という疑問を感じた方もおられることでしょう。この奇妙なマウントは、Cygwin と UNIX の根本的な違いに基づいて設定されているものです。

UNIX 系 OS では起動時にルートパーティションだけをマウントし、必要な初期化処理を行ってから他のディスクやパーティションをマウントします。また、UNIX 系 OS にはシステム保守用の「シングルユーザモード(root として一人のユーザだけがログイン可能なモード)」という特別なモードが存在します。しかし UNIX 系 OS では様々な理由から /usr を別パーティションとして作成することが多いため、起動直後には /usr/bin に格納されているコマンドが利用出来ない場合もあり得ます。

そこで、UNIX 系 OS では起動直後にすぐ利用するコマンドや、シングルユーザモードででも使われるようなコマンドを厳選して /bin に、そして /bin 内のコマンドやカーネルが利用する共有ライブラリやモジュールだけを /lib に置いています。/bin/lib はルートパーティションに置かれているディレクトリですので、仮にルートパーティションしかマウントされていないとしても、/bin に格納されているコマンドについては利用可能となるわけです。

ところが Cygwin は OS ではありませんから、このような区別を設ける必要はありません。/bin/usr/bin は同一で構いませんし、/lib/usr/lib を区別する必要もありません。むしろ、各コマンドが /bin に置かれているのか、/usr/bin に置かれているのかを意識するほうが厄介です(この区別を「厄介」だと感じるのは、ユーザよりもむしろパッケージを作成する開発者かもしれませんが)。/bin/usr/bin が全く同一という、UNIX の常識から考えれば奇妙な構造は、このようにして生まれたのです。

この考えでいけば、/sbin/usr/sbin も本来は区別しなくてもよいはずですが、何故か /sbin については区別されています。しかし、これは「区別している」のではなく、ただ「単に深く考えられていない」というのが理由だと思われます。

なお、一般の UNIX 系 OS では共有ライブラリ(.soなど)は /lib/usr/lib に格納されます。しかし Windows では実行パス中に置かれていない DLL は利用できませんので、Cygwin では /bin のような、実行パスが通された位置に DLL が格納されています。