การนำ PCI-Passthrough ไปใช้กับ Linux-KVM บน Debian


10

ฉันกำลังพยายามใช้ PCI-Passthrough เพื่อแนบการ์ดวิดีโอเก่า (Radeon 4770) กับเครื่องเสมือน ฉันใช้ Linux-KVM เพื่อเรียกใช้เครื่องเสมือนบนโฮสต์ Debian Linux (Wheezy, 3.2.0-4-amd64)

คำถาม

เพื่อชี้แจงฉันไม่แน่ใจว่าสิ่งที่ถูกต้อง 'เส้นทาง' สำหรับการสอดแทรก PCI-Passthrough กับ Linux KVM ในขั้นตอนนี้ฉันสงสัยว่าการกระทำที่ถูกต้องคือการเพิ่มCONFIG_DMAR, CONFIG_DMAR_DEFAULT_ONและCONFIG_PCI_STUBไปที่ "ตัวเลือกบัส (PCI ฯลฯ )" ส่วนของแหล่งที่มาเคอร์เนลและ recompile

แต่ฉันไม่แน่ใจว่านี่เป็นรายละเอียดเพิ่มเติมที่จำเป็นก่อนที่จะทำการคอมไพล์ใหม่หรือไม่ หรือถ้าการคอมไพล์เคอร์เนลใหม่จำเป็น -บางทีอาจจะมีวิธีที่ง่ายกว่านี้ไหม?

จากคู่มือที่ฉันอ้างอิงมีเพียงlinux-kvm.org ที่กล่าวถึงอย่างชัดเจนว่าจำเป็นต้องมีการรวบรวม Linux-KVM ติดตั้งแล้วและทำงานเป็นไฮเปอร์ไวเซอร์

การวิจัย

ณ จุดนี้ฉันคิดว่าปัญหาของฉันเกี่ยวข้องกับเคอร์เนลของฉัน ทรัพยากรหลักของฉันเป็นแนวทางที่linux-kvm.org ( http://www.linux-kvm.org/page/How_to_assign_devices_with_VT-d_in_KVM ) อย่างไรก็ตามฉันได้พบทรัพยากรอื่น ๆ ซึ่งระบุวิธีการที่แตกต่างกันเล็กน้อยที่มีการแจกแจงเฉพาะ (ดูเหมือน):

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

SUSE - "openSUSE: การจำลองเสมือนด้วย KVM" (การละเว้นการเชื่อมโยงเนื่องจากความเกี่ยวข้องต่ำและข้อ จำกัด 2 ลิงก์)

คู่มือ Fedora ทำงานได้จนกว่าจะมีการอ้างอิงsetseboolซึ่งเฉพาะ RedHat คู่มือ 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_ONและCONFIG_PCI_STUBมีรายการค่าเคอร์เนลที่เกี่ยวข้องกับคำแนะนำบนlinux-kvm.org เช่นนี้ฉันเชื่อว่าฉันจำเป็นต้องคอมไพล์เคอร์เนลโฮสต์ของฉันใหม่ด้วยรายการปรับแต่งเคอร์เนล 3 ตัว (อย่างน้อย) นี้ การบูตด้วยintel_iommu=onพารามิเตอร์เคอร์เนลไปยังโฮสต์ -OS ของฉันดูเหมือนว่าไม่เพียงพอ

GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on"

การยืนยันการสนับสนุน VT-d / IOMMU / KVM

การวิจัยของฉันระบุว่า PCI-Passthrough ต้องการทั้ง CPU และเมนบอร์ดที่รองรับสำหรับ VT-d

VT-d

ฉันยืนยันว่าโปรเซสเซอร์ของฉันซึ่งไม่ใช่ k INTEL i7-3770 (ต่อ ark.intel.com/products/65719) รองรับ VT-d:

Intel® Virtualization Technology สำหรับกำกับ I / O (VT-d) ‡ใช่

มาเธอร์บอร์ด My Asrock Z77 Extreme4 ยังรองรับ VT-d (หน้า 62 ของคู่มือผู้ใช้):

VT-d ใช้สิ่งนี้เพื่อเปิดใช้งานหรือปิดใช้งานเทคโนโลยี Intel ® VT-d (เทคโนโลยี Intel ® Virtualization สำหรับ Directed I / O) ค่าเริ่มต้นของคุณสมบัตินี้คือ [ปิดใช้งาน]

IOMMU

ฉันตรวจสอบแล้วว่าระบบของฉันรองรับ IOMMU:

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

KVM

KVM ได้รับการติดตั้งและใช้งานได้นอกเหนือจากการรองรับ PCI-Passthrough:

lsmod | grep kvm
kvm_intel             121968  0 
kvm                   287749  1 kvm_intel

ฉันมั่นใจว่า VT-d เปิดใช้งานผ่าน BIOS ของเมนบอร์ด ด้วยเหตุนี้ฉันจึงไม่สงสัยว่าปัญหาฮาร์ดแวร์ / 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

และได้รับข้อผิดพลาดต่อไปนี้หลังจากพยายามสร้าง 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

ฉันเดาว่านี่เป็นเพราะโฮสต์ยังคงไม่ละทิ้งการควบคุมของการ์ดแสดงผลและน่าจะเกิดจากเคอร์เนลที่ไม่ได้ถูกคอมไพล์ด้วยรายการการกำหนดค่าที่เหมาะสม

นี่คือดินแดนใหม่สำหรับฉันดังนั้นโปรดยกโทษให้ฉันที่ไม่มีประสบการณ์ ฉันขอขอบคุณข้อเสนอแนะใด ๆอย่างมากแม้ว่ามันจะเป็นเพียงการยืนยันว่าฉันอยู่ในเส้นทางที่ถูกต้อง กรุณาแจ้งให้เราทราบหากฉันมีการกำกับดูแลที่จ้องมองหรือคิดมากเกินไป วิจารณ์ที่สร้างสรรค์ของคำถามของฉันก็ยินดีต้อนรับเช่นกัน แจ้งให้เราทราบหากฉันไม่ได้ให้ข้อมูลเพียงพอที่จะ "ช่วยคุณช่วยฉัน" (หรือถ้าฉันรวมมากเกินไป!) ฉันยินดีเป็นอย่างยิ่งที่จะช่วยทำให้คำถามของฉันชัดเจนขึ้นหรือตอบได้ง่ายขึ้น

ขอบคุณล่วงหน้า,


สิ่งที่เกิดขึ้นคือคุณไม่ปล่อยให้ videocard แนบตัวเองเข้ากับโฮสต์เลย (เช่นการบู๊ตโดยไม่ต้องแนบ videocard นั้นไปยังโฮสต์ของคุณไม่ว่าจะเป็นการเปิด / ปิดการใช้งานไดรเวอร์หรือการใช้พารามิเตอร์การบูตเคอร์เนล ?
Hennes

คำตอบ:


1

บทความที่กล่าวถึงสำหรับ PCI-passthrough จำเป็นต้องกำหนดค่าเคอร์เนล

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"

หลังจากติดตามบทความที่กล่าวถึงฉันยังคงมีปัญหาในการบูตเครื่องแขกและได้รับข้อผิดพลาดที่ "Device '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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.