概念
虚拟化 intel VT-x AMD-V SVM
IO虚拟化 intel VT-d IOMMU
单根虚拟化 SRIOV
///PCI位置表示法
<domain>:<bus>:<device>.<function>
domain 0x0000 to 0xffff
bus 0x00 to 0xff
device 0x00 to 0x1f
function 0x0 to 0x7
///PCI设备标识符
<vendor>:<device>:<class>
启用IOMMU
BIOS启用VT-d(intel),IOMMU(AMD)
///linux cmdline配置
grub配置文件修改,添加iommu启动cmdline
opensuse rhel centos fedora
$ sudo vi /etc/default/grub
GRUB_CMDLINE_LINUX_DEFAULT="amd_iommu=on iommu=pt" ///amd cpu添加
GRUB_CMDLINE_LINUX_DEFAULT="intel_iommu=on iommu=pt" ///intel cpu添加
更新grub.cfg文件
opensuse
$ sudo grub2-mkconfig -o /boot/grub2/grub.cfg
rhel centos fedora
$ sudo grub2-mkconfig -o /etc/grub2-efi.cfg ///采用UEFI启动时,更新此文件
$ sudo grub2-mkconfig -o /etc/grub2.cfg ///采用传统BIOS启动时,更新此文件
vfio纳管PCI设备
vfio等相关内核模块写入dracut配置文件,确保模块包含在initramfs中
$ sudo touch /etc/dracut.conf.d/vfio.conf ///创建配置文件
$ sudo vi /etc/dracut.conf.d/vfio.conf ///将以下一行写入配置文件
add_drivers+=" vfio vfio_pci vfio_virqfd vfio_iommu_type1 " ///注意引号之间需有空格
pci设备标识符查询
$ lspci -nn
09:00.0 VGA compatible controller [0300]: NVIDIA Corporation GK110B [GeForce GTX TITAN Black] [10de:100c] (rev a1)
09:00.1 Audio device [0403]: NVIDIA Corporation GK110 High Definition Audio Controller [10de:0e1a] (rev a1)
10de:100c及10de:0e1a即标识符
vfio纳管
$ sudo touch /etc/modprobe.d/vfio-gpu.conf ///在模块加载创建配置文件
$ sudo vi /etc/modprobe.d/vfio-gpu.conf ///配置模块加载参数
options vfio_pci ids=10de:100c,10de:0e1a ///添加pci设备标识符,逗号隔开
///也可以直接添加cmdline, vfio_pci.ids=10de:100c,10de:0e1a
更新initramfs
$ sudo dracut -f
更新linux cmdline
GRUB_CMDLINE_LINUX_DEFAULT="rd.driver.pre=vfio_pci" ///参照cmdline更新流程,添加vfio参数,其他不变
重启系统
$ sudo reboot
PCI设备验证
$ lspci -k
09:00.0 VGA compatible controller: NVIDIA Corporation GK110B [GeForce GTX TITAN Black] (rev a1)
Subsystem: eVga.com. Corp. Device 3791
Kernel driver in use: vfio-pci
Kernel modules: nouveau
09:00.1 Audio device: NVIDIA Corporation GK110 High Definition Audio Controller (rev a1)
Subsystem: eVga.com. Corp. Device 3791
Kernel driver in use: vfio-pci
Kernel modules: snd_hda_intel
///可以看到pci设备驱动程序为vfio,即配置完成,可透传给虚拟机使用
SRIOV
此技术主要是网卡设备支持,可将网卡虚拟成多个网卡设备给到虚拟机使用。
$ lspci ///查看网卡所在pci位置编号
$ cat /sys/bus/pci/devices/0000:41:00.0/sriov_totalvfs ///查看网卡支持的vf数量
$ echo 16 > /sys/bus/pci/devices/0000:41:00.0/sriov_numvfs ///创建vf
vf可以pci直通方式给到虚拟机使用