Skip to main content.

Cygwin for Professionals

「Cygwin for Professionals」と銘打ってありますが、別に「プロの為の Cygwin 入門」というわけではありません。 ここで言うところの「Professionals」とは、Windows 2000 Professional 及び Windows XP Professional のことを指しています。

この文書の目的は、Cygwin をより UNIX ライクに利用するための情報を提供することにあります。 UNIX ライクに Cygwin を利用するためには、最低でも Windows 2000 Professional 或いは Windows XP Professional が絶対に必要です。具体的には、以下が実現可能な環境の構築を目指しています。

はじめに

UNIX 系 OS を使う時間よりもCygwin を使う時間のほうが圧倒的に長いといった不幸な人生を送っていると、 Cygwin をより通常の UNIX 系 OS に近いものにしたいという欲求が出てきます。 Cygwin は本物の UNIX ではありませんから、どうしても限界がありますが、 それでも少し足掻いてみると、多少なりともましな環境を作ることが出来ます。

この文書は、Cygwin をより UNIX ライクに利用するためのメモです。 具体的には、以下の 2 点を実現することを目的としています。

ユーザと管理者の分離

UNIX 系 OS では root と一般ユーザを分離しているにも関わらず、Windows 環境では普段利用するユーザに Administrator 権限を付与してしまう人が多いようです。 しかし、これでは「UNIX ライクなアクセス管理」という目標を達成することは出来ませんので、普段利用するユーザには Administrator 権限を付与しないこととします。最初のうちは不自由に感じられるかもしれませんが、すぐ慣れます。

ユーザと管理者を分離している環境では、当然ながら Cygwin のインストールは Administrator で、Cygwin の利用は一般ユーザで、ということになります。Administrator 権限が必要となった場合は、runas 或いは同種の機能を使って対応することになります。

NT のセキュリティ機能を利用して、より UNIX ライクなアクセス管理を実現する

Cygwin のディレクトリ・ツリーのパーミッションを、極力他の UNIX 系 OS に近いものにします。つまり、一般ユーザは Cygwin が提供するコマンドやデータを変更 / 削除出来ないようになります。

Cygwin のセットアップ

Cygwin のセットアップというと、「まずは setup.exe を起動して…」という手順が頭に思い浮かぶかもしれませんが、 その前にインストール場所と、ディレクトリ・ツリーの構成に関する検討を行っておきましょう。

インストール場所の検討

デフォルトのインストール場所

Cygwin のデフォルトでは、Cygwin 環境一式が %SYSTEMDRIVE%\Cygwin にインストールされます。SYSTEMDRIVE は Windows が定義している環境変数で、 WINDOWS ディレクトリ(或いは WINNT ディレクトリ) が置かれているドライブを指しています。つまり通常の環境では、Cygwin のインストール先は C:\Cygwin となり、このディレクトリが Cygwin 環境のルートディレクトリとなります。なお、%SYSTEMDRIVE%\Cygwin という表記は分かり難いため、以下では SYSTEMDRIVEC: として話を進めます。

このインストールパスは、本文書で掲げた目標の実現に適っています。 C:\ 直下にインストールすることを薦める向きもありますが、/ 直下に「WINNT」や「Documents and Settings」 といった異質なパスが存在するような環境は、お世辞にも「UNIX ライク」とは言えません。

アンインストールが発生することを前提としたインストール場所

C:\Cygwin にインストールする方法には、「アンインストールが行い難い」という大きな問題があります。 ntsec 環境で Cygwin を使用していると、Administrator 権限をもってしても削除出来ないファイルが数多く作成されることになるからです。 Windows NT の Administrator は UNIX における root とは異なり、自分が権限を持ってないファイルを変更 / 削除することは出来ません。つまり、一般ユーザが「chmod 600」したファイルは、Administrator であっても削除することは出来ないわけです。

このようなファイルを Administrator が削除するには、一旦 chown で所有者を変更するか、エクスプローラから「所有権の取得」を行う必要があります。つまり、Cygwin のアンインストールとは「C:\Cygwinを削除すれば完了」というような、生易しいものとはならないケースが殆どとなる筈です。

筆者の場合、C: とは別のドライブ(例: D:)以下に Cygwin ディレクトリを作成し、そこに Cygwin をインストールすることにしています。また、そのドライブは Cygwin 専用とし、他のデータやソフトウェアをインストールすることありません。

この方式を採用しているのは、アンインストールを考慮してのことです。 筆者が採用している Cygwin のアンインストール方法は、「Cygwin をインストールしたドライブをクイックフォーマットする」というものです。おそらくはこれこそが最も簡単かつ確実なアンインストール方法であり、このために Cygwin のインストール先を別ドライブとしているのです。

Cygwin のインストール先を別ドライブとする場合、ドライブの容量は 3GB もあれば十分です。Cygwin 本家 から配布されているパッケージを全てインストールしても、半分以上空きます。筆者は何となく D:\Cygwin ディレクトリ以下にインストールしていますが、当該ドライブのルートディレクトリ直下にインストールしてしまってもよいでしょう。

ディレクトリ・ツリーの構成

ホームディレクトリ

Linux などではユーザのホームディレクトリは /home 以下に置かれるため、Cygwin でもホームディレクトリをついつい /home 以下に直接置いてしまいがちです。しかしこの方法では、Cygwin のアンインストール時にホームディレクトリの内容を退避しなければなりません。また、通常の Windows 環境で「ホームディレクトリ」的に利用している場所(「マイ ドキュメント」など)がある場合、その場所と Cygwin でのホームディレクトリが異なるのは、あまり気持ちがよいものでもないでしょう。

筆者が採用している方法は、全てのユーザのホームディレクトリを Cygwin のインストールパスとは別の場所に集約するという方法です。具体的には、C:\Cygwin 以下ではない別の場所(例: C:\home)に「ホームディレクトリを集約するディレクトリ」を用意し、その下に各ユーザのホームディレクトリを作成します。この「ホームディレクトリを集約しているディレクトリ」を Cygwin の/home にマウントすれば、通常通りインストールした場合と同様の使い勝手が得られます。

ここで問題となるのは、「普段 Windows 環境でホームディレクトリ的に利用しているディレクトリ」と「Cygwin のホームディレクトリ」をどのように位置付けるか、です。筆者の場合は Cygwin のホームディレクトリと、Windows 環境でのホームディレクトリ的なディレクトリを同じものとしています。即ち、「ホームディレクトリを集約しているディレクトリ」として E:/home を用意し、その下に自分のホームディレクトリである「E;/home/riue」を作っていますが、ここを Windows 環境でもホームディレクトリ的に利用しています(例えば、Meadow 用の .emacs はここに置いています)。

既に「マイ ドキュメント」を実質的なホームディレクトリとしている人は、以下の三つの選択肢があります。 実際には、2 が最も現実的な方法でしょう。兎に角、Cygwin が用意する /home、つまり C:\Cygwin\home の下に直接ホームディレクトリを作成するのではなく、別の場所をホームディレクトリとしてマウントしてから利用すべきです。

  1. 「マイ ドキュメント」の場所を、Cygwin でのホームディレクトリに変更してしまうという方法。
  2. 「マイ ドキュメント」として利用しているディレクトリを、「/home/ユーザ名」としてマウントする方法。
  3. C:\Documents and Settings/home にマウントしてしまう方法。

余談ですが、「マイ ドキュメント」を「/home/ユーザ名」としてマウントする場合、Windows の環境変数を利用すれば次のように簡単に書けます。これらの環境変数はユーザごとに異なるので、マウントは user として行っている点に注意して下さい。

mount -u "$USERPROFILE" /home/$USERNAME

/usr/local

自分でプログラムをビルドして /usr/local にインストールする機会が多い人は、Cygwin の /usr/local をそのまま使うのではなく、別のディレクトリを /usr/local としてマウントしたほうがよいでしょう。こうしておけば、Cygwin の再インストール時に /usr/local を退避させる必要はなくなります。

/opt

筆者は個人的に、/opt というマウントポイントを利用しています。Cygwin のツール群と連携して利用するツール(Meadow や J2SDK など)をインストールしたディレクトリを /opt 以下にマウントしておくと、何かと使いやすいからです。

/cygdrive プレフィックス

/cygdrive プレフィックスは、特に理由がなければ「/」にしておくべきでしょう(タイプ数が少なくて済むからです)。/cygdrive/ に変更するには、次のようにします。

mount -c /

これによって、例えば C: ドライブは /cygdrive/c ではなく、/c としてアクセス出来るようになります。

ディレクトリ構造のまとめ

筆者が採用しているディレクトリ構造を纏めると、次のようになります。マウントポイントは必ずしも作る必要はないのですが、シェルからの補完の効率を考えると、マウントポイントは最初に作成しておくのが得策です(マウントポイントが存在しない場合、マウントポイントをシェルから補完出来ないため)。

なお、筆者は /usr/local にソフトウェアをインストールしませんので、/usr/local をマウントしたことはありません。

D:\cygwin\usr\X11R6\lib\X11\fonts on /usr/X11R6/lib/X11/fonts type system (binmode)
D:\cygwin\bin on /usr/bin type system (binmode)
D:\cygwin\lib on /usr/lib type system (binmode)
D:\cygwin on / type system (binmode)
C:\opt on /opt type system (binmode)
E:\home on /home type system (binmode)
E:\local on /usr/local type system (binmode)
c: on /c type system (binmode,noumount)
d: on /d type system (binmode,noumount)
e: on /e type system (binmode,noumount)

ディレクトリツリーで示すと、このようになります。

C:
└\opt
    ├\J2SDK      -- J2SDKをインストールしている場所。
    └\Meadow     -- Meadowをインストールしている場所。
D:
└\Cygwin         -- Cygwin 環境のルートディレクトリ。
    ├\home       -- Cygwin 環境での「/home」。E:\homeをマウントする。
    ├\opt        -- Cygwin 環境での「/opt」。C:\optをマウントする。
    └\usr\local  -- Cygwin 環境での「/usr/local」。E:\localをマウントする。
E:
├\home           -- 各ユーザのホームディレクトリをこの下に置く。
└\local          -- 自分でコンパイルしたアプリケーションは、ここにインストールされる。

ACL の設定

Cygwin 環境をなるべく UNIX 的なパーミッション設定で利用するため、インストール前にインストール先ディレクトリ(Cygwin 環境における「/」となる場所)の ACL を適切に設定しておきます。Cygwin のインストール先ディレクトリに cacls で ACL を設定しておけば、ACL の継承によって、当該ディレクトリ以下の全てのファイル / ディレクトリに上記の ACL が引き継がれます。

とは言っても、別に難しいことを考える必要はありません。Cygwin をインストールする前に、コマンドプロンプトから次のようなコマンドを実行するだけです。

cacls Cygwin のインストールディレクトリ /p なし:R Everyone:R SYSTEM:F Administrators:F Users:R "CREATOR OWNER:F"

インストール先が C:\Cygwin の場合は、次のようなイメージになります。

C:\>cacls D:\Cygwin /p なし:R Everyone:R SYSTEM:F Administrators:F Users:R "CREATOR OWNER:F"
   よろしいですか (Y/N)?y
   処理ディレクトリ: D:\Cygwin

このコマンドの肝は、次の通りです。

このように ACL を設定し、Cygwin のインストール / アップデートを Administrator 権限で行えば、各ファイルのパーミッションは全て「755」となり、他の UNIX 系 OS とほぼ近いものとなります。

尤も、通常の UNIX 系 OS では、実行可能ファイル以外のファイルのパーミッションは 644 であることが普通です。 そこで「ディレクトリについては 755、ファイルについては 644 となるようにしたい」といった要望が出てきますが、残念ながらこれを Cygwin で実現することは出来ません。NT では ACL の継承時に、ファイルとディレクトリの区別は為されないからです。我々に出来る唯一のことは「全てのファイル / ディレクトリのパーミッションを 755 にする」か、「全てのファイル / ディレクトリのパーミッションを 644 にする」かを選択することだけです。ディレクトリのパーミッションが 644 ではディレクトリの内部に移動することは出来ませんから、必然的に前者を採用することとなります。

インストール後の作業

上記の作業が完了したら、実際に setup.exe を利用してインストールを行います。 setup.exe を利用しての具体的なセットアップ手順については既に至る所で説明されていますので、ここでは取り上げません。

インストールが完了したら、Administrator で以下の作業を行いましょう(まだ一般ユーザでは Cygwin を利用することは出来ません)。

マウントの実施

既に検討した方針に従って、マウントポイントの作成とマウントを行います。マウントは全て system とします(現在の Cygwin であれば、明示的に指定しない限りマウントタイプは system となるはずです)。「マイ ドキュメント」を /home の下にマウントする場合は、user でもよいでしょう。

/tmp のパーミッション変更

前述の ACL 設定で Cygwin をインストールすると、/tmp のパーミッションが 755 となってしまうため、一般ユーザ権限では /tmp に書き込むことが出来ません。このままでは幾つかのプログラムが動作しませんので、/tmp の ACL を変更しておきましょう。/var/tmp にも、同様に変更を施しておいたほうがよいかもしれません。

このためには、コマンドプロンプトから以下のコマンドを入力します。

C:\> cacls C:\Cygwin\tmp /e /p なし:F Everyone:F Users:F
C:\> cacls C:\Cygwin\var\tmp /e /p なし:F Everyone:F Users:F

但し、これでは /tmp に作成されたファイル / ディレクトリは、全ての人間から読み書き可能な状態になってしまいます。 厳密にやるのであれば、エクスプローラからアクセスコントロールエディタ(コンテキストメニューの「プロパティ」から「セキュリティ」タブを開き、「詳細設定」ボタンをクリックして開くダイアログ)で、次のように設定するとよいでしょう。

