『Cygwin + Cygwin JE』に関する補足情報
『Cygwin + Cygwin JE』本文に対する各種の補足情報です。本文と合わせてご参照下さい。
「第 1 章: Cygwin の概要」
Cygwin DLL のファイル名
本文中では一切触れていませんが、「Cygwin DLL」のファイル名は「cygwin1.dll」です。
Cygwin をインストールしたディレクトリ(デフォルトでは「C:\Cygwin」)以下の「bin」ディレクトリに格納されています。
Cygwin が利用可能な Windows のバージョンについて
1.3 で「Cygwin は Windows の種類やバージョンを問わずに利用可能」と書いていますが、厳密には「32 ビット Windows(Windows NT 3.1 / Windows 95 以上)」上でのみ動作します。Win16 / Win32s 環境上では動作しません。もっとも、16 ビット Windows を未だに使い続けている人は殆どいないでしょうが。
Cygwin と POSIX の実装レベル
1.4 で「Cygwin は POSIX 1/1990 の大半を実装している」と書いていますが、実は実装はされてはいるものの、他の UNIX 系 OS と動作が多少異なるものもあります。
また、「POSIX に規定された API が完全に実装されている」が真でも、「他の UNIX 系 OS 用のアプリケーションは全てコンパイル可能」は真ではありません。例えば、Linux にしか存在しないシステムコールを利用しているアプリケーションは、Cygwin 上ではいくら頑張ってもそのままではコンパイルは不可能です。
shutdown コマンドの使い方
1.5.7 で「SSH 経由で他のマシンシャットダウンや再起動を行う程度の作業なら、インストールしたその日から可能」と書きましたが、実際にシャットダウンや再起動を行う方法を書いていませんでした。Cygwin には shutdown コマンドが含まれていますので、これを利用します。
shutdown コマンドには、以下のようなオプションがあります。
- -s
- システムの停止
- -r
- システムの再起動
- -h
- 休止状態への移行
- -p
- サスペンド
UNIX 系 OS の shutdown コマンドと同様、追加引数としてシャットダウン(及び、それに類する操作)を行うまでの時間を指定します。例えば、即座にスタンバイに移行する場合であれば
$ shutdown -p now
となりますし、0 時 30 分に再起動を行う場合であれば
$ shutdown -r 00:30
となります。UNIX 系 OS とは異なり、システムのシャットダウンには root 権限は不要(特権 SeShutdownPrivilege を持ったユーザ; つまり「Users」グループ以上の権限を持つグループに所属しているユーザであれば可能)という点に注意して下さい。
「第 3 章: Cygwin の CUI 環境」
bash の起動とホームディレクトリの作成
初めて bash を起動する際に自動的にホームディレクトリとして「/home/ユーザ名」が作成されるのは、bash の初期化ファイルの一つである「/etc/profile」内に次のようなコードが記述されているからです。
# If the home directory doesn't exist, create it.
if [ ! -d "$HOME" ]; then
mkdir -p "$HOME"
# copy skeleton files
cd /etc/skel
for f in `/bin/find . -type f`; do
fDest=`echo $f | sed -e 's/^\.//g'`
if [ ! -e "$HOME$fDest" -a ! -L "$HOME$fDest" ]; then
cp "$f" "$HOME/$fDest"
fi
done
fi
見ての通り、環境変数「HOME」に設定されたディレクトリが存在しない場合はホームディレクトリ(/home/ユーザ名)を作成し、/etc/skel 以下に格納されている設定ファイルの雛型(現在は .bash_profile しかありませんが)をコピーしています。
このため、起動したユーザが /home に書き込むことが出来なければ、次のようなエラーを受け取ったり、カレントディレクトリが「/home/ユーザ名」とならなかったりすることがあります。
Could not chdir to home directory /home/hoge: No such file or directory mkdir: cannot create directory `/home/hoge: Permission denied cp: cannot create regular file `/home/hoge//.bash_profile': No such file or directory bash: cd: /home/hoge: No such file or directory
このような事態に対処するためには、以下の二つのどちらかを事前に行っておく必要があります。
/homeのパーミッションを、全ユーザが書き込み可能としておく。- Administrator など
/homeの書き込み権限を持ったユーザが、事前に各ユーザ用の「/home/ユーザ名」を用意しておく。
後者の選択肢を選択した場合、各ユーザのホームディレクトリに .bash_profile がコピーされません。ユーザは手動で .bash_profile を /etc/skel からコピーしてくる必要があります。
バイナリモードの説明
3.3 の「バイナリモード」の最後に記述した内容(ファイル入出力の違い)ですが、多少分かりにくい説明になってしまいました。というのも、マウントの「テキストモード / バイナリモード」と、ファイル入出力指定の「テキストモード / バイナリモード」が混在してしまったからです。分かりやすく記述すると、次のようになります。
- テキストモードでマウントされた場所での動作
- 単純にファイルの入出力を行った場合、入力時は「CR+LF」→「LF」、出力時は「LF」→「CR+LF」という変換を行う。「CR+LF」と「LF」の間の変換を行わないようにするには、バイナリ入出力を指定する必要がある。
- バイナリモードでマウントされた場所での動作
- 「CR+LF」と「LF」の変換は一切行わない。
ユーザ / システムでの二重マウント
通常、定義済みのマウントを再定義することは出来ません。しかしユーザモードでのマウントは、システムモードでのマウントで上書きすることが出来ます。このとき、ユーザモードでマウントしたユーザには同じマウントがユーザ / システムの双方で確認出来ますが、そのユーザ以外のユーザには、システムモードのマウントだけが確認出来ます。
以下の例は、ユーザモード及びシステムモードの両方で「f:\Packages」を「/pack」にマウントした状態です。/pack が user、system の両方でマウントされていることが分かります。
$ mount D:\Cygwin\bin on /usr/bin type system (binmode) D:\Cygwin\lib on /usr/lib type system (binmode) f:\Packages on /pack type user (binmode) D:\Cygwin on / type system (binmode) f:\Cygwin on /pack type system (binmode) f:\home on /home type system (binmode) c: on /c type system (binmode,noumount) d: on /d type system (binmode,noumount) f: on /f type system (binmode,noumount)
「第 4 章: 日本語環境の構築」
lv のバージョンについて
附属 CD-ROM に収録した lv(バージョン 4.49.4)にはセキュリティ上の問題が指摘されていますので、この問題を修正した 4.49.5 を利用することをお薦めします(最新版が 「Cygwin JE 暫定版」に含まれています。)。
「set kanji-code sjis」について
本文中でも明記していますが、「kanji-code」という readline 変数は日本語化パッチを適用した bash にのみ存在します。素の bash を利用しているにも関わらずこの変数を設定している人が多いようですが、素の bash では何の意味もありません。
日本語化された bash では、「kanji-code」の設定によって取り扱う文字コードを選択することが出来ます。
- sjis: シフト JIS
- no: 素の bash と同じ
- 設定しない、又は上記以外の値: 日本語 EUC
.inputrc の設定内容の確認方法について
.inputrc の設定でトラブルが発生した場合、bash の内部コマンドである「bind」を利用して問題解決の糸口を掴むことが出来ます。例えば、現在設定されている readline の変数設定を確認するなら、「bind -v」が利用出来るでしょう(オプション「-v」は、変数の設定を確認するためのオプションです)。
$ bind -v | grep meta set convert-meta off set input-meta on set meta-flag on set output-meta on
「bind -v | grep meta」の結果が上記のようであれば、bash で 8 ビット文字を扱うことが出来るはずです。なお、ここで登場した「meta-flag」というのは、「input-meta」の別名です。
「第 5 章: デーモンを利用する」
inetutils の手動設定
inetutils パッケージには、設定を対話的に行うためのシェルスクリプト「iu-config」が含まれています(inetutils はインストール後にこのスクリプトを自動的に実行します)。手動で inetutils の設定を行う必要がある場合は、このスクリプトを実行して下さい。
「第 6 章: Cygwin の GUI 環境 − XFree86 の利用」
X サーバ / X クライアントについて
6.1.2 の説明では多少分かりにくいのですが、図 6-2 に記述されている「X サーバ」「X クライアント」は、それぞれ個別のマシン上で動作しているプログラムであり、マシンそのものの役割が「サーバ」「クライアント」だというわけではありません。
「X サーバ」は画面描画などの各種入出力を、「X クライアント」は実際のアプリケーションの処理を行います。通常のクライアント・サーバ・モデルとは異なり、(一般的には)性能の高いマシンで動作するのが X クライアント、性能の低いマシンで動作するのが X サーバという点に注意して下さい。
X の起動と /tmp のパーミッション
X サーバは /tmp に一時データを作成しますので、X を起動するユーザは /tmp に書き込みが可能でなければなりません。Administrator 権限を保持していないユーザで X を起動する場合などは注意して下さい。
X サーバの起動オプション
本文中や、巻末の「トラブルシューティング」にも少しだけ記述されていますが、Cygwin の X サーバである XWin.exe の主なオプションをここでまとめておきましょう。
| オプション | 説明 |
|---|---|
-h |
ヘルプメッセージを /tmp/XWin.log に出力する。 |
-screen スクリーン番号 高さ 幅 |
起動時のウィンドウサイズを指定する。 |
-emulate3buttons [秒数] |
3 ボタンマウスのエミュレート。「秒数」には、左右のボタンを押す間隔(= この間隔以内で両方のボタンを押せば、両方のボタンを同時に押したと見なされる)を設定する。 |
-lesspointer |
XFree86 のウィンドウに入った時点で、Windows のマウスポインタを隠す。 |
-rootless |
ルートウィンドウを隠す。 |
-multiwindow |
各 X アプリケーションが独立した Windows のウィンドウとして動作する。 |
-fullscreen |
DirectX を利用したフルスクリーンモードで動作する。 |
-depth 色数 |
表示色を指定する。-fullscreen 指定時のみ有効。 |
X サーバの表示色数
6.2.2 の「本来は『-screen 0 横のサイズx縦のサイズx色数』で色数の指定も可能なはずですが、実際には反映されないようです」にある通り、現在の Cygwin の X サーバでは色数の変更は出来ません。Cygwinの X サーバは、常に Windows で利用中の色数を利用します。
XWin.exe にオプション「-fullscreen」を指定した場合に限り、オプション「-depth 色数」を指定することによって使用する色数を指定することが出来ます。色数として指定出来る値は、「8」(256色)、「16」(約64,000色)、「32」(約1,600万色)などです。
「窓使いの憂鬱」と X サーバ
6.2.2 の注 8 にもある通り、Windows 用のキーボード設定ユーティリティでキー配列を変更していても、X 上ではその変更が無視されたり、悪影響を及ぼしたりすることがあります。
例えば、「窓使いの憂鬱」によって日本語 106 キーボードを 101 キーボード配列として利用している場合などがこのケースに該当します。このような場合、「setxkbmap」で日本語 106 キーボードを利用することを指定しなければ、キーボードをまともに利用することは出来ません。「setxkbmap」で日本語 106 キーボードを利用することを指定すれば、「窓使いの憂鬱」でのカスタマイズ内容はそのまま X 上でも有効になります。
.xserverrc について
6.2.2 の注 9 で簡単に触れられていますが、XWin.exe に与えるオプションを設定するには、設定ファイル .xserverrc を利用すると便利です。.xserverrc の設定内容は、startx の内部で読み込まれます。
.xserverrc の記述例を次に示します。
exec /usr/X11R6/bin/XWin.exe -screen 0 800x600 -emulate3buttons
.xserverrc の役割は「startx が利用する X サーバ(とそのオプション)の指定」ですので、オプションだけではなく「XWin.exe」そのものも記述する必要があります。この例では XWin.exe をフルパスで指定していますが、/usr/X11R6/bin が PATH に含まれていれば、無理にフルパスで指定する必要はありません。
もちろん、startx スクリプトや startxwin.bat を直接書き換えることによってオプションの指定をしても構わないのですが、お世辞にもスマートとは言えないやり方だと思います。
環境変数 XMODIFIERS の設定について
6.3.1 では .bashrc 内で環境変数 XMODIFIERS を設定していますが、私個人としては .xinitrc 内部で設定したほうがスマートだと思います。環境変数 XMODIFIERS は、X を利用する場合にしか意味がないからです。
「第 7 章: Cygwin の環境変数」
環境変数 HOMEDRIVE 及び HOMEPATH
HOMEDRIVE には「ホームディレクトリが置かれるドライブ」、HOMEPATH には「HOMEDRIVE 以下でのホームディレクトリへのパス」を設定します。図 7-1 では「接続ドライブ」として「C:」を、「パス」として「\Cygwin\home\Administrator」を設定していますが、この場合は前者が HOMEDRIVE、後者が HOMEPATH となります。
glob オプションの存在意義
「カレントディレクトリ以下に存在する拡張子 .c を持つファイルを全て表示する」という場合、我々は何も考えずに、次のようなコマンドを実行することでしょう。
$ ls *.c
このとき、「*.c」を「拡張子 .c を持つ全てのファイルに展開する」という作業は、シェルが行います。つまり、ファイル名を指定する際のワイルドカード文字の展開は、シェルがその責任を負っているということです。
Windows のシェル(command.com や cmd.exe)はこのような展開を行ってくれません。環境変数 CYGWIN の glob オプションは、ファイル名の展開を Cygwin DLL の責務として行わせるためのオプションです。このため、bash などの「UNIX のシェル」では意味がなく、command.com のような「Windows のシェル」上でのみ意味を持つわけです。
「第 8 章: Cygwin のセキュリティ」
/etc/passwd 内でのホームディレクトリの変更と「Cygwin」アイコン
8.2 で「/etc/passwd 内でのホームディレクトリの変更は、『Cygwin』アイコンには影響を及ぼさない」と記述しましたが(p.222)、これは環境変数 HOME を Windows 側で設定している場合の話です。
bash は環境変数 HOME が設定されていない場合、/etc/passwd に設定されたホームディレクトリを HOME として利用しますので、Windows 側で HOME を設定していない場合は /etc/passwd 内でのホームディレクトリの変更が意味を持つことになります。
ACL からのパーミッションの逆算
ntsec では各ファイル / ディレクトリに対して、「所有者」「グループ」「Everyone」の 3 つの ACE が付与されていることが期待されています。しかし、仮にこれら 3 つの ACE が不完全な形式でしか備わっていない場合、Cygwin は ACL からパーミッションを逆算して利用します。
例えば、あるファイルに「Everyone: 読み込み」という ACE しか付与されていなかった場合、パーミッションは「444」となります。Everyone が読み込み可能であれば、所有者及びグループも当然ながら読み込み可能(= Everyone は全てのユーザが含まれるというグループなので)というのがその根拠です。同様に、「Everyone: 読み込み」「所有者: フルコントロール」という ACL しか付与されていないファイルの場合、パーミッションは「744」となります。
なお、このように ACE が(ntsec 的に)不完全なファイルは、chmod を実行することによって(ntsec 的に)完全な ACE を付与することが出来ます。仮に「Everyone」の ACE しか付与されていないファイルであっても、chmod をそのファイルに対して実行すれば、「所有者」及び「グループ」の ACE が付与されます。
アクセス権「所有権の取得」と chmod
ntsec 環境で chmod が成功するのは、chmod の対象としているファイル / ディレクトリに対して「所有権の取得」が許可されている場合だけです。「所有権の取得」が許可されていない場合は、喩え当該ファイル / ディレクトリの所有者といえども、chmod によってそのファイルのパーミッションを変更することは出来ません。
非 ntsec 環境での chmod
非 ntsec 環境で可能なパーミッション変更は、書き込み権限を付与する / 落とすということだけです。つまり「chmod o-w」や「chmod g+w」は実行可能ですが、「chmod o-r」や「chmod g+x」のような、読み込み権限 / 実行権限に対する操作は出来ないということです。
また、非 ntsec 環境でのパーミッション変更は ACE ではなく、MS-DOS 由来の「ファイル属性」を利用して行います。つまり、「chmod 444」を実行するとファイルに読み取り専用属性が付与され、「chmod 666」を実行すると読み取り専用属性が落とされます。しかし、ACE には一切の影響を及ぼしません。
「MS-DOS 由来のファイル属性」を知らない人は、「attrib /?」を実行してみて下さい。なお、attrib は Cygwin ではなく、Windows のコマンドです。
「第 9 章: より進んだアプリケーションの利用法」
javawrap と JAVA_HOME
9.3.1 に挙げたスクリプト「javawrap」ですが、これを利用するには事前に Windows 側で環境変数 JAVA_HOME に、J2SE SDK をインストールしたパスを指定しておく必要があります。
javawrap 内で参照している環境変数 JAVA_HOME は、UNIX 形式のパスで設定されている必要があります。しかし JAVA_HOME は Cygwin の外部でも利用される環境変数であり、通常は Windows 形式のパスで設定しておきたいところです。筆者は JAVA_HOME を次のように設定しています。
- Windows 側(例: コントロールパネルの「システム」の「環境変数」で、Windows 形式のパス表記で
JAVA_HOMEを設定する。 - bash の初期化ファイル内で、
JAVA_HOMEを UNIX 形式に変換する。
このようにすることで、Cygwin の外側では Windows 形式のパス表現で、Cygwin 内部では UNIX 形式のパス表現で JAVA_HOME を利用出来ます。これを実現するためには、.bashrc に次のような記述を含めておけばよいでしょう(当然ながら、javawrap の定義の前に記述して下さい)。
[ -n "$JAVA_HOME" ] && JAVA_HOME=`cygpath -u "$JAVA_HOME"`
bash から Ant を利用する
Java の開発を行っている方であれば、Ant のお世話になっていることが多いでしょう。Windows で Ant を利用する場合、$ANT_HOME/bin/ant.bat を利用するのが普通ですが、UNIX 用のシェルスクリプトである $ANT_HOME/bin/ant は Cygwin にも対応していますので、bash 上から Ant を利用する場合ははこちらを利用するほうがスマートでしょう。
筆者の環境では、先の JAVA_HOME と同様、ANT_HOME も Windows 側で(Windows 形式のパス表現で)設定しています。その上で、.bashrc に次の記述を追加しています。
[ -n "$ANT_HOME" ] && ANT_HOME=`cygpath -u "$ANT_HOME"`
これで、bash 上からでも Ant を利用することが可能です。
PostgreSQL のインストールに関する補足
注意: 現在の Cygwin 版 PostgreSQL は、System V IPC の実装として cygipc ではなく cygserver を利用するようになっています。従って、書籍のインストール方法は書籍に附属のバージョンに対してのみ適用して下さい。
「9.2.1 PostgreSQL の利用方法」について、幾つかの補足をします。
-
手順 4 における
postmasterの登録ですが、例中の「\」の直後の文字は必ず改行である必要があります(「\」の後ろには空白文字などが入ってはいけません)。UNIX 系 OS をご存知の方には今更な話ですが、この「\」は「後続の改行文字をエスケープする」ためのものであり、「\」の直後で改行しない場合、postmasterを正しくサービスとしてインストールすることは出来ません。よく分からない場合は「\」を無視して、この例の内容を全て一行で入力してしまって下さい。なお、postmasterのサービスへの登録は Administrator 権限を持つユーザで行います。コマンドの入力イメージをなるべく正確に記述すれば、次のようになります。分かりやすくするため、実際に入力する部分は強調表示しています。
$ cygrunsrv.exe -I postmaster -p /usr/bin/postmaster \ > -d "CYGWIN postmaster" --dep ipc-daemon --termsig INT \ > --user postgres --shutdown -a "-D /var/lib/pgsql/data -i" Enter password of user `HOSTNAME\postgres': Reenter, please: $
-
手順 5 においてデータベースのデータを格納するディレクトリを「
/var/lib/pgsql/data」以外にする場合は、手順 4 でのサービスの登録時の--shutdownオプションも変更する必要があります。仮にデータベースのデータを格納するディレクトリを「/usr/share/pgsql/data」とした場合は、--shutdownオプションの引数は「-D /usr/share/pgsql/data」となります。手順 5 では
chownを確実に実行して、/var/lib/pgsql/dataにユーザ postgres が書き込めるようにしておいて下さい。そうでないとinitdbが正常に完了しません。以下に、ユーザ postgres/var/lib/pgsql/dataに書き込めなかった場合のエラーを示しておきます。$ /usr/bin/initdb -D /var/lib/pgsql/data The files belonging to this database system will be owned by user "postgres". This user must also own the server process. The database cluster will be initialized with locale C. Fixing permissions on existing directory /var/lib/pgsql/data... chmod: changing permissions of `/var/lib/pgsql/data': Permission denied initdb failed.
-
手順 9 における postmaster サービスの起動ですが、サービスを起動可能な権限を持ったユーザで行って下さい。Power Users グループに所属しているユーザであれば大丈夫なはずです。
注釈として記述した「TCP/IP 経由での postmaster 接続」ですが、データベースのデータが格納されるディレクトリ(本書の例では
/var/lib/pgsql/data)の直下にある「pg_hba.conf」で行います。デフォルトでは「127.0.0.1」への接続は許可されているはずですが、他のホストから接続する場合は、そのための許可を設定しなければなりません。以下の例では、ホスト「127.0.0.1」(即ち「localhost」)、及びネットワーク「172.18.12.0」からの接続を許可するように設定しています(セキュリティ上の問題に繋がる可能性がありますので、設定に際しては必ずドキュメントを参照して下さい)。
# If you want to allow non-local connections, you need to add more # "host" records. Also, remember TCP/IP connections are only enabled # if you enable "tcpip_socket" in postgresql.conf. # TYPE DATABASE USER IP-ADDRESS IP-MASK METHOD local all all trust host all all 127.0.0.1 255.255.255.255 trust host all all 172.18.12.0 255.255.255.0 trust
「第 10 章: Cygwin コマンドリファレンス」
cygcheck の実行方法について
プログラムが利用する DLL を調べる場合、本文中では「ファイル名は完全な形式で指定する必要があり、拡張子を省略することは出来ない」(p.254)と記述していますが、PATH に含まれている実行形式 / DLL については、ファイル名だけでも OK です(実行形式の場合、拡張子「.exe」も不要です)。以下に例を示します。
$ cygcheck bash
Found: D:\Cygwin\bin\bash.exe
D:/Cygwin/bin/bash.exe
D:\Cygwin\bin\cygwin1.dll
C:\WINNT\System32\KERNEL32.dll
C:\WINNT\System32\ntdll.dll
C:\WINNT\System32\USER32.dll
C:\WINNT\System32\GDI32.dll
$ cygcheck cygwin1.dll
Found: D:\Cygwin\bin\cygwin1.dll
D:/Cygwin/bin/cygwin1.dll
C:\WINNT\System32\KERNEL32.dll
C:\WINNT\System32\ntdll.dll