UNIXのディレクトリの意味
先日、ある講習会に出ていたら「最近のエンジニアは意味も分からず英語を使っている」という話が出て来た。私自身も含めて全く同感!と思って聞いていたのだが、例えば米国人が好むTLA(3文字略語)*1も、新人エンジニアとかと話をしていると元の単語を知らずに使っていることが多い。別にトリビア的な知識として知っていても仕方ないのだが、物事の本質を理解しようとしたら正式名称を知る必要があると思う。
TLAは元の単語を知って使っている人も多いがカタカナ英語は結構意味も分からずに使っているケースが多いようだ。例えば、UNIXやLinuxで使う“ディレクトリ”。なぜディレクトリをディレクトリと言うのか? 実は私も恥ずかしながら先週まで考えたことが無かった。ディレクトリはディレクトリであり、ファイルやサブディレクトリを格納する“入れ物”という認識で使っていた。ところが、英語のdirectoryにはいわゆるフォルダとかいう意味はない。マイクロソフトでもMS-DOSまではディレクトリという言葉を使っていたがWindowsになってからはフォルダと呼ぶようになっているし、アップルでももともとフォルダという言葉を使っている。コンピュータの操作という観点から考えると“フォルダ”という言葉の方が適切だと思われる。逆にディレクトリと言う言葉はWindowsのActive 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