lspci | grep -i nvidia
会看到类似下面的输出,其中包含显卡的 PCI 地址,例如 0000:03:00.0:
03:00.0 VGA compatible controller: NVIDIA Corporation Device 1eb8 (rev a1)
03:00.1 Audio device: NVIDIA Corporation Device 10f7 (rev a1)
确保主机启用了 IOMMU 支持。在 GRUB 配置中添加以下参数:
GRUB_CMDLINE_LINUX="... intel_iommu=on"
GRUB_CMDLINE_LINUX="... amd_iommu=on"
然后更新 GRUB 配置:
update-grub
确认显卡在单独的 IOMMU 组中:
dmesg | grep -e DMAR -e IOMMU
这里有一个脚本可以查看
#!/bin/bash
for d in /sys/kernel/iommu_groups/*; do
if [ -d "$d" ]; then
echo "IOMMU Group ${d##*/}:"
for f in $(ls $d/devices/); do
echo -e "\t$(lspci -nns $f)"
done;
fi;
done;
查找设备 ID:
使用 lspci -nn | grep -i nvidia找到显卡设备 ID,例如 10de:1eb8 和 10de:10f7。
创建 VFIO 配置文件:
在 /etc/modprobe.d/vfio.conf 文件中添加以下内容,将设备 ID 替换为找到的设备 ID:
options vfio-pci ids=10de:1eb8,10de:10f7
更新 initramfs 并重启系统:
更新 initramfs 以应用新的 VFIO 配置,并重启系统:
update-initramfs -u
reboot
在部分添加显卡设备配置,使用上面找到的 PCI 地址:
通常情况下,显卡的audio可以不用透传,只需要添加一个hostdev的块就可以了
<devices>
...
<hostdev mode='subsystem' type='pci' managed='yes'>
<source>
<address domain='0x0000' bus='0x03' slot='0x00' function='0x0'/>
</source>
<rom bar='off'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x08' function='0x0'/>
</hostdev>
<hostdev mode='subsystem' type='pci' managed='yes'>
<source>
<address domain='0x0000' bus='0x03' slot='0x00' function='0x1'/>
</source>
<rom bar='off'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x09' function='0x0'/>
</hostdev>
...
</devices>
之后启动虚拟机
要进行网卡透传,宿主机需要支持 IOMMU,并且BIOS中要开启Intel vt-d。
grep -E "svm|vmx" /proc/cpuinfo
svm
vmx
在宿主机中启用 IOMMU 功能:
修改 GRUB 配置:
编辑 /etc/default/grub
文件:
在 GRUB_CMDLINE_LINUX
中添加以下参数:
intel_iommu=on iommu=pt
amd_iommu=on iommu=pt
更新 GRUB 并重启:
sudo update-grub
sudo reboot
在宿主机重启后,运行以下命令确认 IOMMU 是否启用:
dmesg | grep -e DMAR -e IOMMU
如果输出中显示类似 IOMMU enabled
,说明配置正确。
使用以下命令找到要透传的网卡设备:
lspci -nn | grep -i network
示例输出:
03:00.0 Ethernet controller [0200]: Intel Corporation Ethernet Controller X710 [8086:1572]
03:00.0
是网卡的 PCI 地址。[8086:1572]
是设备的厂商和设备 ID。在 libvirt
的虚拟机配置文件(XML)中,添加透传的网卡:
获取网卡的 PCI 地址:
lehw -C network -businfo
编辑虚拟机的 XML 配置文件:
virsh edit <VM-NAME>
添加以下内容到 <devices>
节点中:
<hostdev mode='subsystem' type='pci' managed='yes'>
<source>
<address domain='0x0000' bus='0x03' slot='0x00' function='0x0'/>
</source>
</hostdev>
重启虚拟机:
virsh shutdown <VM-NAME>
virsh start <VM-NAME>
在虚拟机中运行以下命令,查看网卡是否被识别:
lspci | grep -i ethernet
常要用于透传usb存储设备和加密狗设备给虚拟机
查看所有连接的 USB 设备:
lsusb
示例输出:
Bus 002 Device 005: ID 0781:5581 SanDisk Corp. Ultra
Bus 001 Device 003: ID 046d:c52b Logitech, Inc. Unifying Receiver
Bus 002 Device 005
表示设备的总线号和设备号。0781:5581
是厂商和设备 ID。使用 virsh
修改虚拟机配置:
编辑虚拟机的 XML 配置:
virsh edit <VM-NAME>
在 <devices>
节点中添加以下内容:
<hostdev mode='subsystem' type='usb' managed='yes'>
<source>
<vendor id='0x0781'/>
<product id='0x5581'/>
</source>
</hostdev>
参数说明:
vendor id='0x0781'
:设备的厂商 ID。product id='0x5581'
:设备的产品 ID。保存后退出。
将 USB 设备透传给虚拟机后,重启虚拟机:
virsh shutdown <VM-NAME>
virsh start <VM-NAME>
登录到虚拟机后,使用以下命令查看 USB 设备是否可用:
lsusb
应该可以看到之前透传的 USB 设备。
在虚拟机运行时,可以使用以下命令将 USB 设备添加到虚拟机或者在虚拟机动态移除:
virsh attach-device <VM-NAME> --file usb.xml --live
其中 usb.xml
是描述 USB 设备的 XML 配置文件。
如果需要从虚拟机中移除 USB 设备,使用以下命令:
virsh detach-device <VM-NAME> --file usb.xml --live
创建一个名为 usb.xml
的文件,内容如下:
<hostdev mode='subsystem' type='usb'>
<source>
<vendor id='0x0781'/>
<product id='0x5581'/>
</source>
</hostdev>
**vendor id**
** 和 ****product id**
:使用 lsusb
或 virsh nodedev-dumpxml
提取的厂商和产品 ID。HBA卡用于FC-SAN存储,可能原来服务器使用了FS-SCN存储,当服务器迁移到超融合或者私有云上后,仍希望继续使用FC-SAN存储,可采购HBA卡插到超融合或者私有云服务器上,并将其透传到对应的虚拟机上继续使用
HBA 卡透传需要宿主机支持 IOMMU 功能。
检查 CPU 是否支持虚拟化和 IOMMU:
grep -E "svm|vmx" /proc/cpuinfo
检查是否启用 IOMMU:
dmesg | grep -e DMAR -e IOMMU
如果未启用,请参考以下步骤配置 IOMMU。
修改 GRUB 配置:
编辑 /etc/default/grub
文件:
vim /etc/default/grub
添加以下参数到 GRUB_CMDLINE_LINUX
:
intel_iommu=on iommu=pt
amd_iommu=on iommu=pt
保存文件后更新 GRUB 配置并重启系统:
sudo update-grub
sudo reboot
使用以下命令列出宿主机的所有 PCI 设备:
lspci -nn
找到 HBA 卡对应的设备。例如:
04:00.0 Fibre Channel [0c04]: QLogic Corp. QLE2562 8Gb Fibre Channel Adapter [1077:2532] (rev 02)
记录设备的 PCI 地址,例如 04:00.0
。
编辑虚拟机 XML 配置:
virsh edit <VM-NAME>
<devices>
节点中添加以下内容:
<hostdev mode='subsystem' type='pci' managed='yes'>
<source>
<address domain='0x0000' bus='0x04' slot='0x00' function='0x0'/>
</source>
</hostdev>
启动虚拟机:
virsh start <VM-NAME>
登录虚拟机后,运行以下命令检查是否识别到 HBA 卡:
lspci -nn | grep Fibre
如果一切正常,虚拟机应该能看到并使用透传的 HBA 卡。
公众号:运维开发故事
github:https://github.com/orgs/sunsharing-note/dashboard
博客:https://www.devopstory.cn