Cygwinの/usr等をネットワーク共有に置く


WindowsでLinux/UNIXライクな環境を提供するCygwin、これをフルインストールするとすごく大きな容量になってします。いまどきHDDはテラバイト級だろというかもしれませんが、SSDだとまだまだ高くて容量少ないし、ほとんど使わないものでSSDの肥やしにしたくないものです。ということで、SSDしかつんでないPCにCygwinをフルインストールするのはあまりやりたくありません。かといって、いざパッケージを絞ろうにもどれを入れたらいいのかを迷うのも人間で、やはり全部入れておきたいと思うのです。

そこで、Cygwinの/usr等にあるバイナリデータを全部、NASなどのネットワーク共有置いてしまおうというのが今回の目的です。

## 環境と要件

* Windows 8.1 Pro 64bit (たぶん、他でもできるとは思う)
	* ローカルはCドライブのみ (SSD)
* Cygwin x86_64 (たぶん、32bit版でもできると思う)
	* フルインストール
	* `/usr`と`/lib`を下記のNASに置く (`/bin`とかはたぶん無理だと思う)
* NAS
	* TreaStation (たぶん、どんなNASと思う)
	* Cygwin用領域として `\\fs.example.jp\share\data\cygwin` を用意
		* PCからフルアクセスできること
		* ユーザー名とパスワードは聞かれないこと (資格情報を保存するなどする)
		* ネットワークドライブとして割り当てないこと
		* **ローカルイントラネットとして認識されること**
		* オフラインフォルダ無効
* 前提知識
	* 「ローカルイントラネット」がどういう物でどういう設定すればわかるぐらいのWindowsについての知識

どういうことかというと、PC利用者にはCygwinが実はネットワーク共有にあるなんてことはわかるようにしたくないと言うことです。ですので、Z:ドライブに割り当てとかは禁止です。

## インストール

共有は既にあることが前提です。PCには管理者権限があるユーザでログオンします。

1. `\\fs.example.jp\share\data\cygwin`に`setup`フォルダを用意します。
2. [Cygwin](https://www.cygwin.com/)から`setup-x86_64.exe`をダウンロードして、`\\fs.example.jp\share\data\cygwin\setup`に置きます。
3. `setup-x86_64.exe`を実行します。「ユーザー アカウント制御」は「はい」を答えます。ここで「セキュリティの警告」が最初に表示される場合はローカルイントラネットとして認識されてません。インターネットオプションでローカルイントラネットに含めるよう設定してください。
	1. 「次へ」
	2. 「Install from Internet」を選んで「次へ」。
	3. 「Root Directory」はデフォルトの「C:\\cygwin64」、「Install for」は「All Users (RECOMMENDED)」を選んで「次へ」。
	4. 「Local Package Directory」が「\\\\fs.example.jp\\share\\data\\cygwin\\setup」になっていることを確認して「次へ」。
	5. 環境に合わせてプロキシ設定を変えて「次へ」。
	6. jpドメインのミラーを選んで「次へ」。ftpの方がちょっと速いですがプロキシ環境ではうまくいかない場合もあるので注意してください。北海道・東北のSINET傘下は山形大学(ftp.yz.yamagata-u.ac.jp)、その他のSINET傘下は北陸先端科学技術大学院大学(ftp.jaist.ac.jp)、SINET傘下以外はIIJ(ftp.iij.ad.jp)が速いと思います。
	7. 一覧が表示されますが、Allが「Default」のまま「次へ」。はじめは最低限のパッケージだけ入れます。
	8. 依存関係は「Selecte required packages (RECOMMENDED」が有効であることを確認して、「次へ」。
	9. アイコン作成はお好みで「完了」。
4. 一度Cygwinが正常に起動できることを確認します。起動できれば、`exit`で終了します。
5. `C:\cygwin64`にある`usr`と`lib`を`\\fs.example.jp\share\data\cygwin`に **移動** します。
6. コマンドプロンプトを「管理者として実行」し、下記コマンドを実行します。

    ```cmd
    C:\Windows\system32>cd C:\cygwin64
    C:\cygwin64>mklink /d usr \\fs.example.jp\share\data\cygwin\usr
    usr <<===>> \\fs.example.jp\share\data\cygwin\usr のシンボリック リンクが作成されました
    C:\cygwin64>mklink /d lib \\ fs.example.jp\share\data\cygwin\lib
    lib <<===>> \\fs.example.jp\share\data\cygwin\lib のシンボリック リンクが作成されました
    ```

7. `C:\cigwin64\etc\fstab`をLFのみ改行に対応したテキストエディタ(メモ帳不可)で開いて、下記行を末尾に追加します。

    ```fstab
    //fs.example.jp/share/data/cygwin/usr /usr smbfs binary 0 0
    //fs.example.jp/share/data/cygwin/lib /usr/lib smbfs binary 0 0
    /usr/lib /lib none bind
    ```

8. 一度Cygwinが正常に起動できることを確認します。`ls`や`mount`で正常に動作することを確認します。正常に動作していれば、`exit`で終了します。
9. 再度`setup-x86_64.exe`を実行し、パッケージはAllで「Instnall」を選んで、フルインストールを行います。ただし、フルインストールはかなりの時間がかかるので、適当なパッケージを一つ入れて正常動作を確認することを推奨します。
10. 最後にCygwinを起動し、動作確認を行って終了です。

## 解説

ネットワーク共有にシンボリックリンクを貼っただけでは動作しません。シンボリックリンクがUNC接続であるため、Cygwin上の各コマンドが失敗します。そこで`fstab`も一緒に設定することで対応します。シンボリックリンクを張るのはインストーラ等Cygwin外のアプリケーションとの整合性を保つためです。

`/lib`は特殊でデフォルトで`/usr/lib`にマウントされています。`/usr/lib`のみだと整合性がなくなるので、`bind`なマウントも記述する必要があります。

`fstab`の詳細は[Cygwinのマニュアル](https://cygwin.com/cygwin-ug-net/using.html#mount-table)を参考にしてください。

NASやネットワークによりますが、ローカルに比べると各コマンドの起動速度はかなり遅いです。これはどうしようも無いです。

以上になりますが、一切無保証ですので、本番環境での実施は十分な検証をしてからにしてください。