That's Done!

thatsdone's (mostly technical) memorandum

[ja] Generic qemu notes


Zephyr qemu notesでZephyrでのqemu系targetの話を書きましたが、qemu側の話。

virtio-can関連

最近ポストしている記事でCANの話が多くあるように、仕事でCANを使っています。 都合でハイパーバイザ上でvirtioベースでCANのトラフィックを流したいという事情があってあれこれ試したメモ。

qemu virtio-can backend

単純に考えると qemu の仮想デバイスとして作ってやることになります。 OpenSynergyが公開していて、以下が最新だと思われます。

https://github.com/OpenSynergy/qemu/tree/virtio-can-spec-rfc-v3

上記は公開が2023/4で、ビルドはすなおに通りますが、残念ながらqemuのベースは6.0.1になります。

なので、qemuのmasterに使えるかなと思ってportしてみたものが以下です。

https://github.com/thatsdone/qemu/tree/virtio-can-port

'25/12時点で、多少のずれはありますがそのまま適用でき、ビルドもすんなり通りました。

いずれも公式の既存のCANデバイスのページ

https://www.qemu.org/docs/master/system/devices/can.html

の記述を参考に、以下のようにqemu-system-xxxにパラメータを渡してやると virtio-can deviceを有効化できます。

      -object can-bus,id=canbus0 \
      -device virtio-can-pci,canbus=canbus0 \
      -object can-host-socketcan,id=canhost0,if=vcan0,canbus=canbus0

上記の例は、ホスト側で vcan を使って vcan0 というデバイスがあるものとし、 これにゲスト側のvirtio-can deviceを接続する指定です。

Yet Another virtio-can backend

別解としてvhost-deviceを使う方法があります。

このへんにありますが、まだ試せていません。

  • https://crates.io/crates/vhost-device-can
  • https://github.com/rust-vmm/vhost-device/tree/main/vhost-device-can