revise: 2005/06/19
DOS, UNIX/Linux では、ディレクトリという概念を持つ階層型ファイル・システムの中に、具体的なデータを含んだファイルを保存します。階層構造の最上位のディレクトリ(ルート(根)と呼ぶ)の中に、複数のファイルとディレクトリが存在し、それらのディレクトリの中にはまた、ファイルやディレクトリが存在します。このように、ディレクトリの中に別のディレクトリが存在し、各々のディレクトリの中には、ディレクトリの他に、有意味なデータを持つファイルが存在するわけです。ここで、ファイルは、当該ディレクトリの配下と考え、ディレクトリの連なりは、外から見れば(概念的に俯瞰すれば)、階層構造になっているのです。この階層構造のなかでは、ディレクトリはノード(節)と呼ばれます。
階層型ファイルシステムでは、本来的にはコマンド・ライン(テキスト・ベース)のインタフェースによってシステムを操作します。命令を文字列で入力することで、コンピュータを操作するのです。テキストベースでは、階層構造(木構造)をWindows のエクスプローラのように樹形図によって表現することができないので、ユーザ自身がディレクトの階層構造を頭の中で把握しておくことが必要となります。そして、そのような階層構造の中では、具体的な情報を持った通常のファイルを操作するためには、そのファイルが含まれているディレクトリを指定する必要があります。逆に言うと、ディレクトリを指定して初めて、その配下のデータを操作することができるわけです。
ディレクトリを指定するという操作は、概念的には、階層構造の特定の節(ノード)をたどっていくことになります。ルートから、配下のこのディレクトリの、そのまた配下のこのディレクトリの、そのまた配下のこのディレクトリの、という具合に、階層構造の節をたどっていくのです。具体的な操作としては、最初に特定のディレクトリ配下がリストされた状態にあり、その中から特定のディレクトリを選んでその配下のファイルやディレクトリをリストして、その中から必要なファイルを操作するか、または、さらに求めるディレクトリを選ぶことで内容をリストするという繰り返しによって、求めるファイルが存在するディレクトリを捜し求めることになります。
この仕組みだけでは、配下にない上の階層のディレクトリへ移動することができない片道切符になってしまいますので、全てのディレクトリの配下には、一つ上の階層のディレクトリを指定するための特殊なファイルが用意されており、これを選ぶことで、一つ上の階層のディレクトリ配下の内容をリストして操作できる状態になります。これは一般に、ダブル・ピリオド
.. で表現します。全てのディレクトリ配下には ..
という名前のファイルが用意されており、これを選ぶことで一つ上のディレクトリ配下をリストできるわけです。ピリオド .
も、全てのディレクトリに存在する特殊なファイルで、当該ディレクトリを表します。つまり、その配下のファイルやディレクトリを操作可能なディレクトリを意味するのです。自分が今いるディレクトリ、すなわちその配下を操作可能なディレクトリのことをカレント・ディレクトリと呼びます。
そもそも、ディレクトリとは、階層構造上のパス情報と、そのメンバーである配下のファイルやディレクトリの情報を含んでいる特殊なファイルなのであり、このような特殊なファイルの中でも特殊な意味を持つのが、カレント・ディレクトリを表す
. と、一つ上の階層のディレクトリを表す .. です。これは、DOS と
UNIX/Linux とで共通の使い方です。憶えておくと便利です。
ここまで話すと、「階層型以外のファイルシステムが存在するのか?」という疑問を持つ方がいるでしょう。階層構造を持たないフラットなファイル・システムが存在します。IBM によって開発され、レガシーと呼ばれつつも現時点ではエンタープライズ用コンピュータとして最高の評価を受けている、所謂メイン・フレームがそうです。メインフレームでは、データを含むファイルの形式が複数あり、ディレクトリはその中の一つになります。
メインフレームでは、ファイルはデータセットと呼ばれ、その名前 (DSN, DataSet Name) はピリオド区切りの識別子 (qualifier) で指定します。システム中でディスクは、ボルシル (VOL=SER, Volume Serial) と呼ばれる識別名を持ち、 DSN と VOL=SER を指定することで、特定の DSN を識別することができます。
因みに、AMS というプログラムで操作するカタログ (CAS) という仕組みに、データセットの DSN と、それが存在するディスクの VOL=SER の対応を記憶しておくことができて、カタログに記憶されたデータセットは、 VOL=SER を指定しなくとも、 DSN だけで指定することができるようになります。このような形で、メインフレームの記憶方式では、階層型のファイルシステムを持たない、フラットなファイルシステムを実現しているのです。
次の例は、JCL というメインフレームを操作するためのジョブ記述言語の例です。DD カードの DSN= の部分がデータセット名で、VOL=SER がボルシル名で、6 文字固定です。一つの VOL=SER の容量は 3390 型ディスクの場合で約 2 GB です。元々は一つのディスクに対応していましたが、最近では大容量の ESS (Enterprise Storage Server) が普及し、ESCON, FICON にアタッチしたディスクアレイに仮想的な 3390 をエミュレートした VOL=SER を切っています。
次の例は、IDCAMS というプログラムを使って、非 VSAM データセット SYS1.DATASET.NAME が VOLUME 上にあることを、カタログ SYS1.SYSTEM.MCAT にカタログしています。
//* AMS SAMPLE JCL
//STEP01 EXEC PGM=IDCAMS,REGION=1024K
//SYSPRINT DD SYSOUT=*
//SYSIN DD *
DEF NONVSAM(NAME( SYS1.DATASET.NAME ) +
DEVT( 3390 ) VOL( VOLUME ) ) +
CAT(SYS1.SYSTEM.MCAT)
/*
//
次の JCL は、IEBGENER というプログラムを使って、VOLUME 上にある非 VSAM データセット DATASET.NAME.FROM から DATASET.NAME.TO へコピーしています。
//* GENER SAMPLE JCL //STEP01 EXEC PGM=IEBGENER //* COPY SOURCE //SYSUT1 DD DSN=DATASET.NAME.FROM,DISP=SHR, // UNIT=3390,VOL=SER=VOLSER //* COPY TARGET //SYSUT2 DD DSN=DATASET.NAME.TO,DISP=(NEW,KEEP), // UNIT=3390,VOL=SER=VOLSER //SYSPRINT DD SYSOUT=* //SYSIN DD DUMMY //
次の JCL は、ADRDSSU というプログラムを使って、VOLUM1 上にあるデータセット DATASET.NAME.FROM1, DATASET.NAME.FROM2 から VOLUM2 上にあるデータセット DATASET.NAME.TO1, DATASET.NAME.TO2 へコピーしています。
//DSS SAMPLE JCL
//STEP01 EXEC PGM=ADRDSSU
//SYSPRINT DD SYSOUT=*
//INDD DD DISP=SHR,UNIT=3390,VOL=SER=VOLUM1
//OUTDD DD DISP=SHR,UNIT=3390,VOL=SER=VOLUM2
//SYSIN DD *
COPY INDD(INDD) OUTDD(OUTDD) FULL ALLDATA(*) ALLEXCP SHR -
DATASET ( INCLUDE ( -
DATASET.NAME.FROM1 -
DATASET.NAME.FROM2 -
)) -
RENAMEU ( -
( DATASET.NAME.FROM1 , DATASET.NAME.TO1 ) -
( DATASET.NAME.FROM2 , DATASET.NAME.TO2 ) -
) RECAT(SYS1.SYSTEM.MCAT)
Java では、システムの記憶方式に階層型のファイルシステムを前提としています。したがって、メインフレーム上では、 Java は使えません。しかし、メインフレームでも、 UNIX をエミュレートしており、 その中では、 Java も使えるようになっています。メインフレーム上で巨大な特殊ファイルを用意して、その中で階層型のファイルシステムを表現するわけです。このような仕組みを、 UNIX System Service (USS) と呼び、 USS を実現する特殊なシーケンシャル・データセットのことを HFS (Hielarchical File System) と呼んでいます。
Copyright 2003, 2005 SUGAI, Manabu. All rights reserved.