我正在嘗試使用 PCI-Passthrough 將舊顯示卡 (Radeon 4770) 連接到虛擬機器。我正在使用 Linux-KVM 在 Debian Linux(Wheezy、3.2.0-4-amd64)主機上運行虛擬機器。
問題
澄清一下,我不確定使用 Linux KVM 實現 PCI 直通的正確「路徑」是什麼。在這個階段,我懷疑正確的行動是將CONFIG_DMAR
、CONFIG_DMAR_DEFAULT_ON
、 和CONFIG_PCI_STUB
新增至核心原始碼的「匯流排選項(PCI 等)」部分並重新編譯。
但我不確定如果這是重新編譯之前必要添加的詳盡清單。或者如果需要重新編譯內核--也許有更簡單的方法?
在我參考過的指南中,僅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 指南一直有效,直到引用了setsebool
似乎特定於 RedHat 的內容。 SUSE 指南表明 SUSE 不支援顯示卡分配,但我也引用它,因為它表明我應該CONFIG_DMAR_DEFAULT_ON
在 /boot/config-`uname -r` 中找到一個字串。這linux-kvm.orgsite 也引用了CONFIG_DMAR_DEFAULT_ON
,因此這似乎是一個常見且必要的組件。
筆記:我在 Fedora 或 Debian 的指南中沒有發現對顯示卡的限制。引用的 SUSE 文件日期為 2006-2013 年。
CONFIG_DMAR_DEFAULT_ON
我在系統上的 /boot/config-`uname -r` 中找不到。進一步的研究表明,CONFIG_DMAR
、CONFIG_DMAR_DEFAULT_ON
、 和CONFIG_PCI_STUB
是與 上的指令相關的 Linux 核心配置項。linux-kvm.org。因此,我相信我需要使用這 3 個(至少)內核配置項重新編譯主機的核心。intel_iommu=on
作為我的主機作業系統的核心參數啟動似乎是不夠的。
GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on"
VT-d/IOMMU/KVM 支援確認
我的研究顯示 PCI-Passthrough 需要 CPU 和主機板都支援 VT-d。
VT-d
我已經確認我的處理器是非kINTEL i7-3770(根據 ark.intel.com/products/65719),支援 VT-d:
英特爾® 定向 I/O 虛擬化技術 (VT-d) ‡ 是
我的 Asrock Z77 Extreme4 主機板也支援 VT-d(使用手冊第 62 頁):
VT-d 使用此選項啟用或停用Intel ® VT-d 技術(Intel ® 定向I/O 虛擬化技術)。此功能的預設值為[停用]。
IOMMU
我驗證了我的系統有 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。因此,我不懷疑硬體/BIOS 問題會妨礙 VT-d 的使用。不管,我無法成功地將視訊卡與主機分開並將其重新分配給虛擬機。
結束語
最後我想提一下,我也嘗試過測試:
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
嘗試建立目標虛擬機器後出現以下錯誤:
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-分配’無法初始化”的錯誤。我設法透過執行以下命令來啟動它:
echo 1 > /sys/module/kvm/parameters/allow_unsafe_assigned_interrupts
如果您仍然遇到問題,請參閱以下文章:http://spica-and-roid.blogspot.com.au/2012/07/howto-kvm-passthrough.html