仮想ディスク ext4.vhdx 関連

 WSL 2 で取り扱う 仮想ディスク ext4.vhdx についての備忘録。(Windows10 Pro上での話)
※ ディストロのバージョン2の話であり、バージョン1では仮想化されていないため仮想ディスクで管理されていない。

ディストロ管理レジストリ

各ディストロは、どこで管理されているか?

 恐らく、以下のレジストリキー配下にある情報を元に各ディストロは管理されているようだ。

HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Lxss\
  <GUID 1>
  <GUID 2>
   …

 このキー直下の GUIDキーそれぞれに1つのディストロが割り当てられている。
なお、このGUIDキーの値は、ディストロのインストール時にユニークなGUID値が振られる模様。
例えば、ストア配布版のUbuntu-20.04であっても、Windows ログインユーザが異なれば GUIDキー値は異なる。

ディストロ・アーカイブからインポートすると

 仕事上、開発プロジェクト毎にディストロを分けておくと便利。
このため、ストア版Ubuntu-20.04ディストロをエクスポートし、それを開発プロジェクト用ディストロの作成に使用している。このインポート作業で、以下のようなレジストリ情報が書き込まれる。

HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Lxss\<新GUID>\
  "DistributionName"="ディストロ名"
  "Version"=dword:00000002    <<-- ディストロのVaersionとは異なる。常時 2?
  "State"=dword:00000001     <<-- Running/Stoppedとは異なる。常時 1?
  "BasePath"="\\\\?\\ext4.vhdxファイルのフォルダ(フルパス)"
  "Flags"=dword:0000000f     <<-- 何? (0xf=ver2, 0x7=ver1)
  "DefaultUid"=dword:00000000   <<-- 何?

ext4.vhdxファイルの物理フォルダ

 ext4.vhdxファイルがどの物理フォルダに存在するのか?
以下のレジストリキー値がそれ。

HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Lxss\<ディストロGUID>\BasePath

レジストリ操作による検証

 レジストリを触って色々できるか確認。なお、検証時のディストロ・ステータスはStoppedで実施した。
 検証結果として、レジストリを触ればWSL 2上で稼働するディストロの新規登録や削除、ext4.vhdxファイルのコピーや移動等での登録情報変更もできるようだ。
ディストロをわざわざtarアーカイブに落とさずに、ext4.vhdxファイルを直接操作しても何とかなるようだ。

GUIDの変更

 ディストロ管理レジストリのディストロGUIDを変更しても問題なく動作するか。

HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Lxss\{ここを変更}

 正常に動作した。

GUIDの削除

 ディストロ管理レジストリのディストロGUID以下を削除するとディストロのリストから消えるか。

HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Lxss\{GUID}   <<--このツリーを削除
その後、以下のコマンドでディストロがなくなった事を確認
PS> wsl.exe --list

 リストから消え、起動も不可である事が確認できた。

GUIDの新規作成

 ディストロ管理レジストリのディストロGUIDの削除の後、
該当する ext4.vhdx ファイルを別フォルダに移動、ディストロ管理レジストリに手動で追加登録しても問題なく動作するか。

HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Lxss\{GUID1}   <<--このツリーを削除
その後、ext4.vhdx ファイルを別フォルダに移動し、レジストリに以下のものを追加。
---
[HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Lxss\{GUID2}]
"State"=dword:00000001
"DistributionName"="新しいディストロ名"
"Version"=dword:00000002
"BasePath"="移動先フォルダ"
"Flags"=dword:0000000f
"DefaultUid"=dword:00000000
---
PS> wsl.exe --list

 リストに新しいディストロ名が加わり、動作も正常である事が確認できた。

 その他、細かいTips

ext4.vhdxファイルが削除できない

 ext4.vhdxファイルが削除できない主な原因としては、当該ディストロが稼働中(Running)であること。ただ、ディストロを停止(–terminate or –shutdown)しても削除出来ない事象が発生した。PCを再起動してもロックされたまま。
 この原因は、エクスプローラーでext4.vhdxファイルをダブルクリックしたためだと分かった。
 .vhdx 拡張子に紐づいているデフォルトのアクションが「マウント」だったため、ダブルクリックによりシステムがext4.vhdxファイルをマウントしてしまい削除できなかった。
 こうなってしまった場合には、
「ディスクの管理」から該当するディスクを探して「VHDの切断」を行えば良い。