Insider PreviewのWSL2で仮想ディスクイメージ(VHD/VHDX)をマウントする

ソース:

- https://ascii.jp/elem/000/004/026/4026714/
- https://docs.microsoft.com/ja-jp/windows/wsl/wsl2-mount-disk


順番としては

0. （仮想ディスクイメージがなければ）VHD/VHDXを新規作成する
1. VHD/VHDXをWindowsにアタッチする
2. WSLにブロックデバイスとして認識させる
3. （未フォーマットの場合は）WSLでフォーマットする
4. WSLでマウントする

となります。

Windows 10 ビルド20211以降では、3. 単体、または3.と5.を合わせて、`wsl.exe --mount` コマンドが使えます。

## VHD/VHDXを新規作成する

### GUI

「ディスクの管理」から「VHDの作成」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2079/6f949355-f9ac-931e-3479-f674f50a3c15.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2079/b2525fbc-f0dc-fb49-3883-3aa9ede48006.png)

### コマンドライン

```
> diskpart.exe
Microsoft DiskPart version 10.0.20270.1

Copyright (C) Microsoft Corporation.
On computer: xxxxxxxx

# 容量固定
DISKPART> create vdisk file="<VHDまたはVHDXファイルのパス>" maximum=<サイズ> type=fixed

# 容量可変
DISKPART> create vdisk file="<VHDまたはVHDXファイルのパス>" maximum=<サイズ> type=expandable
```

## VHD/VHDXをWindowsにアタッチする

### GUI

以下のどちらか好きなほうで。

- VHD/VHDXファイルをダブルクリックする
- 「ディスクの管理」から「VHDの接続」

### コマンドライン

```
> diskpart.exe
Microsoft DiskPart version 10.0.20270.1

Copyright (C) Microsoft Corporation.
On computer: xxxxxxxx

DISKPART> select vdisk file="<VHDまたはVHDXファイルのパス>"
DISKPART> attach vdisk
```

## WSLにブロックデバイスとして認識させる

まずは、仮想ディスクのDeviceIDを知るため、`wmic.exe` を実行します。

```
> wmic.exe diskdrive list brief
Caption                 DeviceID            Model                   Partitions  Size
Crucial_CT525MX300SSD4  \\.\PHYSICALDRIVE0  Crucial_CT525MX300SSD4  4           525110100480
Microsoft Virtual Disk  \\.\PHYSICALDRIVE1  Microsoft Virtual Disk  0           98703360
```

仮想ディスクのDeviceID（上の例では `\\.\PHYSICALDRIVE1`）がわかったら、それを引数に指定して、
管理者権限で `wsl.exe --mount`を実行します。
Windows 10 ビルド20211以降が必要です。

```:管理者権限
> wsl.exe --mount \\.\PHYSICALDRIVE1 --bare
```

## WSLでフォーマットする

```
$ lsblk
NAME MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda    8:0    0  256G  0 disk
sdb    8:16   0  100M  0 disk
sdc    8:32   0  256G  0 disk /
```

この例では`sdb`が仮想ディスクです。（最初に作成したサイズで、マウントもされていないので）

```
$ sudo parted
GNU Parted 3.2
Using /dev/sda
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) select /dev/sdb
Using /dev/sdb
(parted) mklabel gpt
(parted) mkpart <任意の名前> 0% 100%
(parted) quit
Information: You may need to update /etc/fstab.
```

```
$ lsblk
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda      8:0    0  256G  0 disk
sdb      8:16   0  100M  0 disk
└─sdb1   8:17   0  100M  0 part
sdc      8:32   0  256G  0 disk /

$ sudo mkfs.ext4 /dev/sdb1
mke2fs 1.44.1 (24-Mar-2018)
/dev/sdb1 alignment is offset by 3072 bytes.
This may result in very poor performance, (re)-partitioning suggested.
Discarding device blocks: done
Creating filesystem with 102364 1k blocks and 25688 inodes
Filesystem UUID: abdf93e3-3f0f-4f58-9368-a9fce9f7cf08
Superblock backups stored on blocks:
        8193, 24577, 40961, 57345, 73729

Allocating group tables: done
Writing inode tables: done
Creating journal (4096 blocks): done
Writing superblocks and filesystem accounting information: done
```

## WSLでマウントする

```
$ sudo mkdir /mnt/vhd
$ sudo mount /dev/sdb1 /mnt/vhd
```

## WSLに認識させたディスクを外す

```
> wsl.exe --unmount \\.\PHYSICALDRIVE1
```