Administrators
フルコントロール(このフォルダ、サブフォルダ及びファイル)
SYSTEM
フルコントロール(このフォルダ、サブフォルダ及びファイル)
CREATOR OWNER
フルコントロール(サブフォルダとファイルのみ)
Everyone
フルコントロール(このフォルダのみ)
Users
フルコントロール(このフォルダのみ)
なし
フルコントロール(このフォルダのみ)

これによって /tmp は「誰でもファイル / ディレクトリを作成できるものの、実際に作成したファイルは SYSTEM、Administrators、ファイルの作成者のみがアクセス可能(それ以外の人間には読めない)」という状態となるため、より安全です。

ホームディレクトリの問題

現在の Cygwin では、bash を「--login」オプション付きで実行すると、自動的に bash を起動したユーザのホームディレクトリが作成されます。この処理は /etc/profile 内で行われていますが、これが結構曲者です。

/etc/profile では環境変数 HOME の値をホームディレクトリとし、このディレクトリが存在しなった場合のみ以下の処理を行います(HOME が明示的に設定されていない場合、Cygwin DLL は /etc/passwd 内からホームディレクトリの位置を取得して HOME に設定します)。

ここで問題となるのは、「全てのユーザは必ず /home の直下にホームディレクトリを作成することが出来る」ということが仮定されている点です。ここまでで説明した手順に従って Cygwin をインストールしている場合、一般ユーザでは /home ディレクトリに書き込めるということは保証されていません。例えば、筆者は自分で作成した E:/home(/home としてマウントされているディレクトリ)にも、先に C;\Cygwin に対して施したような ACL の設定を行っているため、一般ユーザが /home 直下に自分のホームディレクトリを作成することは出来ません。

もし一般ユーザが /home に書き込めない場合、一般ユーザのホームディレクトリは作成されず、初期設定ファイルもインストールされないということになってしまいます。これを解決するためには、以下の二つの方法があります。

どちらの解決策も問題を孕んでいることは明白ですが、個人的には前者を採用したほうがよいと考えています。初期設定ファイルは、個々のユーザが /etc/skel からコピーしなければなりませんが。

なお、各ユーザのホームディレクトリを作成する場合、所有者はそのユーザ、パーミッションは 700 にしておくと、よりそれっぽくなるでしょう。「chmod 700 ホームディレクトリ」でも構いませんが、ACL を操作して行うなら、次のようにします(ここでは、ユーザ名を「foo」と仮定します)。

C:\>cacls C:\home\foo /g SYSTEM:F Administrators:F foo:F "CREATOR OWNER:F"
   よろしいですか (Y/N)?y
   処理ディレクトリ: C:\home\foo

この後、ユーザはアクセスコントロールエディタから「所有権の取得」を行って、自分のホームディレクトリの所有者を自分自身にします(NT では Administrator と雖もファイルの所有者を変更出来ないためです)。

/etc/passwd/etc/group の変更

より UNIX ライクにするためにも、/etc/passwd 及び /etc/group の内容を変更しておきましょう。

まず、/etc/passwd から Administrator を定義している行(uid が 500 となっている行)を探し出し、ユーザ名を「root」、uid を「0」に変更しておきます。これで、Administrator が root のように見えることになります。

Administrator:unused_by_nt/2000/xp:500:513:U-DRAGONWATER\Administrator,S-1-5-21-2766028294-3257433288-2591740942-500:/home/Administrator:/bin/bash
      ↓
root:unused_by_nt/2000/xp:0:513:U-DRAGONWATER\Administrator,S-1-5-21-2766028294-3257433288-2591740942-500:/home/Administrator:/bin/bash

好みに応じて、/etc/group にも変更を加えておきましょう。例えば、グループ名「なし」を「none」に変更する、グループ名「Users」を「users」に変更する、グループ名「Guest」を「nobody」に変更する、などといった作業を行います。

以上のような作業を行うと、ルートディレクトリでの ls の結果は次のようになります。

$ ls -l /
合計 8
drwxr-xr-x+   4 root     users           0 Aug  3 21:33 bin/
-rwxr-xr-x+   1 root     users          57 Jul 24 18:34 cygwin.bat*
-rwxr-xr-x+   1 root     users        7022 Aug  4 08:20 cygwin.ico*
drwxr-xr-x+  32 root     users           0 Aug 30 21:15 etc/
drwxr-xr-x+  44 root     users           0 Aug  3 21:33 lib/
drwxr-xr-x+   2 root     users           0 Jul 24 19:04 sbin/
drwxrwxrwx+   2 root     users           0 Aug 30 21:31 tmp/
drwxr-xr-x+  24 root     users           0 Jul 29 00:52 usr/
drwxr-xr-x+  11 root     users           0 Jul 24 19:18 var/

多少なりとも、一般的な UNIX 系 OS の姿に近いものとなりました。