ファイルシステム

ファイルとファイルシステム

計算機ではさまざまな情報(デジタル計算機なのでビットの列)を扱います。 利用者がこの情報を扱うときには、 アドレス空間などの数字の羅列で情報の記憶された場所を表すよりも、 この情報の「ひとかたまり」にそれぞれ 人間(すなわち利用者)にとって理解しやすい名前をつけて保管しておき、 その名前を用いて管理、利用するのが便利です。

この「ひとかたまりの情報に名前をつけたもの」をファイルといいます。 そしてこの「ファイル」は、 様々な記憶装置(通常は磁気デバイス(FD,HD等)やテープデバイスなどの2次記憶装置)に保管されます。

例えばハードディスクドライブでファイルを利用しようとすると、 ただ接続すればいいというわけではありません。 ディスクそのものにできる事は単に 「あるトラックのあるセクタにビット列を格納したり、そこから読み出すこと」 だけだからです。 これだけでは「ファイル」として扱う事ができないので、 OSでディスクの上に複数の「ファイル」をつくり管理するようなしくみが必要です。 OSのなかでこの部分をファイルシステムと言います。

unixのファイルシステムの大きな特徴は

などです。

このうち、階層型ファイル構造については次節で詳しく述べます。 このようなファイル構造の構築にあたって、 unixでは次のような3種類のファイルを区別して運用しています

ファイル種別説明
通常ファイル
Ordinary file
もっともファイルらしい性質を持つ。 文字列のバイト・ストリームで構成されるテキスト、プログラム、 それに数値データ群などがその内容である。
特殊ファイル
Special file
unixでは各種の周辺装置が論理的にはファイルとして扱われる。 つまり、各周辺装置は仮想化されたファイルとみなされる。 このようなデバイスをあつかうファイルのことを特殊ファイルという。
ディレクトリファイル
Directory file
通常ファイル、特殊ファイルは、その内容によって分類し、 ひとまとめの見出しをつけるのが便利である。 unixファイルシステムではこの見出しの役割をもつのがディレクトリファイルである。 このディレクトリファイルが「階層型ファイルシステム」において重要な役割を占めている。 ディレクトリの中にディレクトリを作成することも可能である。 それがサブディレクトリである。

階層形ファイル構造

fig1 Tree構造

図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]であるため、ディレクトリです。
ちなみに、[.]はそのディレクトリそのもの、[..]は親ディレクトリを表します。