質問

質問

PCI パススルーを使用して、古いビデオ カード (Radeon 4770) を仮想マシンに接続しようとしています。Debian Linux (Wheezy、3.2.0-4-amd64) ホストで仮想マシンを実行するために Linux-KVM を使用しています。

質問

明確に言うと、Linux KVMでPCIパススルーを実装するための正しい「パス」が何なのか私にはわかりません。この段階では、正しいアクションは次のようになると思います。カーネルソースの「バスオプション(PCIなど)」セクションに、、CONFIG_DMARおよびCONFIG_DMAR_DEFAULT_ONを追加して再コンパイルします。CONFIG_PCI_STUB

しかし、よく分からないこれが再コンパイルする前に必要な追加項目の完全なリストである場合。またはカーネルの再コンパイルが必要な場合--もっと簡単な方法があるかもしれませんか?

私が参考にしたガイドの中で、linux-kvm.orgコンパイルが必要であることが明示的に記載されています。Linux-KVM はすでにインストールされており、ハイパーバイザーとして機能しています。

研究

現時点では、私の問題はカーネルに関連していると思います。主なリソースは、linux-kvm.orghttp://www.linux-kvm.org/page/How_to_assign_devices_with_VT-d_in_KVMただし、ディストリビューション固有の (一見) わずかに異なる方法を示す他のリソースも見つかりました。

フェドーラ--https://docs.fedoraproject.org/en-US/Fedora/13/html/Virtualization_Guide/chap-Virtualization-PCI_passthrough.html

SUSE - 「openSUSE: KVM による仮想化」(関連性が低く、リンクが 2 つに制限されているため、リンクは省略されています)

Fedoraガイドは、setseboolRedHat特有の参照まで機能します。SUSEガイドでは、グラフィックスカードの割り当てはSUSEではサポートされていないと示されていますが、CONFIG_DMAR_DEFAULT_ON/boot/config-`uname -r`内で文字列を見つける必要があると示されているため、これも参照しています。linux-kvm.orgサイトでは も参照されているCONFIG_DMAR_DEFAULT_ONため、これは共通かつ必要なコンポーネントであると思われます。

注記:Fedora または Debian のガイドにはグラフィック カードの制限は見つかりませんでした。参照されている SUSE ドキュメントは 2006 年から 2013 年のものです。

CONFIG_DMAR_DEFAULT_ON私のシステムでは、/boot/config-`uname -r` で見つけることができません。さらに調査したところCONFIG_DMAR、、、CONFIG_DMAR_DEFAULT_ONCONFIG_PCI_STUBLinuxカーネルの設定項目であり、の指示に関連するものであることがわかりました。linux-kvm.orgそのため、ホストのカーネルをこれらの 3 つの (少なくとも) カーネル構成項目で再コンパイルする必要があると考えています。 をintel_iommu=onカーネル パラメータとしてホスト OS にブートするだけでは不十分であるようです。

GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on"

VT-d/IOMMU/KVM サポートの確認

私の調査によると、PCI パススルーには VT-d に対する CPU とマザーボードの両方のサポートが必要であることがわかりました。

VT-d

私のプロセッサは、非kINTEL i7-3770 (ark.intel.com/products/65719 より) は、VT-d をサポートします。

Intel® バーチャライゼーション・テクノロジー(ダイレクト I/O 向け)(VT-d)‡ はい

私の Asrock Z77 Extreme4 マザーボードも VT-d をサポートしています (ユーザー マニュアルの 62 ページを参照)。

VT-d Intel ® VT-d テクノロジー (Intel ® Virtualization Technology for Directed I/O) を有効または無効にするには、これを使用します。この機能のデフォルト値は [無効] です。

IOMM

私のシステムが IOMMU をサポートしていることを確認しました。

dmesg | grep -e DMAR -e IOMMU | grep -e "DRHD base" -e "enabled"
[    0.000000] Intel-IOMMU: enabled

仮想化

PCI パススルー サポートとは別に、KVM がインストールされ、機能しています。

lsmod | grep kvm
kvm_intel             121968  0 
kvm                   287749  1 kvm_intel

私はマザーボードのBIOSでVT-dが有効になっていることを確認しました。そのため、VT-dの使用を妨げるハードウェア/BIOSの問題は疑っていません。いずれにしても、ビデオカードをホストから切り離して仮想マシンに再割り当てすることができません

終わりに

最後に、次のテストも試してみたことを述べておきます。

echo "8086 10b9" \> /sys/bus/pci/drivers/pci-stub/new_id
echo "0000:01:00.0" \> /sys/bus/pci/devices/0000:01:00.0/driver/unbind
echo "0000:01:00.0" \> /sys/bus/pci/drivers/pci-stub/bind
echo "8086 10b9" > /sys/bus/pci/drivers/pci-stub/remove_id
kvm -m 512 -boot c -net none -hda debian-7.1.0-amd64-netinst.iso -device pci-assign,host=01:00.0

ターゲット VM を作成しようとした後、次のエラーが発生しました。

Failed to assign device "(null)" : Device or resource busy
*** The driver 'pci-stub' is occupying your device 0000:01:00.0.
***
*** You can try the following commands to free it:
***
*** $ echo "8086 10b9" > /sys/bus/pci/drivers/pci-stub/new_id
*** $ echo "0000:01:00.0" > /sys/bus/pci/drivers/pci-stub/unbind
*** $ echo "0000:01:00.0" > /sys/bus/pci/drivers/pci-stub/bind
*** $ echo "8086 10b9" > /sys/bus/pci/drivers/pci-stub/remove_id
***
kvm: -device pci-assign,host=01:00.0: Device 'pci-assign' could not be initialized

これは、ホストが依然としてビデオ カードの制御を放棄しないためであり、カーネルが適切な構成項目でコンパイルされていないことが原因であると考えられます。

これは私にとっては新しい分野なので、経験不足をお許しください。大いにたとえそれが単に私が正しい方向に進んでいるという確認であっても、どんなフィードバックでも歓迎します。明らかな見落としや考えすぎがあったら教えてください。私の質問に対する建設的な批判も歓迎します。私が「あなたを助ける」のに十分な情報を提供していない場合(または私が含めすぎている場合)はお知らせください。私の質問が明確になり、答えやすくなるよう喜んでお手伝いします。

よろしくお願いします、

答え1

PCIパススルーに関する記事ではカーネル設定が必要であると述べられている

make menuconfig
set "Bus options (PCI etc.)" -> "Support for DMA Remapping Devices" to "*"
set "Bus options (PCI etc.)" -> "Enable DMA Remapping Devices" to "*"
set "Bus options (PCI etc.)" -> "PCI Stub driver" to "*"

optional setting: 
set "Bus options (PCI etc.)" -> "Support for Interrupt Remapping" to "*"

ただし、これらのオプションは「バス オプション」の下には見つからず、「デバイス ドライバー --> IOMMU ハードウェア サポート」の下にありました。

前述の記事に従った後も、ゲスト マシンの起動に問題があり、「デバイス 'pci-assign' を初期化できませんでした」というエラーが表示されます。次のコマンドを実行することで、起動できました。

 echo 1 > /sys/module/kvm/parameters/allow_unsafe_assigned_interrupts

それでも問題が解決しない場合は、次の記事を参照してください。http://spica-and-android.blogspot.com.au/2012/07/howto-kvm-passthrough.html より

関連情報