今回は、Proxmox 上の Windows 11 VM 間で WinDbg を使ったリモートカーネルデバッグが動作しなかった問題の解消方法をまとめます。
最終的に、今回は以下の設定を行うことで Proxmox 上の仮想マシン間でリモートカーネルデバッグが成功するようになりました。
- KDNET が本来使うべき NIC の
busparams=b.d.fを、kdnet.exe を使用せずに bcdedit で明示的に指定する
bcdedit /debug on
bcdedit /dbgsettings net hostip:192.168.10.20 port:50000 key:<Key> nodhcp
bcdedit /set "{dbgsettings}" busparams <確認した busparams>
# 設定の確認
bcdedit /dbgsettings- ターゲットマシンの起動に
qm start <VMID> --force-cpu hostコマンドを使用することで、デフォルトで構成されている Hyper-V Enlightenments の設定を使用せずにマシンを起動する
もくじ
環境
今回の環境は以下の通りです。
- Proxmox VE 上で構築した Windows 11 25H2 VM(ホスト + ターゲット)
- ホストとターゲットは同じブリッジに接続しているデバイス
- ホストとターゲットのネットワークインターフェースは、virtio ではなく E1000 を選択しておく
発生した問題と原因っぽい点
ネットワーク経由でカーネルデバッグを行う と同じ手順で kdnet.exe でネットワークデバッグを構成した後にホスト側で WinDbg を待ち受けにしても、ターゲット再起動後に接続しない状態でした。
windbg.exe -k net:port=50000,key=<Key>ターゲット側では kdnet.exe を実行した際に Network debugging is supported とは表示されていたものの、以下のようなエラーコード 0xC0000182 を伴うエラーも表示されました。
KDNET transport initialization failed during a previous boot. Status = 0xC0000182.
NIC hardware initialization failed.
KDNET did not successfully receive any packets during init.
KDNET did not successfully send any packets during init.これはどうもターゲットからのデバッグ用の通信自体が発生していないのが原因のようで、諸々調べていったところ以下の記事を見つけました。
参考:libvirt的Hyper-V虚拟化或导致Windows KDNET初始化失败 - Silver
この記事によると、Proxmox が使用している qemu では Windows のゲスト用に Hyper-V Enlightenments というマシンに Hyper-V 上で稼働するマシンであると認識させる機能があり、これにより実際には Hyper-V を使用していない仮想マシンでは KDNET の動作に影響がでるらしいとのことです。
参考:Hyper-V Enlightenments — QEMU documentation
(詳しく調べられていないのですが、どうも Hyper-V 上のマシンでは KDNET の動きが変わるらしく、実際には Hyper-V を使用していない仮想マシンでこのような動作になるとネットワークデバッグが上手く動かなくなる場合があるようです。)
メモ:Proxmox で確認したこと
まず以下のコマンドで、Proxmox で VM を起動する際のオプションを確認しました。
qm showcmd <VMID> --prettyその結果、以下のようにいくつかの hv_ から始まるオプションが CPU フラグに含まれていることがわかりました。
この CPU フラグですが、どうやら Proxmox でマシンの種類を Windows に設定している場合、デフォルトのフラグとして自動的に追加されるようです。
参考:Tricki problem with Windows and nested Virtualization. | Proxmox Support Forum
この起動時のフラグについては設定ファイルなどを変更しても変えることができず、またマシンの種類を Windows 以外に変更すると仮想マシンが起動しなくなってしまったので最後まで解決策がわかりませんでした。
しかし、とりあえず qm start <VMID> --force-cpu host のように --force-cpu を使用すると、起動時の CPU args を強制できることがわかったため、ターゲットマシンの起動時にはこのコマンドを使用するようにすることで、無事にカーネルデバッグを行うことができるようになりました。
参考:qm(1)
まとめ
ハイパーバイザーや Windows の KDNET の内部動作に関する知見がなくスッキリした解決には至りませんでしたが、ひとまず Proxmox 環境でネットワークカーネルデバッグができるようにはなったので、メモ書きとして残しておきます。