確認環境
- finch: v1.1.1
- WSL: 2.0.14.0
- kernel: 5.15.133.1-1
論よりコード
finch vm start
で WSL_E_USER_VHD_ALREADY_ATTACHED
が発生したら...
dir $env:LOCALAPPDATA\.finch\.disks\*.vhdx
wsl --unmount $env:LOCALAPPDATA\.finch\.disks\{見つけたvhdxファイル}
これで finch vm start
できるはずです。
例:
dir $env:LOCALAPPDATA\.finch\.disks\*.vhdx
#
# Directory: C:\Users\***\AppData\Local\.finch\.disks
#
#Mode LastWriteTime Length Name
#---- ------------- ------ ----
#-a--- 2024/02/06 1:28 3359637504 6b456cb759bdbc3f.vhdx
wsl --unmount $env:LOCALAPPDATA\.finch\.disks\6b456cb759bdbc3f.vhdx
#この操作を正しく終了しました。
概要
Finch の Windows 実装は、containerd 等が入った WSL ディストリビューション "lima-finch" を WSL 上で動かして実現しています。vhdx ファイルは "lima-finch" そのものです。そのため lima-finch ディストリビューションを動かしておく必要があります。
※ ちなみに finch コマンドは、lima-finch 上の各 daemon とソケット通信(sshかな?)する仕組みです。
しかし v1.1.1では finch vm init
もしくは finch vm start
で起動した lima-finch ディストリビューションは、実行後にプロンプトこそ表示されますがフォアグラウンドで動いている状態です。すなわち、当該ウィンドウを閉じると WSL ディストリビューションが終了してしまいます。
※ Bash の &
付きで起動したプロセスと同様です。
lima-finch ディストリビューションの正しい終了の仕方は finch vm stop
です。この中では wsl.exe --unmount *.vhdx
を行っています。逆に finch vm start
では、unmount されていることを前提に vhdx ファイルをマウントを試みます。
ウィンドウを閉じて終了をすると unmount されず、そこに finch vm start
の mount が実行されたところで失敗 (WSL_E_USER_VHD_ALREADY_ATTACHED
) しているのが、今回の背景です。
finch vm start
# time="2024-02-06T01:28:46+09:00" level=info msg="attaching disk at path: C:\\Users\\****\\AppData\\Local\\.finch\\.disks\\6b456cb759bdbc3f.vhdx"
# time="2024-02-06T01:28:46+09:00" level=fatal msg="could not attach persistent disk: failed to attach disk: exit status 0xffffffff, command output: ディスク '\\\\?\\C:\\Users\\****\\AppData\\Local\\.finch\\.disks\\6b456cb759bdbc3f.vhdx' を WSL2 にアタッチできませんでした: Error: 0x80040312\r\nError code: Wsl/Service/AttachDisk/MountVhd/WSL_E_USER_VHD_ALREADY_ATTACHED\r\n"
そこで finch vm stop
が行うはずだった unmount をすることで、finch vm remove
と finch vm init
をせずとも回復できるというのが今回の趣旨です。
finch vm start
時の wsl.exe --mount
のエラーハンドリングを強化してあげれば解決できそうなので、issue を立てておこうと思います。
どうやって調べた?
--debug
付きでの実行と、ソースコード
気になる
wsl.exe --mount
を実行しているのは disk_windows.go/EnsureUserDataDisk だが、その呼び出し元 を見ると TODO: don't run this on Windows
って書いてある😂
あとがき
このくらいは、調べておきたいし、issue を立てるあたりまでやっておきたいね。
[EoT]