PCIパススルーを使用して古いビデオカード(Radeon 4770)を仮想マシンに接続しようとしています。 Linux-KVMを使用して、仮想マシンをDebian Linux(Wheezy、3.2.0-4-AMD64)ホストで実行しています。
明確にするために、LinuxKVMでPCIパススルーを実装するための正しい「パス」が何であるかわかりません。この段階では、正しいアクションは、カーネルソースの「バスオプション(PCIなど)」セクションに[CONFIG_DMAR
、CONFIG_DMAR_DEFAULT_ON
、CONFIG_PCI_STUB
]を追加することだと思います。再コンパイル。
しかし、私にはわかりませんこれが再コンパイルする前に必要な追加の完全なリストであるかどうか。またはカーネルの再コンパイルが必要な場合-おそらくもっと簡単な方法がありますか?
私が参照したガイドのうち、コンパイルが必要であると明示的に言及しているのはlinux-kvm.orgだけです。 Linux-KVMはすでにインストールされており、ハイパーバイザーとして機能しています。
この時点で、私の問題はカーネルに関連していると思います。私の主なリソースはlinux-kvm.org( http://www.linux-kvm.org/page/How_to_assign_devices_with_VT-d_in_KVM )にあるガイドです。ただし、(一見)ディストリビューション固有のわずかに異なる方法を示す他のリソースを見つけました。
SUSE-「openSUSE:KVMによる仮想化」(関連性が低く、2リンクの制限があるため、リンクは省略されています)
Fedoraガイドは、RedHat固有と思われるsetsebool
を参照するまで機能します。 SUSEガイドには、グラフィックカードの割り当てはSUSEでサポートされていないことが示されていますが、/ boot/config-`uname-r`内にCONFIG_DMAR_DEFAULT_ON
文字列が必要であることが示されているため、これも参照しています。 linux-kvm.orgサイトもCONFIG_DMAR_DEFAULT_ON
を参照しているため、これは一般的で必要なコンポーネントのようです。
注: FedoraまたはDebianのガイドでグラフィックカードの制限が見つかりませんでした。参照されているSUSEドキュメントの日付は2006〜2013です。
システムの/ boot/config-`uname-r`にCONFIG_DMAR_DEFAULT_ON
が見つかりません。さらなる調査により、CONFIG_DMAR
、CONFIG_DMAR_DEFAULT_ON
、およびCONFIG_PCI_STUB
はlinux-kvm.orgの説明に関連するLinuxカーネル構成アイテムであることが示唆されています。そのため、これらの(少なくとも)3つのカーネル構成項目を使用して、ホストのカーネルを再コンパイルする必要があると思います。 Host-OSのカーネルパラメータとしてintel_iommu=on
を使用して起動するだけでは不十分なようです。
GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on"
私の調査によると、PCIパススルーにはVT-dのCPUとマザーボードの両方のサポートが必要です。
私のプロセッサであるnon-k INTEL i7-3770(ark.intel.com/products/65719による)がVT-dをサポートしていることを確認しました。
ダイレクトI/O(VT-d)向けインテル®バーチャライゼーション・テクノロジー‡はい
私のAsrockZ77 Extreme4マザーボードはVT-dもサポートしています(ユーザーマニュアルの62ページに記載)。
VT-dこれを使用して、インテル®VT-dテクノロジー(ダイレクトI/O用インテル®バーチャライゼーション・テクノロジー)を有効または無効にします。この機能のデフォルト値は[Disabled]です。
システムが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
これは、ホストがまだビデオカードの制御を放棄せず、カーネルが適切な構成アイテムでコンパイルされていないことが原因である可能性が高いためだと思います。
これは私にとって新しい領域ですので、私の経験不足をご容赦ください。私が正しい軌道に乗っていることの単なる確認であっても、私は大いにどんなフィードバックでも感謝します。私が明白な見落としをしたか、または考えすぎているかどうか私に知らせてください。私の質問に対する建設的な批判も歓迎します。 「私を助ける」のに十分な情報を提供しなかった場合(または、あまりにも多くの情報を含めた場合)にお知らせください。私の質問をより明確にしたり、答えやすくしたりできるように喜んでお手伝いさせていただきます。
前もって感謝します、
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-roid.blogspot.com.au/2012/07/howto-kvm-passthrough.html