【学習メモ】仮想ドライブにCygwinを入れてマウントして使う

## はじめに
X Windowを利用するのに、CygwinをWindowsにインストールします。
Cygwinのインストールには時間がかかります。
Windows機が増えてインストールし直すのは面倒です。
というわけでCygwinを入れたマスタードライブをNASに保存し、使用するWindowsに複製することでどのWindowsでも使えるようにします。
Windowsにログオンしたときにマウントされるようにします。
マスター+差分ディスクの構成で利用します。

## 仮想VHD (VHDX)の準備
```c:\temp ```ディレクトリを使って作業します。

### VHDの作成
いつのまにか、Windows 10でコンピューターの管理->ディスクの管理からVHDの作成が使えなくなっています。
コマンドプロンプトから作成します。

```text:VHDの作成
C:\Users\(yourname)> mkdir c:\temp
C:\Users\(yourname)> diskpart
DISKPART> create vdisk file="c:\temp\cygwin-x11.vhdx" maximum=16384 type=expandable

  100% 完了しました

DiskPart により、仮想ディスク ファイルが正常に作成されました。
```

### アタッチと初期化とフォーマット
アタッチします。

```text:アタッチ
DISKPART> select vdisk file="c:\temp\cygwin-x11.vhdx"

DiskPart により、仮想ディスク ファイルが選択されました。

DISKPART> attach vdisk

  100% 完了しました

DiskPart により、仮想ディスク ファイルがアタッチされました。
```

初期化します。
ディスクを間違わないように二重三重にチェックします。
下記の場合、作成した仮想VHDはディスク3にあたります。

```text:初期化
DISKPART> list disk

  ディスク      状態            サイズ     空き       ダイナ GPT
  ###                                               ミック
  -----------  --------------  --------  ---------  --- ---
  ディスク 0    オンライン       500 GB    2048 KB        *
  ディスク 1    オンライン       500 GB    2048 KB        *
  ディスク 2    オンライン       500 GB    2048 KB        *
* ディスク 3    オンライン        16 GB      16 GB        *

DISKPART> clean

DiskPart はディスクを正常にクリーンな状態にしました。

DISKPART> convert gpt

DiskPart は選択されたディスクを GPT フォーマットに正常に変換しました。

DISKPART> create partition primary

DiskPart は指定したパーティションの作成に成功しました。

DISKPART> list partition

  Partition ###  Type              Size      Offset
  -------------  ----------------  --------  -------
  Partition 1    予約                 15 MB    17 KB
* Partition 2    プライマリ           15 GB    16 MB
```
フォーマットします。

```text:フォーマット
DISKPART> format fs=ntfs label=cygwin64 quick

  100% 完了しました。

DiskPart は、ボリュームのフォーマット を完了しました。
```

マウントします。

```text:ドライブレターNでマウント
DISKPART> assign letter=n

DiskPart はドライブ文字またはマウント ポイントを正常に割り当てました。

DISKPART> exit
```
もしディスクが選択されていない場合、```select disk * ```、パーティションが選択されていない場合は```select partition * ```で選択します。

