WSL2の仮想ディスク(VHDX)の移行と最適化手法

WSL2の仮想ディスク(VHDX)の移行と最適化手法

WSL2のファイルシステムはVHDX(仮想ハードディスク)を通じて実現されており、デフォルトではシステムドライブ(Cドライブ)に配置される。例えば、Ubuntu-22.04のVHDXは以下のパスに保存される。

C:\Users\youruser\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu22.04LTS_79rhkp1fndgsc\LocalState\ext4.vhdx

大きなファイルを別ドライブに配置していても、長期間の運用でこのVHDXファイルは数十GBに膨らむことがある。システムドライブの容量を圧迫するため、VHDXを別ドライブに移行する必要がある。

1. 全インスタンスの停止

移行中のデータ破損を防ぐため、事前にすべてのWSLインスタンスをシャットダウンする。

wsl --shutdown
wsl -l -v
  NAME            STATE     VERSION
  Debian          Stopped   2
  Ubuntu-22.04    Stopped   2

2. インスタンスのエクスポート

登録済みのWSLインスタンスをtarアーカイブとしてエクスポートする。容量に余裕のあるドライブ(例:Eドライブ)を出力先に指定する。

wsl --export Debian E:\wsl_backup\debian_image.tar

3. 既存インスタンスの登録解除

エクスポートが完了したら、元のインスタンスを登録解除する。これによりCドライブ上のVHDXファイルが削除され、ディスク容量が解放される。

wsl --unregister Debian

4. 新しい場所へのインポート

エクスポートしたtarアーカイブを、任意のディレクトリにインポートする。

wsl --import Debian E:\wsl_instances\debian E:\wsl_backup\debian_image.tar --version 2

インポートが成功すると、指定したディレクトリに新しいVHDXファイルが生成される。

5. 動作確認

インスタンスを起動し、正常にコマンドが実行できるか確認する。問題なければ移行は完了である。

6. 既存のVHDXファイルからの直接インポート

ハードディスクの交換やパーティションのクローン後にWSLを起動すると、以下のようなアクセス拒否エラーが発生することがある。

ディスク "\\?\E:\wsl-ubuntu\ext4.vhdx" を WSL2 に接続できませんでした: アクセスが拒否されました。
エラー コード: Wsl/Service/CreateInstance/MountVhd/HCS/E_ACCESSDENIED

tarアーカイブのバックアップがない場合でも、元のVHDXファイルが手元にあれば直接インポートが可能である。この場合、--vhdオプションを使用する。

# --vhdオプションを付与して、tarではなくVHDXとしてインポート
wsl --import Debian E:\wsl_new_location E:\wsl_data\ext4.vhdx --version 2 --vhd

# デフォルトユーザーの再設定(インポート直後はrootになっているため)
debian.exe config --default-user myuser

7. VHDXの容量圧縮

WSL内でファイルを削除しても、ホストOS側のVHDXのサイズは自動的には縮小されない。不要な領域を解放するには、WSLをシャットダウンした状態でdiskpartユーティリティを使用する。

diskpart

Diskpartのプロンプトが開くので、以下のコマンドを順に実行してディスクの圧縮を行う。

select vdisk file="E:\wsl_new_location\ext4.vhdx"
attach vdisk readonly
compact vdisk
detach vdisk
exit

タグ: WSL2 VHDX diskpart Windows linux

8月2日 14:54 投稿