UNIXのディレクトリの意味

先日、ある講習会に出ていたら「最近のエンジニアは意味も分からず英語を使っている」という話が出て来た。私自身も含めて全く同感!と思って聞いていたのだが、例えば米国人が好むTLA(3文字略語)*1も、新人エンジニアとかと話をしていると元の単語を知らずに使っていることが多い。別にトリビア的な知識として知っていても仕方ないのだが、物事の本質を理解しようとしたら正式名称を知る必要があると思う。

TLAは元の単語を知って使っている人も多いがカタカナ英語は結構意味も分からずに使っているケースが多いようだ。例えば、UNIXLinuxで使う“ディレクトリ”。なぜディレクトリをディレクトリと言うのか? 実は私も恥ずかしながら先週まで考えたことが無かった。ディレクトリはディレクトリであり、ファイルやサブディレクトリを格納する“入れ物”という認識で使っていた。ところが、英語のdirectoryにはいわゆるフォルダとかいう意味はない。マイクロソフトでもMS-DOSまではディレクトリという言葉を使っていたがWindowsになってからはフォルダと呼ぶようになっているし、アップルでももともとフォルダという言葉を使っている。コンピュータの操作という観点から考えると“フォルダ”という言葉の方が適切だと思われる。逆にディレクトリと言う言葉はWindowsActive Directoryのようにアカウントデータベース(つまり“人名簿”)等に使う方が分かり易い。

確かにUNIXのネーミングは独特のものが多いが、それでもdirectoryという単語を使ったのには訳がある筈。ネットでちょっと調べた範囲ではこういった事に明確な答えを与えてくれるページは見当たらなかった。(別に根気よく探したわけではないので、何処かに書いてあるかも知れないが。)directoryと言う単語にはフォルダのような意味はない。directoryは「住所氏名録、人名簿、要覧」という意味でしかない。英語の辞書でも“a book listing individuals or organizations with details such as addresses and telephone numbers. ”となっている。では、なぜこの単語が“フォルダ”の意味で使われたのか?