###### 参考資料
[仮想ディスクをコマンドラインから作成・管理する(www.atmarkit.co.jp)](http://www.atmarkit.co.jp/fwin2k/win2ktips/1267vdisk/vdisk.html)
[Q.【HDD】GPT形式でハードディスクをフォーマットしたい （コマンドプロンプト版）(qa.elecom.co.jp)](http://qa.elecom.co.jp/faq_detail.html?id=5300)
エレコムがコマンドプロンプトでFAQを作成していることに驚きです。


## Cygwinのインストール

参考資料のURL先を見ながらインストールします。

```text:インストール内容
インストーラー
https://cygwin.com/setup-x86_64.exe

Root Directory
 -> N:\

Local Package Directory
 -> C:\Users\(yourname)\Downloads

Category -> X11をインストール
Net -> OpenSSHをインストール
(openssh: The OpenSSH server and client programs)

30分くらい待つ
```

###### 参考資料
[3.3 CygwinによるX Window利用(itcweb.cc.affrc.go.jp)](http://itcweb.cc.affrc.go.jp/affrit/documents/guide/x-window/x-win-cygwin)


## 起動のための準備
### 起動スクリプトの作成
N:\Cygwin.batを修正します。

```text:Cygwin.batオリジナル
@echo off

N:
chdir N:\\bin

bash --login -i
```

バックアップをとって、以下の内容へ修正します。

```text:Cygwin.bat入れ替え後
@echo off
%~d0
set PATH=%SystemRoot%\system32
set cygdrive=%~d0
set cygdir=%~dp0
 
cd %~dp0\bin

set MAKE_MODE=unix
set CYGWIN=noacl nontsec nosmbntsec
set SHELL=/bin/bash
sh.exe -c "/usr/bin/mintty - &"

exit
```
単にcygwinを起動するときはこのbatから起動します。
注意!!! ここでこのBAT起動すると、現在のWindowsのユーザーで、N:\homeにユーザーディレクトリが作成されてしまうので実行しません。

### X Launchのショートカット作成
N:\にN:\bin\run.exeのショートカットを作成します。

ショートカットが作成できたら、リンク先を以下に変えます。

```text:リンク先
%windir%\system32\cmd.exe /c start "%cd%" "bin\run.exe" /usr/bin/bash.exe -l -c /usr/bin/xlaunch.exe
```
作業フォルダは空白にします。

以上でCygwinの準備は終わりです。

```text:デタッチする
DISKPART> select vdisk file=c:\temp\cygwin-x11.vhdx
DISKPART> detach vdisk

  DiskPart によって、仮想ディスク ファイルがデタッチされました。

DISKPART> exit
```

## NASの準備
共有フォルダに仮想VHDXをコピーします。
ここでは、```\\NAS\cygwin\```ディレクトリに、```cygwin-x11.vhdx```を保存したものとします。
### コピーツールの作成
以下の2つのファイルを作成します。

```text:\\nas\cygwin\cygwin-copy.bat
openfiles /local > NUL 2>&1 
if NOT %ERRORLEVEL% EQU 0 goto NotAdmin 

REM cygwin-x11コピーツール

REM ディレクトリの作成
mkdir c:\cygwin

REM cygwin-x11.vhdxのダウンロード
REM IGP:200で40/100(MBps)程度の制限になります。15分程度かかります。
robocopy /IPG:200 "\\NAS\cygwin" "c:\cygwin" cygwin-x11.vhdx

REM 差分ディスク c:\cygwin\cygwin-diff.vhdxの作成
diskpart -s \\nas\cygwin\makediffdisk.txt

REM 自動マウント用スクリプトの作成
echo select vdisk file=c:\cygwin\cygwin-diff.vhdx > c:\cygwin\diskpart-cygwin-x11-diff-select-attach.txt
echo attach vdisk >> c:\cygwin\diskpart-cygwin-x11-diff-select-attach.txt
echo diskpart -s c:\cygwin\diskpart-cygwin-x11-diff-select-attach.txt > c:\cygwin\automount_cygwin.bat

REM 自動マウント用のスクリプトでマウントする
c:\cygwin\automount_cygwin.bat

REM タスクスケジューラの登録
schtasks /Create /RU SYSTEM /SC ONLOGON /TN automount_cygwin_x11 /TR "c:\cygwin\automount_cygwin.bat"

goto End

:NotAdmin 
echo 管理者権限で実行してください。
pause
:End
```
管理者権限で実行するのはタスクスケジューラに登録するためです。
UTF-8で作成するときは先頭に```chcp 65001```を入れてください。ただしchcpをUTF-8に変えた状態でパスに2バイト文字が入った場合の動作確認はしていません。

```text:\\nas\cygwin\makediffdisk.txt
create vdisk file="c:\cygwin\cygwin-diff.vhdx" parent="c:\cygwin\cygwin-x11.vhdx"
```

## コピーの実行
```\\nas\cygwin ```には、以下の3つのファイルがあると思います。

```text:\\nas\cygwinに出来上がるファイル
cygwin-copy.bat
cygwin-x11.vhdx
makediffdisk.txt
```

NASのコピーBATを管理者権限で実行します。

```text:コピーBATの実行
\\nas\cygwin\cygwin-copy.bat
```

完了すると、c:\cygwinには、以下の4つのファイルが出来上がり、cygwinがインストールされたNドライブがマウントされます。

```text:c：\cygwinに出来上がるファイル
automount_cygwin.bat
cygwin-diff.vhdx
cygwin-x11.vhdx
diskpart-cygwin-x11-diff-select-attach.txt
```


以上で終了です。

1年くらい前にやった内容の焼き直しです。
Windowsで相対パスを書く上で、コマンドプロンプトで使える変数にたどり着くまですごい時間がかかった記憶があります。