Menerapkan PCI-Passthrough dengan Linux-KVM di Debian

10

Saya mencoba menggunakan PCI-Passthrough untuk melampirkan kartu video lama (Radeon 4770) ke mesin virtual. Saya menggunakan Linux-KVM untuk menjalankan mesin virtual saya pada host Debian Linux (Wheezy, 3.2.0-4-amd64).

Pertanyaan

Untuk memperjelas, saya tidak yakin apa 'jalur' yang benar untuk mengimplementasikan PCI-Passthrough dengan Linux KVM. Pada tahap ini saya menduga tindakan yang benar adalah dengan menambahkan CONFIG_DMAR, CONFIG_DMAR_DEFAULT_ON, dan CONFIG_PCI_STUBdengan "pilihan Bus (PCI dll)" bagian dari kernel dan mengkompilasi ulang.

Tetapi saya tidak yakin apakah ini merupakan daftar tambahan yang diperlukan sebelum melakukan kompilasi ulang. Atau jika kompilasi ulang kernel diperlukan - mungkin ada metode yang lebih mudah?

Dari panduan yang saya referensikan, hanya linux-kvm.org yang secara eksplisit menyebutkan kompilasi diperlukan. Linux-KVM sudah diinstal dan berfungsi sebagai hypervisor.

Penelitian

Pada titik ini saya pikir masalah saya terkait dengan kernel saya. Sumber utama saya telah menjadi panduan di linux-kvm.org ( http://www.linux-kvm.org/page/How_to_assign_devices_with_VT-d_in_KVM ). Namun, saya telah menemukan sumber daya lain yang menunjukkan metode yang sedikit berbeda yang (tampaknya) spesifik distribusi:

Fedora-- https://docs.fedoraproject.org/en-US/Fedora/13/html/Virtualization_Guide/chap-Virtualization-PCI_passthrough.html

SUSE - "openSUSE: Virtualisasi dengan KVM" (Tautan dihilangkan karena relevansi rendah dan batas 2-tautan)

Panduan Fedora berfungsi sampai referensi setseboolyang tampaknya khusus RedHat. Panduan SUSE menunjukkan penugasan kartu-grafis tidak didukung oleh SUSE, namun saya juga CONFIG_DMAR_DEFAULT_ONmerujuknya karena ini mengindikasikan bahwa saya harus menemukan string di / boot / config-`uname -r`. Situs linux-kvm.org juga referensi CONFIG_DMAR_DEFAULT_ON, jadi ini tampaknya komponen yang umum dan perlu.

Catatan: Saya belum menemukan batasan untuk kartu grafis dalam panduan untuk Fedora atau Debian. Dokumen SUSE yang direferensikan bertanggal 2006-2013.

Saya tidak dapat menemukan CONFIG_DMAR_DEFAULT_ONdi / boot / config-`uname -r` di sistem saya. Penelitian lebih lanjut menunjukkan bahwa CONFIG_DMAR,, CONFIG_DMAR_DEFAULT_ONdan CONFIG_PCI_STUBmerupakan item konfigurasi kernel Linux yang relevan dengan instruksi di linux-kvm.org . Karena itu saya percaya bahwa saya perlu mengkompilasi ulang kernel host saya dengan 3 (setidaknya) item konfigurasi kernel ini. Boot dengan intel_iommu=onsebagai parameter kernel ke host-OS saya tampaknya tidak cukup.

GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on"

Konfirmasi Dukungan VT-d / IOMMU / KVM

Penelitian saya menunjukkan bahwa PCI-Passthrough membutuhkan dukungan CPU dan Motherboard untuk VT-d.

VT-d

Saya telah mengkonfirmasi bahwa prosesor saya, non-k INTEL i7-3770 (per ark.intel.com/products/65719), mendukung VT-d:

Teknologi Virtualisasi Intel® untuk I / O Sutradara (VT-d) ‡ Ya

Motherboard My Asrock Z77 Extreme4 saya juga mendukung VT-d (per halaman 62 dari Panduan Pengguna):

VT-d Gunakan ini untuk mengaktifkan atau menonaktifkan teknologi Intel ® VT-d (Intel® Virtualization Technology untuk Directed I / O). Nilai default dari fitur ini adalah [Dinonaktifkan].

IOMMU

Saya memverifikasi bahwa sistem saya memiliki dukungan IOMMU:

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

KVM

KVM diinstal dan fungsional, selain dari dukungan PCI-Passthrough:

lsmod | grep kvm
kvm_intel             121968  0 
kvm                   287749  1 kvm_intel

Saya telah memastikan bahwa VT-d diaktifkan melalui BIOS motherboard saya. Karena itu, saya tidak mencurigai masalah perangkat keras / BIOS yang akan mencegah penggunaan VT-d. Bagaimanapun juga, saya tidak berhasil melepaskan kartu video saya dari host saya dan menugaskannya kembali ke mesin virtual .

Pikiran Penutup

Akhirnya saya ingin menyebutkan bahwa saya juga mencoba pengujian:

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

dan mendapat kesalahan berikut setelah mencoba membuat target 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

Saya menduga ini karena tuan rumah masih tidak akan melepaskan kendali kartu video dan kemungkinan karena kernel tidak dikompilasi dengan item konfigurasi yang sesuai.

Ini adalah wilayah baru bagi saya jadi tolong maafkan pengalaman saya. Saya akan sangat menghargai umpan balik apa pun, bahkan jika itu hanya konfirmasi bahwa saya berada di jalur yang benar. Tolong beri tahu saya jika saya telah melakukan pengawasan mencolok atau terlalu banyak berpikir. Kritik konstruktif atas pertanyaan saya juga diterima. Beri tahu saya jika saya belum memberikan informasi yang cukup untuk "membantu Anda membantu saya" (atau jika saya sudah memasukkan terlalu banyak!). Saya akan sangat senang membantu membuat pertanyaan saya lebih jelas atau lebih mudah dijawab.

Terima kasih sebelumnya,

shelladept
sumber
Apa yang terjadi adalah Anda tidak membiarkan videocard melampirkan dirinya sendiri ke host (mis. Boot tanpa melampirkan videocard itu ke host Anda. Entah dengan tidak menyediakan / menonaktifkan driver atau menggunakan parameter boot kernel sehingga ia dilewati saat boot) ?
Hennes

Jawaban:

1

Artikel yang disebutkan untuk PCI-passthrough, diperlukan konfigurasi Kernel

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 "*"

Namun, saya tidak dapat menemukan opsi ini di bawah "Opsi bus" dan sebagai gantinya di bawah "Driver Perangkat -> Dukungan Perangkat Keras IOMMU".

Setelah mengikuti artikel yang disebutkan, saya masih punya masalah boot mesin tamu dan mendapatkan kesalahan bahwa "Perangkat 'pci-assign' tidak dapat diinisialisasi". Saya berhasil mem-boot-nya dengan menjalankan:

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

Rujuk ke artikel berikut jika Anda masih memiliki masalah: http://spica-and-roid.blogspot.com.au/2012/07/howto-kvm-passthrough.html

supmethods
sumber