3. ファイル・システムについて

今回は Cygwin のファイル・システムについていくつかお話しします。 Windows 上のシステムですから,いわゆる smbfs ネイティブ・サポート は当然ですが,さらに /proc や /dev も備えていますから, 実用システムとして最も便利なものの一つになっています。

しかし,その前にまず, 一次情報としての英語ドキュメントの紹介をします。

3.1 英語ドキュメント

個々のコマンドではなく Cygwin 全体に関するドキュメントは cygwin-doc パッケージにまとめられています。 下図*1のように, cygwin-doc パッケージは setup.exe のパッケージ一覧では Doc Category の下にあります。



インストール後,パッケージ内容を下記のようにして照会できます。

$ cygcheck -l cygwin-doc

または下記のようにしても OK です。

$ zmore /etc/setup/cygwin-doc.lst.gz

ここに示されるファイルのうち,主要なものは Windows のスタートメニューにも (インストール時に setup.exe が自動実行する 後処理スクリプトによって) 登録されます。

スタート → プログラム → Cygwin

を御覧ください。とりわけ Cygwin User's Guide が重要です。*2
追記: もしもメニューに見当たらないときは, §14.6 の 「Cygwin-Doc メニュー」をお読みください。

3.2 ローカル・ファイル・システム

インストール時にデフォルトどおりの選択をした場合, Windows の C:\cygwin フォルダが Cygwin のルートディレクトリ / になっています。 Windows から見て C:\cygwin 以下に, Cygwin の Unix 的なローカル・ファイル・システムが いわば隔離収容されているわけです。 さらに,そうすると Windows の C:\cygwin\usr\bin と C:\cygwin\usr\lib が /usr/bin と /usr/lib にそれぞれあたるはずですが, 実際に Windows からそれらのフォルダをみると空になっています。 そのかわり C:\cygwin\bin と C:\cygwin\lib の内容が /usr/bin と /usr/lib にあります。

これは, Windows の C:\cygwin が / として, C:\cygwin\lib が /usr/lib として, C:\cygwin\bin が /usr/bin としてそれぞれ mount されているからです。 (前回述べたように) mount コマンドを使えばその状況を一覧できます。

$ mount
C:\cygwin\usr\X11R6\lib\X11\fonts on /usr/X11R6/lib/X11/fonts type system (binmode)
C:\cygwin\bin on /usr/bin type system (binmode)
C:\cygwin\lib on /usr/lib type system (binmode)
C:\cygwin on / type system (binmode)
c: on /cygdrive/c type user (binmode,noumount)
e: on /cygdrive/e type user (binmode,noumount)

普通の Unix では /etc/fstab 等のファイルに mount の設定を保存しますが, Cygwin に該当するファイルはありません。 Cygwin は Windows アプリケーションらしくレジストリに設定を記録します。

$ ls -l /proc/registry/HKEY_LOCAL_MACHINE/SOFTWARE/Cygnus\ Solutions/Cygwin/mounts\ v2/
total 0
drwxr-xr-x    9 suzuki   None            0 Nov  7 15:13 //
drwxr-xr-x   13 suzuki   None            0 Nov  7 16:13 /usr/X11R6/lib/X11/fonts/
drwxr-xr-x    3 suzuki   None            0 Nov  7 15:17 /usr/bin/
drwxr-xr-x   25 suzuki   None            0 Nov  7 15:17 /usr/lib/
-r--------    1 Administ None            4 Nov  7 15:17 cygdrive flags
-r--------    1 Administ None           10 Nov  7 15:17 cygdrive prefix

3.2.1 かごの外へ

上記 mount コマンドの出力でドライブ c: とドライブ e: が /cygdrive/c と /cygdrive/e になっていることに注意してください。一見すると Cygwin のファイル・システムは完全に C:\cygwin 以下に隔離されているようですが,

/cygdrive/ドライブレター

を使って,その外へと足をのばすことができます。 ただし,入力するパス名としては C: や E: という表記も有効です。

$ cd C:/Inetpub
$ pwd
/cygdrive/c/Inetpub

/ 以下を /cygdrive/c/cygwin/ としてアクセスすることも可能です。

$ ls /var
cache/  log/  run/  tmp/
$ ls /cygdrive/c/cygwin/var
cache/  log/  run/  tmp/

ただし,ルートディレクトリ / 直下に /cygdrive は出現しません。 これにより, ls -R のような再帰下降で Cygwin の領域外に不用意にアクセスすることや, / 以下への2重アクセスが防止されています。*3

3.3 ネイティブな smbfs

Cygwin では SMB プロトコルによる Windows の共有フォルダに

//サーバ名/共有フォルダ名/

という形式のパス名でアクセスできます。

$ ls //medve/Downloads/lua
5.0/       lua-l-archive.gz  lua5_manual_ja.html
5.0-beta/  lua-ll3.pdf       lua5_manual_ja_files/

もしも共有フォルダがパスワードで保護されている場合は, あらかじめサーバを開いておきます。 下図のように cygstart //サーバ名 を実行すれば, Cygwin のコマンド・ラインからサーバを開くことができます。



