Debian पर Linux-KVM के साथ PCI-Passthrough को लागू करना


10

मैं एक पुराने मशीन (Radeon 4770) को एक वर्चुअल मशीन से जोड़ने के लिए PCI-Passthrough का उपयोग करने का प्रयास कर रहा हूं। मैं डेबियन लिनक्स (व्हीजी, 3.2.0-4-amd64) होस्ट पर अपनी वर्चुअल मशीन चलाने के लिए लिनक्स-केवीएम का उपयोग कर रहा हूं।

सवाल

स्पष्ट करने के लिए, मुझे यकीन नहीं है कि लिनक्स KVM के साथ PCI-Passthrough के लिए सही 'पथ' क्या है। इस स्तर पर मुझे लगता है सही कार्रवाई करने के लिए है जोड़ने CONFIG_DMAR, CONFIG_DMAR_DEFAULT_ONऔर CONFIG_PCI_STUB"बस विकल्प (पीसीआई आदि)" कर्नेल स्रोत और recompile की धारा है।

लेकिन मुझे यकीन नहीं है कि यह पुनर्संरचना से पहले आवश्यक परिवर्धन की एक विस्तृत सूची है। या यदि कर्नेल को फिर से भरना आवश्यक है - तो आसान तरीका है?

जिन गाइडों का मैंने उल्लेख किया है , उनमें से केवल linux-kvm.org का स्पष्ट रूप से उल्लेख करना आवश्यक है। लिनक्स-केवीएम पहले से ही स्थापित है और हाइपरविजर के रूप में कार्य कर रहा है।

अनुसंधान

इस बिंदु पर मुझे लगता है कि मेरा मुद्दा मेरी कर्नेल से संबंधित है। मेरा प्राथमिक संसाधन 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-लिंक सीमा के कारण लिंक छोड़ा गया)

फेडोरा गाइड संदर्भित होने तक काम करता है setseboolजो रेडहैट-विशिष्ट प्रतीत होता है। SUSE गाइड इंगित करता है कि ग्राफिक्स-कार्ड असाइनमेंट SUSE द्वारा समर्थित नहीं है, हालांकि मैं इसे भी संदर्भित कर रहा हूं क्योंकि यह संकेत देता है कि मुझे CONFIG_DMAR_DEFAULT_ON/ boot / config -`uname -r` के भीतर एक स्ट्रिंग मिलनी चाहिए । Linux-kvm.org साइट भी संदर्भ CONFIG_DMAR_DEFAULT_ON, इस प्रकट होता है एक आम और आवश्यक घटक होने के लिए इतना।

नोट: मुझे फेडोरा या डेबियन के लिए गाइड में ग्राफिक्स कार्ड के लिए प्रतिबंध नहीं मिला है। संदर्भित SUSE दस्तावेज़ 2006-2013 दिनांकित है।

मैं CONFIG_DMAR_DEFAULT_ONअपने सिस्टम पर / बूट / config-`नाम -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-Passtrough को VT-d के लिए CPU और मदरबोर्ड दोनों के समर्थन की आवश्यकता है।

VT-घ

मैंने पुष्टि की है कि मेरा प्रोसेसर, एक गैर- k INTEL i7-3770 (प्रति ark.intel.com/products/65719), VT-d का समर्थन करता है:

Intel® वर्चुअलाइजेशन टेक्नोलॉजी फॉर डायरेक्टेड I / O (VT-d) for हां

मेरा Asrock Z77 चरम 4 मदरबोर्ड भी VT-d (उपयोगकर्ता मैनुअल के प्रति पृष्ठ 62) का समर्थन करता है:

VT-d इसका उपयोग Intel® VT-d प्रौद्योगिकी (Direct® / O के लिए Intel® वर्चुअलाइजेशन प्रौद्योगिकी) को सक्षम या अक्षम करने के लिए करता है। इस सुविधा का डिफ़ॉल्ट मान [अक्षम] है।

IOMMU

मैंने सत्यापित किया कि मेरे सिस्टम में IOMMU समर्थन है:

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

केवीएम

KVM, PCI-Passthrough समर्थन से अलग और कार्यात्मक है:

lsmod | grep kvm
kvm_intel             121968  0 
kvm                   287749  1 kvm_intel

मैंने सुनिश्चित किया है कि VT-d मेरी मदरबोर्ड के BIOS के माध्यम से सक्षम है। जैसे, मुझे हार्डवेयर / 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-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 हार्डवेयर सपोर्ट" के तहत मिला।

उल्लेख किए गए लेख का पालन करने के बाद, मैंने अभी भी अतिथि मशीन को बूट किया था और त्रुटियां हो रही थीं कि "डिवाइस 'पीसीआई-असाइन' को आरंभिक नहीं बनाया जा सकता है"। मैं इसे निष्पादित करके बूट करने में कामयाब रहा:

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

यदि आपको अभी भी समस्या हो रही है, तो निम्नलिखित लेख देखें: http://spica-and-roid.blogspot.com.au/2012/07/howto-kvm-passthrough.html

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.