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