3.4 /proc フォルダ

3.2 節でレジストリを見るために /proc/registry/ を参照しました。 Linux と同様,Cygwin でもシステムのさまざまな情報を /proc/ 以下に ファイルやフォルダの形式で公開しています (もちろん /proc/registry/ は Linux にない Cygwin 特有の機能です)。 /cygdrive と同じく /proc もルートディレクトリ直下に出現しません。



とりわけ,プロセス ID を名前とするフォルダから各プロセスの情報が 得られますから,シェルスクリプトに便利です。 下記は,もしも実行中の X サーバがあればそれを終了させるスクリプトの例です。

for x in /proc/*
do if [ -r $x/exename ]
   then if [ `cat $x/exename` = '/usr/X11R6/bin/XWin' ]
        then kill `basename $x`
             sleep 3
        fi
   fi
done

3.5 /dev フォルダ

上記3.4の図の /proc/partitions に注目してください。 sda, sda1, sdb, sdb1 とあるのはディスクとそのパーティションの名前です。 これらは /proc/partitions の表示だけにとどまりません。 実際に /dev/sda, /dev/sda1, /dev/sdb, /dev/sdb1 のようにデバイス・ファイル としてアクセスできます。*4 /cygdrive と同じく /dev もルートディレクトリ直下に出現しません。 さらに, カレント・ディレクトリにすることもできません。*5



Unix や BeOS ではトリビアルな方法ですが, これを使えばハードディスクの完全バックアップは簡単です。 十分なディスク容量のあるマシンに 2nd ハードディスクとして バックアップ対象を接続して下記を行えば, パーティションの内容をまるごと保存・復元できます (お好みに応じて,cp コマンドや dd コマンドを 使ってください。筆者は去年この方法で3回ほど Windows XP マシンを救いました)。

$ cat /dev/sdb1 > saved.img
$ cat saved.img > /dev/sdb1

BeOS などの OS をインストールし直すとき, 以前インストールした内容がディスクに残っていると, パーティションを仕切り直してもインストーラに初期化済みと誤認され, あやまって初期化処理をスキップされてしまうことがあります。 あらかじめ次のようにしてパーティションの内容をまっさらにすると安心です。 もちろん,この方法は,秘密の情報が書き込まれたディスクの 簡便な消去手段としても有用です (厳密には,複数のパターンで上書きを重ねる のがよいそうです)。

$ dd if=/dev/zero of=/dev/sda2

その他のデバイス・ファイルについては 3.1 で紹介した Cygwin User's Guide を御覧ください。
追記: §14.4 フロッピーディスクへのバイナリイメージ書き込み も御覧ください。/dev/fd0 を使えば, 特別のユーティリティなしに各種 OS の起動ディスクなどを作成できます。

追記: Virtual PC 向けの Tips

Virtual PC の「容量可変のディスクイメージ」の空き領域を再構築して, イメージファイルから無駄な容量をなくしたい場合, まずディスクの未使用部分をゼロでクリアする必要があります。

Virtual PC 7 のヘルプ文書には「市販の消去用アプリケーションを使用」 してクリアするように書かれていますが, /dev/zero を使えば特別なアプリケーションは不要です。

まず,Virtual PC 上で,dd コマンドと /dev/zero を組み合わせて, ゼロ値のバイトからなる巨大ファイルを, ディスクイメージに空きがある限り作り続けます。 こうして空きをあらかた使い尽くしたところで, 次に,今しがた作った巨大ファイルをすべて rm します。

すると,ディスクの空き領域のほとんどに, 今しがたの巨大ファイルの残骸が残っている状態になります。 そしてその残骸とは,すなわち,ゼロ値の連続です。 つまり,ディスクの未使用部分がほとんどゼロでクリアされたわけです。

次回予告

次回は環境設定についてお話しします。 Mac OS X や BeOS ばりの ~/Desktop フォルダを設けると, GUI と CUI を有機的に連係できるようになります。


脚注

*1 この図での動作環境は日本語版 Windows 2000 SP4 です。

*2 市販の Cygwin 本の多くは, インストール手順 + 主要コマンド解説 + Cygwin User's Guide 抄訳 + 日本語化等の特記事項 からなっていると言っても過言ではないかもしれません。

*3 便宜のため ln -s /cygdrive/e . のようにシンボリック・リンクを張ることはできます。 ls -R のような再帰下降では シンボリック・リンクの先をたどりませんから,こうしても安全です。

*4 Linux では SCSI ハードディスクを /dev/sda, IDE ハードディスクを /dev/hda と区別していますが, Cygwin では区別がありません。 アクセスには管理者権限が必要です。

*5 少なくともこのおかげで カジュアル・ユーザが不用意にシステムを破壊する危険が少なくなっています。 とりわけ Windows XP Home Edition では 既定ユーザが管理者権限を持っているのが通常ですから, うっかりミスを防ぐ意味でありがたい仕様です。

目次へ戻る


Copyright (c) 2004, 2005 Oki Software Co., Ltd.