QEMU Arm で PCI カードをパススルーする方法は?

QEMU Arm で PCI カードをパススルーする方法は?

vexpress-a9 ボードをシミュレートして、QEMU 上の PCI WiFi アダプターにアクセスしようとしています。

私がフォローしているのはこれホスト マシンのパススルー PCI カードを qemu-kvm で実行されているゲスト マシンと共有するチュートリアル。ただし、qemu-system-arm には適用できないと思います。

  • vexpress-a9 で qemu-system-arm を使用して PCI をパススルーすることは可能ですか?
  • ゲスト OS で PCI カードを USB デバイスとしてアクセスする方法はありますか? または、ゲスト OS でホスト USB デバイスとしてアクセスする方法はありますか?

私がやっていることは次のとおりです:

$ qemu-system-arm \
-kernel ./zImage \
-M vexpress-a9 \
-cpu cortex-a9 \
-m 1024 \
-smp 2 \
-serial stdio \
-append "root=/dev/mmcblk0p1 rootfstype=ext4 rw raid=noautodetect console=ttyAMA0,38400n8 rootwait devtmpfs.mount=0 vmalloc=256MB mem=1024M" \
-sd ./vexpress-quantal.img

答え1

このセクションで概説した手順を必ず実行してください。13.3.4. PCI パススルー、ドキュメントのタイトル:第13章 qemu-kvm を使用した仮想マシンの実行

抜粋

手順13.1 PCIパススルーの設定

  1. ホストの実行中のカーネルで CONFIG_DMAR_DEFAULT_ON が設定されていることを確認します。

    $ grep CONFIG_DMAR_DEFAULT_ON /boot/config-`uname -r`
    

    このオプションが設定されていない場合は、ブートローダー設定を編集し、intel_iommu=on (Intel マシン) または iommu=pt iommu=1 (AMD マシン) を追加します。その後、ホストマシンを再起動します。

  2. IOMMU がホスト上でアクティブに有効化され、認識されていることを確認します。Intel マシンでは dmesg | grep -e DMAR -e IOMMU を、AMD マシンでは dmesg | grep AMD-Vi を実行します。出力がない場合は、ハードウェアが IOMMU (VT-d) をサポートしているかどうかを慎重に確認し、BIOS で有効になっていることを確認します。

  3. ゲストに割り当てるホスト PCI デバイスを識別します。

    tux@vmhost:~> lspci -nn
    [...] 00:1b.0 Audio device [0403]: Intel Corporation 82801H (ICH8 Family) \
    HD Audio Controller [8086:284b] (rev 02) [...]
    Note down the device (00:1b.0) and vendor (8086:284b) ID.
    
  4. デバイスをホスト カーネル ドライバーからアンバインドし、PCI スタブ ドライバーにバインドします。

    tux@vmhost:~> modprobe pci_stub
    tux@vmhost:~> echo "8086 284b" > /sys/bus/pci/drivers/pci-stub/new_id
    tux@vmhost:~> echo "0000:00:1b.0" > /sys/bus/pci/devices/0000:00:1b.0/driver/unbind
    tux@vmhost:~> echo "0000:00:1b.0" > /sys/bus/pci/drivers/pci-stub/bind
    
  5. 次に、PCI デバイスが割り当てられた VM ゲストを実行します。

    qemu-kvm [...] -device pci-assign,host=00:1b.0
    

QEMU/KVM ARM サポート

バージョン 1.5 および 1.6 の変更ログによると、ARM は次の方法でサポートされます。

1.5

  • このリリースには、ARM アーキテクチャ用の KVM の初期サポートが含まれています。これには、3.9 以上の Linux カーネルと Cortex-A15 CPU が必要です。
  • Zynq ボードは SD ホスト コントローラー インターフェイスを提供します。
  • VersatilePB および Realview ボードの PCI コントローラ モデルは、機能が大幅に改善されました (MMIO BAR サポートと正しい PCI IRQ マッピングを含む)。Linux カーネルは現在これを利用していませんが、古い壊れた QEMU の動作を期待するカーネルを自動検出し、それにフォールバックします。(古い IRQ 動作は、どうしても必要な場合は、「-global versatile_pci.broken-irq-mapping=1」で強制できます。)
  • Thumb モードでの SRS 命令の誤った処理が修正されました。
  • ARM ターゲットの TCG エミュレーションのパフォーマンスは、以前のリリースよりも向上しています。
  • vexpress-a15 および vexpress-a9 モデルで移行と VM の保存/読み込みが正しく機能するようになりました。

1.6

  • ロード-取得/ストア-リリース用の 32 ビット ARMv8 LDA/STL 命令がサポートされています (-cpu any の場合のみ)。残りの新しい v8 命令は将来のリリースでサポートされる予定です。
  • vexpress-a9 および vexpress-a15 ボードには、virtio-mmio トランスポートを介して virtio デバイスを実験的にサポートする機能があります。x86 システムで使用される virtio コマンドラインは、PCI virtio デバイスを作成するため機能しないことに注意してください。代わりに、「virtio-blk-device」、「virtio-net-device」などのデバイスを使用してください。この機能は将来のリリースで変更される可能性があることに注意してください。
  • -initrd オプションは、U-Boot ヘッダー付きの RAM ディスクを受け入れるようになりました。
  • Calxeda ECX-2000 / Midway システムのモデルがサポートされるようになりました (「midway」)。

関連情報