ฉันต้องอุปกรณ์ NIC บนโฮสต์:
# รายการอุปกรณ์ Ethernet PCI เพื่อค้นหาชื่อ
lspci -nn | grep อีเธอร์เน็ต
# 04:00.0 ตัวควบคุมอีเทอร์เน็ต [0200]: Realtek Semiconductor Co., Ltd. RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller [10ec:8168] (rev 06)
# 05:00.0 ตัวควบคุมอีเทอร์เน็ต [0200]: Realtek Semiconductor Co., Ltd. RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller [10ec:8168] (rev 15)
# เพื่อรับ <โดเมน>.<bus>.<slot>.<function>
lspci -n -s 0000:04:00.0
# 04:00.0 0200: 10ec:8168 (รอบ 06)
และฉันต้องการส่งผ่านอุปกรณ์ 0000:04:00.0 ไปยัง เค.วี.เอ็ม
เครื่องเสมือน Ubuntu 20.04 โฮสต์อาจไม่เห็นอุปกรณ์นี้เมื่อ VM กำลังทำงาน ในการผูก PCI NIC กับแขกฉันทำตามคำแนะนำสำเร็จแล้ว VFIO - "ฟังก์ชันเสมือน I/O". แต่การปลดเปลื้องจากแขกสู่เจ้าบ้านนั้นยากยิ่งกว่า
ฉันผูกอุปกรณ์ NIC จากโฮสต์กับแขกด้วยตนเองด้วยวิธีต่อไปนี้:
# ค้นหาตัวควบคุมอีเทอร์เน็ต
ls -l /sys/class/net/ | เกรปพีซีไอ
# enp3s0 -> ../../devices/pci0000:00/0000:00:1c.5/0000:03:00.0/net/enp3s0
# enp4s0 -> ../../devices/pci0000:00/0000:00:1c.7/0000:04:00.0/net/enp4s0
lspci -nn | grep อีเธอร์เน็ต
# 04:00.0 ตัวควบคุมอีเทอร์เน็ต [0200]: Realtek Semiconductor Co., Ltd. RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller [10ec:8168] (rev 06)
# 05:00.0 ตัวควบคุมอีเทอร์เน็ต [0200]: Realtek Semiconductor Co., Ltd. RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller [10ec:8168] (rev 15)
# ตรวจสอบการจัดกลุ่ม IOMMU
สำหรับใน /sys/kernel/iommu_groups/*; หา $a -type l; เสร็จแล้ว | sort --version-sort | เกรป '04:00\|05:00'
# /sys/kernel/iommu_groups/12/devices/0000:04:00.0
# /sys/kernel/iommu_groups/13/devices/0000:05:00.0
# ค้นหาที่อยู่ MAC
สำหรับ eth ใน enp4s0 enp5s0; ทำ ifconfig $eth | grep อีเธอร์ | echo "MAC" "$eth:" $(awk '{พิมพ์ $2}'); เสร็จแล้ว
#MAC enp4s0:50:...
#MAC enp5s0:18:...
# โหลดไดรเวอร์อุปกรณ์ vfio-pci
ม็อดโพรบ vfio_pci
# ยกเลิกการผูกจากโฮสต์
เสียงสะท้อน 0000:04:00.0 | sudo tee /sys/bus/pci/devices/0000:04:00.0/driver/unbind
#ไว้บริการแขก
เสียงสะท้อน 10ec 8168 | sudo ที /sys/bus/pci/drivers/vfio-pci/new_id
# กลุ่ม IOMMU สำหรับอุปกรณ์ 0000:04:00.0 คือ 12
# เพิ่ม libvirt-qemu ให้กับ sudoers
sudo usermod -aG sudo libvirt-qemu
sudo chown libvirt-qemu:libvirt-qemu /dev/vfio/12
# ดูอุปกรณ์อื่น ๆ ในกลุ่มเพื่อให้ VFIO ใช้งานฟรี
ls -l /sys/bus/pci/devices/0000:04:00.0/iommu_group/devices | awk '{พิมพ์ $9 $10 $11}'
# 0000:04:00.0->../../../../devices/pci0000:00/0000:00:1c.5/0000:04:00.0
# เพิ่มอุปกรณ์อื่น ๆ หากอยู่ในกลุ่มเดียวกัน (ไม่จำเป็นในกรณีนี้)
# ตรวจสอบให้แน่ใจว่าอุปกรณ์ไม่สามารถมองเห็นได้จากโฮสต์
ls -l /sys/class/net/ | grep enp4s0
จากนั้นฉันก็สร้าง Ubuntu 20.04 VM ใหม่โดยใช้ ตัวจัดการเครื่องเสมือน (virt-manager) ที่จะวิ่งต่อไป เค.วี.เอ็ม.
ฉันเพิ่มอุปกรณ์ใหม่ลงใน VM โดยแก้ไขการกำหนดค่า xml ใน ผู้จัดการ virt
ระหว่างการสร้าง โดยเฉพาะอย่างยิ่ง, <devices>
ส่วนประกอบด้วยแท็กต่อไปนี้
<hostdev mode="subsystem" type="pci" managed="yes">
<driver name="vfio"/>
<source>
<address domain="0x0000" bus="0x04" slot="0x00" function="0x0"/>
</source>
<mac address='50:...'/>
<address type="pci">
<zpci uid="0x0001" fid="0x00000000"/>
</address>
</hostdev>
กว่าที่ฉันติดตั้ง Ubuntu 20.04 ด้วยวิธีปกติ ระบบจะรีบูตอย่างถูกต้องโดยไม่มีการหยุดชะงัก (หน้าจอสีดำ)
เมื่อฉันปิด VM ฉันต้องการคืน PCI NIC ให้กับโฮสต์ ฉันทำการค้นคว้าเกี่ยวกับฟอรัม แต่ไม่มีคำแนะนำที่ชัดเจนเกี่ยวกับวิธีการทำเช่นนั้น
ถ้าฉันรีบูตโฮสต์ อุปกรณ์ทั้งหมดจะกลับไปที่โฮสต์ ดังนั้นการรวม vfio จะถูกปล่อย แต่ฉันจะทำอย่างนั้นได้อย่างไรโดยไม่ต้องรีบูตโฮสต์