VHDXファイルをWIMに変換して物理ディスクにインストール

## はじめに ##

VHDブートはサブとして使うか、サブWindowsがある上で運用しようね……！

VHDネイティブブート **のみ** でメイン運用していたため、Windowsの大型アップデートが適用できずに詰んだ／(^o^)＼
状態から `.vhdx` ファイルの中身を物理ディスクに展開することで解決できたので、その方法を残しておきます。

2018/08/19 仮想メモリの設定が初期化されることの追記

## 注意事項 ##

* *Windows PE* を用意する
* *Windows Subsystem for Linux（WSL）* はアンインストールしておく
    * *WSL* 関連でイメージ作成時の処理が失敗するため
* 現状の `.vhdx` ファイルのバックアップをとる
* Windows OSをインストールするディスクの既存パーティションは初期化する


## 作業準備 ##

### Windows PE ブートメディアの作成 ###

[管理者必携のトラブルシューティングツール「Windows PE 5.0」の起動用USBメモリを作成する (1/2)][winpe-1] や [Windows 10 用の Windows PE (WinPE) のUSBメモリセットアップ例][winpe-2] の記事を参考に作成する。


### WSL バックアップ ###

*WSL* の環境をバックアップする。
要はルートディレクトリ以下を `.tar.bz2` として固めてしまう。

やり方は [WSLのバックアップを検討する][wsl-backup] の記事に書かれている通りにすればいい。

1. 除外ディレクトリ設定ファイルの作成

    ```bash:WSL
    $ cat <<EOF > /mnt/f/exclude.txt
    > /mnt
    > /dev
    > /proc
    > /tmp
    > /sys
    > /run
    > /var/log
    > EOF
    ```

1. `tar` コマンドで圧縮

    ```bash:WSL
    sudo tar -cvpjf /mnt/f/WSLbackup/20180803-backup.tar.bz2 -X /mnt/f/exclude.txt /
    ```


### WSL アンインストール ###

Windows設定の *アプリと機能* からアンインストールしておく。

アンインストール後はPCを再起動し、*Windows PE* を起動させる。


## Windows PE で作業開始 ##

以下、*Windows PE* 上から操作していく。

1. `.vhdx` ファイルを `.wim` ファイルに変換
2. ディスクのパーティション再構成
3. 作成した `.wim` ファイルからディスクにWindowsインストール


### 変数設定 ###

コマンド操作で用いるファルダ/ファイルパスをあらかじめ変数に設定しておく。

まずは現在認識されているボリュームのドライブ文字を確認。

```shell:cmd
echo list volume | diskpart
```

あとは `dir` コマンドなどで次のパスについて位置を特定し、変数の設定を行う。
（`.vhdx` ファイルのパス以外は、Windowsをインストールするディスクとは別のディスクないし外部メディアを指定すること）

* `.vhdx` ファイルのパス
* `.vhdx` ファイルをマウントするフォルダパス
* 一時保存用フォルダ（scratch）のパス
* 作成する `.wim` ファイルのパス

    ```shell:cmd
    set vhdx=C:\path\to\windows.vhdx
    set mnt=E:\mount
    set scratch=E:\scratch
    set wim=E:\wim\win10-yyyy-mm-dd.wim
    ```

### `.vhdx` ファイルのバックアップ ###

作業を開始する前に現在使用している `.vhdx` ファイルをバックアップしておく。
バックアップはコピーすればいい。

が、次のコマンドで `.vhdx` から `.vhd` ファイルへ変換してバックアップをとることもできる。

```shell:cmd
echo create vdisk file="F:\vhd\win10-yyyy-mm-dd.vhd" source=%vhdx% type=fixed | diskpart
```

容量可変にしたい場合は `type=expandable` とする。


### VHDX -> WIM 変換 ###

`.vhdx` ファイルを `.wim` ファイルへ変換していく。

1. `.vhdx` ファイルをマウント

    ```shell:cmd
    mkdir %mnt%
    Dism /Mount-Image /ImageFile:%vhdx% /index:1 /MountDir:%mnt% /ReadOnly
    ```

    Windowsイメージを `.vhd` ファイルからマウントする場合、`index` は **1** にするべきらしい。

1. マウントしたイメージを `.wim` ファイルに変換

    ```shell:cmd
    mkdir %scratch%
    Dism /Capture-Image /ImageFile:%wim% /Compress:max /CaptureDir:%mnt% /Name:"Windows-VHDX" /CheckIntegrity /Verify /ScratchDir:%scratch%
    ```

    イメージ作成・展開時にデフォルト設定では一時保存領域が小さすぎて失敗する。
    これを避けるため `/Scratch` オプションを用いて一時保存フォルダを指定している。

1. `.wim` ファイルが作成できたらアンマウント

    ```shell:cmd
    Dism /Unmount-Image /MountDir:%mnt% /discard
    ```

### パーティションの再構成 ###

Windows起動ディスクのパーティションを再構成する。

1. ドライブ文字 **C** の割当解除

    **C** ドライブは後々Windowsイメージをインストールするパーティションに設定するため、ここで一度変更して解除する。
    （このとき `R, S, X` は **割り当ててはいけない** ）

    ```shell:cmd
    (
      echo select volume C:
      echo assign letter=T
    ) | diskpart
    ```

1. Windows起動用ディスクの番号を確認

    ```shell:cmd
    (
      echo select volume <Number>
      echo list disk
    ) | diskpart
    ```

1. Windows起動用ディスクをフォーマット

    ```shell:cmd
    (
      echo select disk <DiskNumber>
      echo clean
      echo convert gpt
      echo list partition
    ) | diskpart
    ```

