今回は Cygwin のファイル・システムについていくつかお話しします。 Windows 上のシステムですから,いわゆる smbfs ネイティブ・サポート は当然ですが,さらに /proc や /dev も備えていますから, 実用システムとして最も便利なものの一つになっています。
しかし,その前にまず, 一次情報としての英語ドキュメントの紹介をします。
個々のコマンドではなく 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 メニュー」をお読みください。
インストール時にデフォルトどおりの選択をした場合, 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
上記 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
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.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.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 の「容量可変のディスクイメージ」の空き領域を再構築して, イメージファイルから無駄な容量をなくしたい場合, まずディスクの未使用部分をゼロでクリアする必要があります。
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 では 既定ユーザが管理者権限を持っているのが通常ですから, うっかりミスを防ぐ意味でありがたい仕様です。