計算機ではさまざまな情報(デジタル計算機なのでビットの列)を扱います。 利用者がこの情報を扱うときには、 アドレス空間などの数字の羅列で情報の記憶された場所を表すよりも、 この情報の「ひとかたまり」にそれぞれ 人間(すなわち利用者)にとって理解しやすい名前をつけて保管しておき、 その名前を用いて管理、利用するのが便利です。
この「ひとかたまりの情報に名前をつけたもの」をファイルといいます。 そしてこの「ファイル」は、 様々な記憶装置(通常は磁気デバイス(FD,HD等)やテープデバイスなどの2次記憶装置)に保管されます。
例えばハードディスクドライブでファイルを利用しようとすると、 ただ接続すればいいというわけではありません。 ディスクそのものにできる事は単に 「あるトラックのあるセクタにビット列を格納したり、そこから読み出すこと」 だけだからです。 これだけでは「ファイル」として扱う事ができないので、 OSでディスクの上に複数の「ファイル」をつくり管理するようなしくみが必要です。 OSのなかでこの部分をファイルシステムと言います。
unixのファイルシステムの大きな特徴は
このうち、階層型ファイル構造については次節で詳しく述べます。 このようなファイル構造の構築にあたって、 unixでは次のような3種類のファイルを区別して運用しています 。
ファイル種別 | 説明 |
---|---|
通常ファイル Ordinary file |
もっともファイルらしい性質を持つ。 文字列のバイト・ストリームで構成されるテキスト、プログラム、 それに数値データ群などがその内容である。 |
特殊ファイル Special file |
unixでは各種の周辺装置が論理的にはファイルとして扱われる。 つまり、各周辺装置は仮想化されたファイルとみなされる。 このようなデバイスをあつかうファイルのことを特殊ファイルという。 |
ディレクトリファイル Directory file |
通常ファイル、特殊ファイルは、その内容によって分類し、 ひとまとめの見出しをつけるのが便利である。 unixファイルシステムではこの見出しの役割をもつのがディレクトリファイルである。 このディレクトリファイルが「階層型ファイルシステム」において重要な役割を占めている。 ディレクトリの中にディレクトリを作成することも可能である。 それがサブディレクトリである。 |
図1:階層型ファイル構造
unixのファイルシステムは、 図1に示すようなルートディレクトリにはじまる木構造になっています。
unixでは、このディレクトリの木をつなぎ合わせる機能の事をマウント (mount)といい、 つなぎ合わせた位置の事をマウントポイントといいます。 どのようなマウントが行われているかは mount コマンドで確かめられます。
MS-DOS や MS-Windows などにもディレクトリ(フォルダ)はありますが、 unixではこれらのOSのようにドライブという概念は存在しないので、 物理的に異なるデバイスでもこの木構造の中にマウントして扱います。 また、ネットワーク経由で他のマシンのファイルシステムをマウントできます。
NFS(Network File System)などの場合でも、 同様にこの木構造にマウントします。
一般的にunixで使われる、最初の階層のディレクトリの例を示します。
/dev | この下に各種周辺装置(デバイス)に対応する 特殊ファイルが所属する。 |
---|---|
/var | 更新されるファイル用ディレクトリ。 例えば逐次更新されるlogファイルやスプール空間などが置かれる。 |
/etc | システム管理用のディレクトリ。システムの各種設定ファイル等。 設定用のコマンドが入っていることもある。 |
/bin | 標準コマンドディレクトリ。基本コマンドの実行可能ファイルが入っている。 |
/lib | 標準ライブラリディレクトリ。 システムユーティリティやサブルーチンプログラムのファイルが所属。 |
/tmp | 作業用ディレクトリ。一時的なファイルを保管。 |
/usr | 歴史的にはシステム中核以外のファイルやディレクトリを/usrに入れてきた。 ディスクが大容量になってきた現在では厳密な意味は無い。 /usr/bin /usr/lib などにはそれぞれ副次的な標準プログラム、 ライブラリ等が置かれる。 |
/home | ユーザのホームディレクトリを集めたディレクトリ。 例えば、ユーザhoge のホームディレクトリは/home/hogeなどのように、 この下にユーザ名で作る。 /usr/homeへのリンクになっているシステムも多い。 |
ファイルをどのようなものとして扱うかはOSによって異なります。 レコードの集合であったり、いくつかのレコードをまとめたブロックだったりします。 また、レコードやブロックの長さは固定長だったり可変長だったりします。
しかしunixでは、通常ファイルはすべて「バイトの列」です。
もちろん、その用途としては文書、プログラムソース、実行ファイル、
ライブラリなど様々です。しかし、
これらはすべてunixというOSからはまったく同じものとして扱われる。
また、利用者の立場から見れば「テキストファイル」と「バイナリファイル」
という区分もできる。
テキストファイルは、バイト列をそのまま文字コードとして扱えるので、 catコマンド(ファイルの連結、表示を行う) や各種のエディタで内容を確認ができます。 一方バイナリファイルは、 実行ファイルなど人間がそれをみても簡単には認識できないデータです。 これはodコマンド( 8進, 10進, 16進, ASCIIでのダンプ) などを使用すれば中身を確認できます。
先にも述べたようにデバイスファイルなどの特殊ファイルも、 通常ファイルと同様に扱えます。 これらのファイルは記憶装置上にあるファイルとは異なり、 そのデバイスそのものを表しているので、 固定したバイト列としてのデータが存在する分けではありません。 しかし、通常ファイルと同様に、 それらのデバイスファイルにデータを書き込んだり、 データを読み込んだりすることで、 そのデバイスにアクセスが可能です。
ファイルには内容に加えて多数の属性が付随しています。 ファイルに書き込み権限があれば、 利用者は、所有者、グループ、 保護モードなどそのファイルの属性を書き換えられます。
ファイルの属性は、以下の表のとおりです。
種別 | 通常、ディレクトリ、特殊ファイルの別 |
---|---|
所有者 | プロセスと同様 ファイルにも所有者のUID(ユーザ番号)が付随している。 |
グループ | ファイルによっては決まったグループに所属している人にアクセスを許 すような事もしたいので、所属グループのGID(グループ番号)も付随している。 |
保護モード | 所有者・グループメンバ・その他それぞれについて、 どのようなアクセス(読み・書き・実行)を許可するかの情報が付随している |
大きさ | ファイルの大きさ(バイト数)も属性として保持されている。 |
リンク数 | ファイルがどこから参照されている(リンクされている)かを保持する。 |
各種の日付 | ファイルの内容を最後に更新した日時、ファイルの内容に最後にアクセス した日時などの情報も属性として付随している。 |
これらの情報を参照するには ls -l でわかります。
その結果は例えば次のようです。
オプション -a はドット(.)で始まるファイル すべて表示するオプションです。
cnet0007%s0724888[14]% ls -la total 335 drwxr-xr-x 2 s0724888 mmmgrp 512 Sep 29 21:05 ./ drwx---r-x 26 s0724888 mmmgrp 4096 Dec 13 11:11 ../ -rw-rw-r-- 1 s0724888 mmmgrp 258218 Sep 29 21:06 gomi.tar.gz -rwxr--r-- 1 s0724888 mmmgrp 67584 Jun 16 1998 hogehoge.doc |
この場合、3行目の gomi.tar.gz というファイルは、
そして、
また、[.]と[..]は最初が[d]であるため、ディレクトリです。
ちなみに、[.]はそのディレクトリそのもの、[..]は親ディレクトリを表します。