unix - ディレクトリ構造について
ディレクトリ構造について説明します。コンピュータに慣れていない人には、まず、ぴんと来ないことのひとつだと思いますので・・・。
案外にこのページは人が来るなぁと思っていたら、「ディレクトリ構造」で Google を引くとウィキペディアの次にここが出てくるのですね。
なのでもう少し突っ込んだ話を書いてみようかと思います。もし、このページが参考になったようでしたら、ちょいと右側にあるのをクリックしてやってください(笑)。
1. ディレクトリとは何か
2. UNIX では、ハードディスクはディレクトリ
3. fstab について
4. UNIX・Linux の主なディレクトリ
5. ちょっと面白かったディレクトリの話
1. ディレクトリとは何か
ディレクトリとは何か? Windows に慣れている人には、Windows でいうところの、フォルダというのがディレクトリだと理解してまず間違いありません。
エクスプローラで見てみるとフォルダが階層構造になっているのがわかりますね。あの階層のひとつひとつがディレクトリです。
ファイルという概念が理解できる人には、ひとつのディスクの中に数限りなくファイルを作る場合、階層構造にするということは理解できるかと思います。同じ階層に、ファイルが無限に近く並べられると、人間が把握するのにすごく難しいことになってしまいます。
大きな図書館に莫大な数の書籍が収められていることを想定してみましょう。
その図書館には体育館のようなひとつの部屋があり、その中に書籍が雑然と並べられていたらどうでしょう?利用者は自分の読みたい本を探すのにどれだけ時間をとられるでしょう?
やはり、いくつかの部屋があり、本棚があり、それが書籍の種類ごとに分類されて並べられていないと困りますね。
ディレクトリとは、図書館であり、図書館の部屋であり、書棚であり、その書棚の1段1段であるといえます。
部屋という階層、書棚という階層、段という階層があって分類が成り立つわけです。
もちろん、図書館には、司書がいて書籍が整然とならべられるように作業しているわけです。
コンピュータの場合、OS がはじめから用意しているディレクトリもありますが、人間の操作が入って新しいファイルを作ったり、消したり、変更したりします。
だんだんファイルの数が増えてくると、そのファイルをひとまとめにしてくくっておきたい集団がでてきます。
そうなれば、サブディレクトリを作成して、その中にある集団ファイルを治めることによって、コンピュータの内部が整理されていくことになるのです。
2. UNIX では、ハードディスクはディレクトリ
IBM/PC の Windows ではハードディスクが C: あるいは D: という単位になっています。また、C: のハードディスクをパーティションによって分割することで、仮想的に C: を D: と別のディスクとして扱うことができます。
UNIX では、ハードディスクが何台接続されているか、パーティションがどうきられているかということは、オペレータからは、わかりません。
すべて、ディレクトリという単位になっています。
一番最上位にあるのが「/」であらわされるものでルートディレクトリといいます。ディレクトリの単位は「/」で区切られて分類されていきます。
FreeBSD で最低必須なディレクトリとして、ルートディレクトリの下に /usr、/etc、/var、という3つのディレクトリがあります。
ユーザ用のディレクトリとして /home というディレクトリがありますが、これは、/usr の下に /usr/homeとしてサブディレクトリ化されていることもあります。
通常、ユーザは、/homeの下にユーザ用のディレクトリをひとつ持ち、以下に自分用のサブディレクトリを作って作業することになります。
そのディレクトリがどのハードディスク上にあってどのようにパーティションがきられているかを一般ユーザが意識することはほとんどないと言っていいでしょう。ただし df というコマンドを使えば、実際にルート直下のディレクトリが物理的にどこに存在して、どのくらいの容量を持っているかを確認することはできます。
どれくらいの容量を持っているかは意識する必要があります。不要になったファイルをいつまでも残しておくとディスクの容量が減っていって、パフォーマンスが低下してきます。それぞれのルート直下のディレクトリには、30% 以上の空き領域を持たせておくことを心がけましょう。
3. fstab について
前項で「UNIX では、ハードディスクが何台接続されているか、パーティションがどうきられているかということは、オペレータからは、わかりません。」と言いましたが。
/etc/fstab というファイルにアクセスすることができるならば、それを知ることができます。
(Solaris の場合は /etc/vfstab というファイルになります)
あまりいい例ではありませんが、わたしの使用しているマシンの /etc/fstab を見てみますと (先頭の部分だけ)
# Device Mountpoint FStype Options Dump Pass#
/dev/ad4s1b 伏字
/dev/ad4s1a
/dev/ad4s1d
/dev/ad4s1f
/dev/ad4s1e
/dev/acd0 /cdrom cd9660 ro,noauto 0 0
実は物理的なハードディスクはひとつしかないのです。
「/dev/ad4s1」までが物理的な1台のハードディスクを示していて、そのあとに続くのは Windows でいうところのパーティションで分割しているのです。
「/dev/acd0」が光学ディスクです。複数台あれば「/dev/acd1」「/dev/acd2」というように数字が増えていきます。
ハードディスクの方もこれは IDE なのですが、マスタだったりスレーブだったりで ad4s1 や ad4s2 になったり、IDE でなく SCSI だったりすると ad の部分の文字が変わったりします。
また、これらの文字は、それぞれの OS ごとに違う文字を使用したりしています。
少なくとも、/etc/fstab もしくは /etc/vfstab を見れば、物理的にどのようなディスクドライブを使用しているかがわかります。
4. UNIX・Linux の主なディレクトリ
UNIX もしくは Linux の主なディレクトリについて紹介しておきます。
ここではあくまで代表的なもので、同じ OS であってもバージョンによって構成が違ったり、Linux では、ディストリビューションによって構成が違っています。
ルートディレクトリ「/」だけは、unix であろうが Linux であろうが間違いなく存在する。
ここだけは断言しておきます。
逆にルートディレクトリが存在しなければ、unix でも Linux でもないと言い切ってしまいます。
ただこれが何者かというと少し難しくなってきます。
ルートディレクトリは物理的に存在していますが、そこに存在するものは物理的にルートディレクトリ内に存在しているかというとそうではないものがあったりします。
Windows でいうならば以前「マイコンピュータ」と言っていたもの、 Windows10 では「PC」になっていますね。
「マイコンピュータ」を開くと物理的なハードディスクである「C:\」が存在していますが同じ階層にネットワークの他のマシンや自分のドキュメントフォルダが存在しています。
unix のルートディレクトリの場合、個人的なものは存在しませんが (chroot されてる場合は別の話として、ここでは OS 固有のディレクトリの話です) 物理的にルートディレクトリ配下に存在しているもののほか、実際は他のドライブからのシンボリックリンク的なものが存在します。
インストール時の構成によって、ある程度の違いは出てくるものですが、おおざっぱにこれくらいは存在するであろうというものを表にしてみます。
ファイル FreeBSD CentOS Solaris 備考
COPYLIGHT ○
FreeBSD にのみ存在するのかもしれません。
コピーライトが記述されたテキストファイルです。
/bin ○ ○ ○
FreeBSD では OS の最小構成のロードモジュールを配置しています。
FreeBSD には44個、CentOS には95個のロードモジュールがあります。
Solaris は /usr/bin へのシンボリックリンクになっています。
/boot ○ ○
FreeBSD では OS の起動時に使われるプログラムと設定ファイルが格納されています。
/cdrom ○ ○
/dev ○ ○ ○
デバイスの定義が格納されています。
Windows で言うと「デバイスマネージャ」の中身に近いかと思います。
/dist ○
/etc ○ ○ ○
システムの設定ファイルやスクリプトが格納されています。
/home ○ ○ ○
ユーザのホームディレクトリです。これは、実はデフォルトでは作成されない(一般ユーザを登録してはじめて作成される)せいか、FreeBSD のハンドブックには説明がありません。
数多くのユーザをかかえたり、ユーザごとに多くの環境を持つ場合は、実はここが結構、大きな領域をしめることになります。
/lib ○ ○ ○
/libexec ○
/lost+found ○ ○
/media ○ ○
/misc ○
/mnt ○ ○ ○
/net ○ ○
/opt ○ ○
/proc ○ ○ ○
/rescue ○
緊急時のために静的にリンクされているプログラムの格納場所。
/root ○ ○
root ユーザのホームディレクトリ。
/sbin ○ ○ ○
/selinux ○
/sys ○ ○
/tmp ○ ○ ○
テンポラリファイルの格納場所。
OS を再起動するとクリアされるので、大事なものを置いてはいけない。
/usr ○ ○ ○
大部分のユーザ用アプリケーションが格納されています。
/var ○ ○ ○
ログ・一時的なファイル・スプールファイルなどいろいろな用途に使用します。
凡例
ファイルの箇所は、ファイルもしくはディレクトリを示します。
○は存在することを。空白は存在しないことを示します。
FreeBSD の説明は主にハンドブックからの転載になります。
OS のバージョンはそれぞれ以下の通り。
FreeBSD 9.3-RELEASE
CentOS 6.4
Solaris 10 (SPARC)
5. ちょっと面白かったディレクトリの話
ユーザ用のディレクトリ名が /home であったり、/usr であったり、慣れないひとにはわかりにくいかと思います。面白い記事をみつけましたので、記載しておきます。(「なぜ,/var や /etc が /etc や /cfg というディレクトリ名ではないのか? 」の孫引きになります)
なぜ,/var や /etc が /etc や /cfg というディレクトリ名ではないのか?
Unixを使っていると,/usr が全然ユーザー用じゃなくどう見てもシステムのための物だったり,/etc が事実上設定ファイル置き場となっていたり,/var がログファイル置き場となっていたりと,名が体を現していなくて奇妙な感覚を覚える.もっと分かりやすい名前の付け方があったんじゃないかと,Unixユーザーならば誰もが思うはずだが,これに対する解答がredditに投稿されており,その内容が非常に面白かったので,軽く翻訳してみた.
Anyone know why /var and /etc weren't named something like /etc and /cfg?
anyone know why var and etc werent named
昔々,システム7が使われていてUnixがピカピカで新しかった頃,/bin にはバイナリファイルを,/usr にはユーザーのホームを,/libにはライブラリを,その他は /etc 以下に置くことが決められた.これは,"エトセトラ"が意味することそのものであった.その後,アプリケーションには設定ファイルが必要となり,それらは独自の階層を持つディレクトリを作り置いていた.しかし,ユーザーはそのファイルを見つけにくいと文句を言った.彼らは,全てのファイルが /etc というひとつのディレクトリに置かれることを望んだのだ.
その後しばらくたち,ユーザーは自分でコンパイルしたバイナリを /bin 以外の他の場所に起き始めた.やがて,システムが提供するバイナリと混同するのを避けるため,それらは /usr/bin 以下に置かれることになった.
/usr はユーザーによってインストールされたものが置かれる標準ディレクトリとなり,ますます,いろいろなモノがインストールされるようになった.しかし,それらの多くは,システムによって利用されるようになってしまった.そのため,人が使うディレクトリと,システムが使うディレクトリを分離するため,ユーザーのホームディレクトリは,/home に移された.
/var はディスクレスのワークステーションから生まれた.これらは,ディスクなしで起動し,カーネルはNFS経由でロードされ,/ と /usr ファイルシステムはリモートのサーバから,読み込み専用のファイルシステムとしてマウントされた.すべてのオペレーティングシステムのファイルは,すべてのワークステーションで同一であるので,これは納得出来ることであった.それらワークステーションは同じ共有ファイルシステムをマウントするのだ.しかし,依然として,ワークステーションが読み書き可能な独自のファイルシステムが必要であったので,ワークステーション間で違う変数(variable)を保存するためのファイルシステムとして,/var が生まれたのだ.
ああ,私も歳をとったものだ.
A long long time ago, in the System 7 days when Unix was shiny and new it was decided that in /bin would go the binaries, /lib the libraries, in /usr would go the users' homes and everything else would go in... /etc. That's what it meant back then, "et cetera". When applications needed configuration files they often put them in their own additional hierarchies but the users complained that trying to find those files was annoying; they wanted all those files in one directory and /etc was the only place that fit the bill.
After a while the users started compiling their own binaries and they needed to put them someplace other than /bin, so as not to confuse them with the system ones, so that's where /usr/bin came from.
Because /usr became a standardish place which could be used for user-installed stuff, it was more and more populated with things started by users but a lot of those were adopted by systems, so after a while users' homes were moved into /home to segregate the humans from another directory known for system stuff.
/var was born out of the needs of diskless workstations. Into those days, you could boot a machine without a disk; they would load their kernel over NFS and then mount the / and /usr filesystems read-only from a central remote server. It made sense since all the operating-system files were identical on all workstations, so they all mounted the same shared filesystems. But you still needed at least one filesystem where the workstations could read & write their own files separately since this stuff was "variable" between workstations, /var was born.
Boy I'm old.