4
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

FreeBSD 15-STABLE + bhyve Windows 11ゲストの PCI passthroughを再挑戦

Last updated at Posted at 2025-12-15

1. BhyveとPCI passthroughの問題

そもそも、PCI passthroughとはなんぞやというおさらいから。

PCI passthroughとは、仮想マシンゲスト上でホスト側のPCIデバイスをそのまま見せるという仕組みです。
ホスト側ではそのデバイスをそのまま使うことは出来ず、ゲスト側のOSで認識して利用することが出来ます。これを利用すると、FreeBSD用のドライバがないデバイスも、ドライバがあるOSをゲストで使うとデバイスを利用出来るようになります。

例えばUSBホストコントローラをパススルーすると、ゲスト側でUSBデバイスが使えるようになります。多くのUSBデバイスはFreeBSD用のドライバが用意されていないないことも多いので、有効利用出来るというわけです。

そんなわけで、当時はWindows 10 をゲストにしており、USB ホストコントローラの
PCI passthrough も特に問題なく動作していました。
その時書いていた記事がこれ。

Windows 10では問題なく使えていたPCI passthroughですが、Windows 11になって、起動時にハングアップするようになっていました。その時の記事がこれ。

ゲストをWindows11へアップデートしたところ、使えなくなってしまったのです。
しかし、先日15-STABLEに修正パッチが入ったのを見ました。
早速Windows 11で使えるようになったのか確かめようと思います。

2. 実行環境

2.1 ハードウェア

昔こういう記事を書きました。この時のPCをまだ使っています。
メモリだけ128GBになっています。後は基本同じ。

2.2 FreeBSD 15-STABLE

パッチの詳細は後述しますが、とにかくパッチは15-STABLEに入っており、15.0-RELEASEには取り込まれませんでした。これまでは14.3-STABLEを使用していましたが、せっかく15.0-RELEASEも出たので、ここで15-STABLEにしようと思い立ち、アップデートしました。

3. bhyve改善パッチ

https://forums.freebsd.org/threads/bhyve-vm-stuck-when-passthru-enabled.92854/
こちらの記事から、パッチが紹介されていました。

https://reviews.freebsd.org/D37972
そのパッチがこれ。

そして、/usr/srcでgit logを確認するとこのように、修正が入っていることが確認出来ます。

# git log sys/amd64/vmm/vmm.c
commit 300a8977bcfd2f43bc6df81d9bdad6b79a740729
Author: Mark Johnston <markj@FreeBSD.org>
Date:   Fri Oct 17 13:09:38 2025 +0000

    vmm: Fix a deadlock between vm_smp_rendezvous() and vcpu_lock_all()

説明はかなり長いので詳細は省略しますが、要するに以下のような
vCPU 間のデッドロックを防ぐ修正です。

vCPU A: vm_smp_rendezvous() を開始
        → 他の全 vCPU のコールバック完了を待つ

vCPU B: vcpu_lock_all() に入る
        → vCPU A が idle になるのを待つ

15-STABLEに入っているので、難しい作業は必要ありません。
git pullでソースを15-STABLEの最新にした後、make buildworld && make buildkernelやって、make installkernel, make installworldをやればいいだけです。
実際はetcupdateなど必要ですが、この記事では省略します。詳しく知りたい人はFreeBSD handbookなどを参照してください。

# uname -rv
15.0-STABLE FreeBSD 15.0-STABLE stable/15-ffd47a4bc671 GENERIC

という感じで15-STABLEになったら、PCI passthroughを設定して早速確認してみます。

4. PCI passthroughデバイスをWindows 11で認識させる

現在もbhyveの制御にはvm-bhyveパッケージを利用しています。
現時点での最新は1.7.0_1ですね。
以降の説明はvm-bhyveを使っていることを前提に書くので、よく分からない場合は公式サイト (https://github.com/churchers/vm-bhyve) を見るか、検索で探してみてください。

4.1 ホスト側の設定

まずは、パススルーデバイスとしてホスト側から予約します。

# vm passthru
DEVICE     BHYVE ID     READY        DESCRIPTION
(中略)
ix0        1/0/0        No           Ethernet Controller X550
ix1        1/0/1        No           Ethernet Controller X550
nvme0      2/0/0        No           E18 PCIe4 NVMe Controller
ppt0       3/0/0        Yes          Killer E3000 2.5GbE Controller
xhci1      4/0/0        No           ASM3042 USB 3.2 Gen 1 xHCI Controller

私の設定では既に、Killer E3000 2.5GbE Controllerがパススルーデバイスとして設定されていますが、その後のASM3042 USB 3.2 Gen 1 xHCIの方もパススルーデバイスとして設定します。以前は再起動しなきゃダメかなと思いましたが、devctl コマンドで PCI デバイスのドライバを切り替えられることが分かりました。詳しくはman vmmを見てください。

# devctl set driver -f pci0:4:0:0 ppt
# vm passthru
DEVICE     BHYVE ID     READY        DESCRIPTION
(中略)
ppt0       3/0/0        Yes          Killer E3000 2.5GbE Controller
ppt1       4/0/0        Yes          ASM3042 USB 3.2 Gen 1 xHCI Controller

これで、ホスト側のドライバxhciが開放されて、パススルーデバイスppt1として認識されました。起動時からpptデバイスにするには/boot/loader.confに書きます。これについては以前の記事を見てください。

4.2 ゲスト側の設定

vm configコマンドで仮想マシンの設定を変更します。最後のwindowsは設定ファイルの名前なので、環境に応じて変わります。

# vm config windows
passthru0="3/0/0"
passthru1="4/0/0"

これでゲストからパススルーデバイスを使う設定ができました。
早速起動してみましょう。

# vm start windows
Starting windows
  * found guest in /data/vm/windows
  * booting...

以前はいきなりハングアップしてどうしようもなかったですが、無事に起動することが確認出来ました。

4.3 しかし問題が...

Windows側のデバイスマネージャーで見ると異変が...

スクリーンショット 2025-12-15 185725.png

ネットワークアダプターのKiller E3100G 2.5 Gigabit Ethernet Controllerの方は問題ありません。ただ、実際ケーブル接続してテストまではしてないのですが...
問題は、ASMedia USB 3.1 eXtensible Host Controllerの方。△に!マークがついており、動作していません。

スクリーンショット 2025-12-15 190227.png

無情にも「問題が発生したのでこのデバイスは停止しました。(コード43)」となっています。ゲストを何度か再起動もしてみましたが、改善せず。passthroughで見せているデバイスが、中途半端な情報をゲストに見せており、完璧な動作になっていないのかというところですが、現時点では原因は分からず、お手上げ...

ホストで使っているマザーボードはもう一つ

xhci0      0/20/0       No           Alder Lake-S PCH USB 3.2 Gen 2x2 XHCI Controller

というデバイスも載っているので、試しにこちらも使えないかと思い試しましたが、今度はこのコントローラ配下のUSB root hubに異常が発生して動作しないという現象となってしまい、結局USBのパススルーは使えないままです。

なお、これは Windows 11 側のドライバやセキュリティ強化の影響の可能性もあり、bhyve 側の修正だけでは解決しない問題の可能性もあります。

5. おわりに

bhyveゲストでWindows 11を動かし、PCI passthroughを使うとハングアップするという事象そのものは解消しました。しかし、USBのパススルーは現状では利用出来ませんでした。他のデバイスなら大丈夫かもしれませんが、今のところゲストで使いたいデバイスがUSBしかないので、困ったものです。

引き続き、原因が分かったらまた記事を書くと思います。

4
1
4

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
4
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?