LoginSignup
0
0

finch vm start で "WSL_E_USER_VHD_ALREADY_ATTACHED" が発生したら

Last updated at Posted at 2024-02-05

確認環境

  • finch: v1.1.1
  • WSL: 2.0.14.0
    • kernel: 5.15.133.1-1

論よりコード

finch vm startWSL_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 removefinch 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]

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0