調べてみるとdirectoryはケン・トンプソンやデニス・リッチーが作り出した言葉ではなく、既にMulticsで使われていたようだ(http://www.multicians.org/mgd.html#directory)。Multicsは階層型記憶システムを実装した初めてのシステムと書いてある(http://www.multicians.org/mgf.html#filesystem)。既にMulticsでツリー構造とかrootディレクトリという概念(と言葉)は使われていたようである。Multicsプロジェクトに参加していたケン・トンプソンがそれらの概念をそのまま流用した考えるのが妥当だろう。R. C. DaleyとP. G. Neumannが1965年に書いた論文、「A General-Purpose File System For Secondary Storage」にdirectoryの定義がある。

A directory is a special file which is maintained by the file system, and which contains a list of entries. To a user, an entry appears to be a file and is accessed in terms of its symbolic entry name, which is the user's file name. An entry name need be unique only within the directory in which it occurs. In reality, each entry is a pointer of one of two kinds. The entry may point directly to a file (which may itself be a directory) which is stored in secondary storage, or else it may point to another entry in the same or another directory.

つまりディレクトリとは、2次記憶装置上にファイル(ディレクトリもファイルの1種である)の場所をリストにした“住所録”という概念だったようだ。ディスク上のファイルの位置をリストにした目録という意味であればディレクトリという言葉採用されたとしても納得できる。何処かのウェブページに「ディレクトリとはデパートのフロアガイド(商品の場所などが書いある看板。英語ではディレクトリ)のことだ」と書いてあったが、まぁ、当たらずとも遠からずというところだろう。(意味的には合っているのだが、このページには“場所”という概念が何を表しているのか分からないので、逆にフロアガイド=directoryと言われても分かりにくかった。)

ディレクトリとは実装上の構造から来ている名前であり、“フォルダ”のような操作上のメタフォリックな名前ではないので、一般の人には意味が分からず、単に”ディレクトリ”というカタカナ英語として定着してしまったようだ。

Directoryファイルをのぞいて見る(お遊び)

ディレクトリ”もファイルの1つなので、その中身を見れば上の“ファイル目録”が見れる。ただ、一般のコマンドだとディレクトリを通常のファイルとして見ることができない。以下のようになってしまう。

root@UbuntuTest:~# cat /
cat: /: Is a directory
root@UbuntuTest:~# 

そこでHDD上のディレクトリ・ファイルを直接眺めると次のようになる。(ルートディレクトリのディレクトリファイルの場所は、ファイルシステムの大きさ等によって異なるので、この例の通りコマンドを実行しても表示できない。hexdump -Cの結果をmoreで受けて“lost+found”という文字列を探せば見つけられるだろう。)

root@UbuntuTest:~# hexdump -C -s 3055616 -n 512 /dev/sda1
002ea000  02 00 00 00 0c 00 01 02  2e 00 00 00 02 00 00 00  |................|
002ea010  0c 00 02 02 2e 2e 00 00  0b 00 00 00 14 00 0a 02  |................|
002ea020  6c 6f 73 74 2b 66 6f 75  6e 64 00 00 01 c0 04 00  |lost+found......|
002ea030  0c 00 03 02 76 61 72 00  01 40 03 00 0c 00 03 02  |....var..@......|
002ea040  65 74 63 00 01 60 00 00  10 00 05 02 6d 65 64 69  |etc..`......medi|
002ea050  61 00 00 00 04 60 00 00  10 00 05 07 63 64 72 6f  |a....`......cdro|
002ea060  6d 00 00 00 01 60 05 00  0c 00 03 02 62 69 6e 00  |m....`......bin.|
002ea070  01 80 05 00 0c 00 04 02  62 6f 6f 74 01 20 05 00  |........boot. ..|
002ea080  0c 00 03 02 64 65 76 00  01 20 04 00 0c 00 04 02  |....dev.. ......|
002ea090  68 6f 6d 65 01 20 07 00  10 00 06 02 69 6e 69 74  |home. ......init|
002ea0a0  72 64 00 00 01 e0 00 00  0c 00 03 02 6c 69 62 00  |rd..........lib.|
002ea0b0  07 60 00 00 10 00 05 07  6c 69 62 36 34 00 00 00  |.`......lib64...|
002ea0c0  01 a0 03 00 0c 00 03 02  6d 6e 74 00 01 e0 04 00  |........mnt.....|
002ea0d0  0c 00 03 02 6f 70 74 00  01 e0 01 00 0c 00 04 02  |....opt.........|
002ea0e0  70 72 6f 63 01 c0 05 00  0c 00 04 02 72 6f 6f 74  |proc........root|
002ea0f0  01 e0 06 00 0c 00 04 02  73 62 69 6e 01 40 07 00  |........sbin.@..|
002ea100  0c 00 03 02 73 72 76 00  01 00 04 00 0c 00 03 02  |....srv.........|
002ea110  73 79 73 00 01 00 02 00  0c 00 03 02 74 6d 70 00  |sys.........tmp.|
002ea120  01 20 01 00 0c 00 03 02  75 73 72 00 15 60 00 00  |. ......usr..`..|
002ea130  14 00 0a 07 69 6e 69 74  72 64 2e 69 6d 67 00 00  |....initrd.img..|
002ea140  16 60 00 00 28 00 07 07  76 6d 6c 69 6e 75 7a 00  |.`..(...vmlinuz.|
002ea150  09 60 00 00 18 00 0d 07  76 6d 6c 69 6e 75 7a 2e  |.`......vmlinuz.|
002ea160  31 33 35 39 35 35 39 35  08 60 00 00 18 00 0e 07  |13595595.`......|
002ea170  69 6e 69 74 72 64 2e 69  6d 67 2e 6f 6c 64 00 00  |initrd.img.old..|
002ea180  09 60 00 00 80 0e 0b 07  76 6d 6c 69 6e 75 7a 2e  |.`......vmlinuz.|
002ea190  6f 6c 64 00 00 00 00 00  00 00 00 00 00 00 00 00  |old.............|
002ea1a0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
 *
002ea200
root@UbuntuTest:~# 

これはUbuntuのルートディレクトリの“ディレクトリ・ファイル”をダンプしたところ。このファイルからルートディレクトリにはlost+found、var、etc、media等のファイル(勿論ディレクトリファイルを含む)がリストされていることが分かる。lost+foundのHDD上の位置はiノード番号として保持されていて 0x0000000b = 11 であることが分かる。同様に var のiノード番号は 0x0004c001 = 311297 と分かる。実際 ls コマンドで見ると次のようになる。

root@UbuntuTest:~# ls -i /
352257 bin      24597 initrd.img      319489 opt    73729 usr
360449 boot     24584 initrd.img.old       1 proc  311297 var
 24580 cdrom    57345 lib             376833 root   24598 vmlinuz
   568 dev      24583 lib64           450561 sbin   24585 vmlinuz.old
212993 etc         11 lost+found      475137 srv
     2 home     24577 media                1 sys
466945 initrd  237569 mnt             131073 tmp
root@UbuntuTest:~# 

基本的にディレクトリファイルにはファイルの場所(iノード番号)、ファイル名、ファイル名の長さ、ファイルのタイプ(通常ファイル、ディレクトリ、ブロックデバイスシンボリックリンク等の区別)、そしてこれらの情報の合計サイズの5種類の情報しかない(ext3ファイルシステムで)。それぞれのファイルの詳細はそれぞれのファイルのiノードやファイル本体を参照することになる。まさにディレクトリは“ファイル目録”と言える。

*1:Three Letter Acronym