1. 各パーティションを構成

    ```shell:cmd
    (
      echo select disk <DiskNumber>

      echo create partition primary size=1024
      echo format quick fs=ntfs label=Recovery
      echo assign letter=R
      echo setid id=de94bba4-06d1-4d40-a16a-bfd50179d6ac

      echo create partition efi size=512
      echo format quick fs=fat32 label=EFI
      echo assign letter=S

      echo create partition msr size=16

      echo create partition primary
      echo format quick fs=ntfs label=Windows
      echo assign letter=C

      echo list partition
    ) | diskpart
    ```

以上でパーティション再構成は完了です。

|partition| 回復環境ツール | EFIシステム | MSR | Windows |
|:-:|:-:|:-:|:-:|:-:|
|**Letter**| R | S | -- | C |


### WIMからDiskにインストール ###

1. `.wim` イメージを作成したWindowsパーティションにインストールする。

    ```shell:cmd
    Dism /Apply-Image /ImageFile:%wim% /index:1 /ApplyDir:C:\ /CheckIntegrity /Verify /ScratchDir:%scratch%
    ```

1. ブートコーダーの設定

    ```shell:cmd
    bcdboot C:\Windows /l ja-JP /s S:
    ```

## 終わり ##

以上で必要な操作は終了です。
*Windows PE* を終了してPCを再起動しましょう。
ディスクにインストールされたWindowsが起動するはずです。

```shell:cmd
exit
```

お疲れ様でした。

---------------------

（8/19 追記）
仮想メモリ（ページファイル）の設定が初期化されるみたいです。
なので `[コントロールパネル] -> [システムとセキュリティ] -> [システム] -> [システムの詳細設定]` から設定の確認をし、必要ならば再度設定を行って下さい。

別ドライブにページファイルを移動していた場合はインストールしたWindowsではそれを認識しないので、一旦有効化してから削除してみてください。

* あるドライブにおけるページファイルの有無を確認

    ```powershell:管理者
    Get-ChildItem G:\ -Attributes Hidden -Filter pagefile.sys
    ```

また、*休止状態* も有効化されているので不要であれば無効化してください。

```powershell:管理者
powercfg /h off
powercfg /a
```


## 補足：UEFI/GPT パーティションの構成について ##

[UEFI/GPT ベースのハードドライブパーティション][gpt]を参考にする。

* **回復環境ツール パーティション**

    * 指定された `GUID` を設定する必要がある
    * 容量が足りない場合は勝手にパーティションが増設されてしまうので、あらかじめ多めの容量を確保したほうがいいらしい

    |最低サイズ |個人的推奨サイズ |ファイルシステム |ドライブ文字 |GUID |
    |:-:|:-:|:-:|:-:|---|
    |300 MB |1024 MB | NTFS | R | DE94BBA4-06D1-4D40-A16A-BFD50179D6AC |

* **EFIシステム パーティション**

    * 最低値だと大型アップデートのときにエラーが発生することがあるため多めに確保

    |最低サイズ |個人的推奨サイズ |ファイルシステム |ドライブ文字 |
    |:-:|:-:|:-:|:-:|
    |100 MB |512 MB | FAT32 | S |

* **Microsoft予約 パーティション（MSR）**

    * 規定サイズの16MBを確保すればいい
    * ドライブ文字は割り当てられない

    |最低サイズ |個人的推奨サイズ |ファイルシステム |ドライブ文字 |
    |:-:|:-:|:-:|:-:|
    |16 MB |16 MB | （自動） | -- |

* **Windows パーティション**

    * Windows OS をインストールするパーティション
    
    |最低サイズ |個人的推奨サイズ |ファイルシステム |ドライブ文字 |
    |:-:|:-:|:-:|:-:|
    |20 GB | お好きに | NTFS | C |


## 参考 ##

* [WSLのバックアップを検討する | concerti.tsukubaのブログ][wsl-backup]
* [VHDXをVHDに変換する冴えてないやり方 | FNE.JP::とあるIT系脱求職者の日記(仮称)](http://blog.fne.jp/2015/07/post-621.html)
* [Windowsのバックアップと復元にはDismを使う | バグのある生活](http://morizzos-buglife.blogspot.com/2015/07/windowsdism.html)
* [Windowsのdiskpartコマンドでディスクのパーティションを操作する (1/3) | @IT](http://www.atmarkit.co.jp/ait/articles/0812/26/news119.html)
* [コマンドプロンプトを使ってWindows 10のパーティションをカスタマイズしてクリーンインストールする | vorfee's Tech Blog](http://vorfee.hatenablog.jp/entry/2016/08/07/061930)
* [DISM イメージ管理のコマンドラインオプション | Windows 10 hardware dev](https://msdn.microsoft.com/ja-jp/library/windows/hardware/dn898549(v=vs.85).aspx)
* [UEFI/GPT ベースのハードドライブパーティション | Windows 10 hardware dev][gpt]
* [Windows パーティション、システム パーティション、回復パーティションのキャプチャと適用 | Windows デベロッパーセンター](https://msdn.microsoft.com/ja-jp/windows/desktop/hh825041)


[wsl-backup]:http://concerti.hatenablog.com/entry/2018/02/06/214659
[winpe-1]:http://www.atmarkit.co.jp/ait/articles/1402/13/news133.html
[winpe-2]:https://qiita.com/msakamoto_sf/items/3fff0e7c68e6aaf1a60e
[gpt]:https://msdn.microsoft.com/ja-jp/library/windows/hardware/dn898510(v=vs.85).aspx