Score:0

ผูก/เลิกผูกอุปกรณ์ PCI บนโฮสต์ Ubuntu

ธง tr

ฉันต้องอุปกรณ์ 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 จะถูกปล่อย แต่ฉันจะทำอย่างนั้นได้อย่างไรโดยไม่ต้องรีบูตโฮสต์

Score:1
ธง cn

หากต้องการทำด้วยตนเอง คุณสามารถใช้วิธีเดียวกับที่คุณยกเลิกการผูกจากโฮสต์เพื่อให้พร้อมใช้งานกับ VM

สิ่งนี้ควรทำ

เสียงสะท้อน 0000:04:00.0 | sudo tee /sys/bus/pci/devices/0000:04:00.0/driver/unbind
เสียงสะท้อน 10ec 8168 | sudo ที /sys/bus/pci/drivers/<host-driver-here>/new_id

คุณจำเป็นต้องรู้ว่าไดรเวอร์โฮสต์ใดที่คุณต้องการเชื่อมโยงอุปกรณ์ใหม่เพื่อให้ใช้งานได้

 lspci -n -v -s 0000:04:00.0

หลังจากรีบูตเครื่องใหม่แล้วมองหาบรรทัด "ไดรเวอร์เคอร์เนลที่ใช้งานอยู่:" คุณจะมีชื่อไดรเวอร์อยู่ที่นั่น

Score:0
ธง br

libvirt ทำการยกเลิกการเชื่อมโยงและการเชื่อมโยงใหม่ที่จำเป็นสำหรับคุณ และดูเหมือนว่ามันจะกู้คืนสถานะก่อนหน้าเมื่อปิด VM ด้วย

หากคุณไม่ทำสิ่งใดกับการรวมไดรเวอร์ก่อนเริ่ม VM ควรทำตามที่คุณต้องการทุกประการ

Alexander avatar
tr flag
ถ้าฉันส่งผ่าน NIC ไปยังแขกผ่าน `virt-manager' มากกว่าที่ปรากฏในแขก แต่โฮสต์ยังเห็นอุปกรณ์เหล่านี้และแสดงการเชื่อมต่ออีเทอร์เน็ตในซิสเต็มเทรย์ด้วย ฉันต้องการซ่อนมันบนโฮสต์อย่างสมบูรณ์ ดังนั้น คำถามยังคงอยู่: จะเชื่อมโยง NIC ใหม่กับโฮสต์ด้วยตนเองได้อย่างไร หลังจากการปิดตัวของแขก
br flag
อา ดังนั้นอุปกรณ์ที่ปรากฏขึ้นอีกครั้งจึงเป็นปัญหา

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา