WSLにデータ移行用の仮想ディスク（VHDX）をマウントする

今回は、WSL（Windows Subsystem for Linux）で使用するためのVHDXファイルの作成から、そのフォーマット、マウントまでの手順を詳しく解説します。これを使えば、WSLの環境間でデータを共有したり、WSLのストレージを拡張したりできます。では早速始めましょう！

## VHDXファイルとは？

VHDXは「Virtual Hard Disk」の拡張版で、Windows環境で使われる仮想ディスクのフォーマットです。WSLでこれをマウントすることで、WSLのデータを効率よく移行できるようになります。

## 事前準備

始める前の事前要件は下記の通り。

- Windows 10 ビルド20211以降またはWindows 11を使用していること
- WSL 2がインストールされていること（WSL 1では使えません！）
- 管理者権限のあるアカウントでログインしていること

それでは実際の手順に進みましょう！

## 1. VHDXファイルの作成方法

VHDXファイルを作成するには、PowerShellとdiskpartの2つの方法があります。個人的にはPowerShellの方が簡単でおすすめです。

### 方法1: PowerShellを使った作成（おすすめ）

1. まず、管理者権限でPowerShellを開きます。スタートメニューで「PowerShell」と入力し、「管理者として実行」を選びましょう。

2. 次のコマンドを実行してVHDXファイルを作成します

```powershell
New-VHD -Path "C:\WSL_Disks\MyDataDisk.vhdx" -SizeBytes 50GB -Dynamic
```

このコマンドの意味は・・・

- `-Path` には作成したいVHDXファイルの保存先を指定します。ディレクトリは事前に作成しておく必要があります。
- `-SizeBytes` でディスクサイズを指定します。50GBや100GBなど、必要なサイズを設定してください。
- `-Dynamic` オプションをつけると、可変容量のVHDXが作成されます。これはデータが増えるにつれて自動的にサイズが拡張されるタイプで、ストレージを効率的に使えます。

もし固定容量のVHDXが必要な場合は、`-Dynamic`の代わりに`-Fixed`を使います（または何も指定しない）。固定容量は最初から指定したサイズ分のストレージを占有しますが、パフォーマンスが若干良くなる場合があります。

### 方法2: diskpartを使った作成

PowerShellが苦手な方は、diskpartコマンドを使っても同様のことができます。

1. 管理者権限でコマンドプロンプトかPowerShellを開きます。

2. `diskpart`と入力して、diskpartユーティリティを起動します。

3. 次のコマンドを順に実行します。

```
create vdisk file="C:\WSL_Disks\MyDataDisk.vhdx" maximum=51200 type=expandable
exit
```

ここでの`maximum=51200`は50GBをMB単位で指定したものです（50×1024=51200）。
`type=expandable`は可変容量、`type=fixed`は固定容量を意味します。

## 2. VHDXファイルのフォーマット

さて、ここまでで空のVHDXファイルが作成できました。でも、このままでは使えません。Linuxで利用するためのファイルシステムでフォーマットする必要があります。

WSLでLinuxファイルシステム（主にext4）としてフォーマットするには、下記の手順を実施します。

1. 作成したVHDXを「生のディスク」としてWSLにマウントします。管理者権限のPowerShellで下記を実行します。

```powershell
wsl --mount "C:\WSL_Disks\MyDataDisk.vhdx" --vhd --bare
```

`--bare`オプションはファイルシステムをマウントせず、ただディスクデバイスとしてWSLに認識させるためのものです。

2. 次にWSLを起動します。Ubuntuなどのディストリビューションを開いてください。

3. WSL内で、新しく追加されたディスクデバイスを確認します。

```bash
lsblk
```

出力は以下のようになるでしょう。

```
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda      8:0    0  256G  0 disk 
└─sda1   8:1    0  256G  0 part /
sdb      8:16   0   50G  0 disk 
```

ここで`sdb`（または`sdc`など、環境によって異なる）が新しく追加されたディスクです。これにはまだファイルシステムがありません。

4. 次に、このディスクをext4形式でフォーマットします。

```bash
sudo mkfs.ext4 /dev/sdb
```

⚠️ **重要な注意**: デバイス名（`/dev/sdb`など）を間違えると、他のディスクのデータが失われる可能性があります！必ず`lsblk`で確認したデバイス名を使用してください。

5. フォーマットが完了したら、WSLを終了し、PowerShellで以下のコマンドを実行してアンマウントします。

```powershell
wsl --unmount "C:\WSL_Disks\MyDataDisk.vhdx"
```

これでVHDXファイルがext4形式でフォーマットされ、WSLで利用可能になりました！

## 3. VHDXファイルのマウント

フォーマット済みのVHDXファイルをWSLにマウントします。

1. 管理者権限のPowerShellで次のコマンドを実行します。

```powershell
wsl --mount "C:\WSL_Disks\MyDataDisk.vhdx" --vhd --type ext4
```

`--type ext4`オプションは、VHDXがext4形式でフォーマットされていることをWSLに伝えます。通常は自動検出されますが、明示的に指定しておくと確実です。

2. WSLディストリビューションを開き、マウントポイントを確認します。

```bash
df -h
```

マウントされたVHDXは通常、`/mnt/wsl/`ディレクトリ以下にマウントされます。

```
Filesystem      Size  Used Avail Use% Mounted on
/dev/sdb         50G   24K   47G   1% /mnt/wsl/sdb
```

このマウントポイント（例：`/mnt/wsl/sdb`）にアクセスすれば、VHDXファイル内のデータを利用できます！

3. 使い終わったら、管理者権限のPowerShellに戻り、以下のコマンドでアンマウントします。

```powershell
wsl --unmount "C:\WSL_Disks\MyDataDisk.vhdx"
```

## 便利な使い方のヒント

### マウントポイントのシンボリックリンク作成

毎回`/mnt/wsl/sdb`のような長いパスを入力するのは面倒です。WSL内でシンボリックリンクを作成すると便利です。

```bash
sudo ln -s /mnt/wsl/sdb /data
```

これで、`/data`という短いパスでアクセスできるようになります。

### 自動マウントの設定

WSLの起動時に自動的にVHDXをマウントする標準機能はありませんが、簡単なスクリプトで実現できます。たとえば、Windowsのタスクスケジューラを使って、ログイン時に管理者権限でマウントコマンドを実行するバッチファイルを作成する方法があります。

## トラブルシューティング

### マウントできない場合

- WSLが完全に停止していることを確認：`wsl --shutdown`
- VHDXファイルが他のプロセスで使用されていないか確認
- パスに日本語や空白がないか確認（あれば英数字のみのパスに移動）

### アクセス権限の問題

WSL内でファイルにアクセスできない場合は、マウントポイントの所有者と権限を適切に設定します。

```bash
sudo chown -R your-username:your-username /mnt/wsl/sdb
sudo chmod -R 755 /mnt/wsl/sdb
```

## まとめ

これで、WSL用のVHDXファイルを作成、フォーマット、マウントする方法がわかりましたね！この技術を使えば、WSLとWindows間でのデータ共有がとても簡単になります。また、WSLのデフォルトファイルシステムとは別に大容量のストレージを追加することもできるため、開発環境の構築にも役立つでしょう。

ぜひ試してみてください！何か質問があればコメントで教えてくださいね。