【完整详细教程】Ubuntu22( 二 )


确认iommu group中的所有设备:
$ sudo dmesg | grep "iommu group 17"
输出如下:
[0.536462] pci 0000:01:00.0: Adding to iommu group 17[0.536467] pci 0000:01:00.1: Adding to iommu group 17
4. 屏蔽显卡 4.1 型号屏蔽法:
如果只有一张显卡,或者两张显卡的ID不同,可以直接用pci-stub或者vfio-pci的方法来屏蔽即可,修改/etc//grub:
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash intel_iommu=on pci-stub.ids=10de:2203,10de:1aef"或者GRUB_CMDLINE_LINUX_DEFAULT="quiet splash intel_iommu=on vfio-pci.ids=10de:2203,10de:1aef"
更新内核,并重启:
$ sudo -grub -u
如果屏蔽成功,内核驱动就会显示如下:
$ lspci -nnv | grep -E "(^\S|in use)" | grep 01:00 -A 1
01:00.0 VGA compatible controller [0300]: NVIDIA Corporation Device [10de:2203] (rev a1) (prog-if 00 [VGA controller])Kernel driver in use: vfio-pci01:00.1 Audio device [0403]: NVIDIA Corporation GA102 High Definition Audio Controller [10de:1aef] (rev a1)Kernel driver in use: vfio-pci
否则下面还是驱动被接管的状态(其实-smi就能看了):
$ lspci -nnv | grep -E "(^\S|in use)" | grep 01:00 -A 1
01:00.0 VGA compatible controller [0300]: NVIDIA Corporation Device [10de:2203] (rev a1) (prog-if 00 [VGA controller])Kernel driver in use: nvidia01:00.1 Audio device [0403]: NVIDIA Corporation GA102 High Definition Audio Controller [10de:1aef] (rev a1)Kernel driver in use: snd_hda_intel
4.2 脚本屏蔽法
当然如果两张显卡都是同一个型号,是不能用上面的方法屏蔽的 。
这个时候我们要为显卡指定驱动:
$ sudo vim /etc/-tools//init-top/vfio.sh
脚本内容为:
#!/bin/shecho "vfio-pci" > /sys/bus/pci/devices/0000:01:00.0/driver_overrideecho "vfio-pci" > /sys/bus/pci/devices/0000:01:00.1/driver_override#echo "0000:01:00.0" > /sys/bus/pci/drivers/vfio-pci/bind # 这里我没有加这个绑定,有人加了这两句,但我注释了,因为本地找不到这个文件夹#echo "0000:01:00.1" > /sys/bus/pci/drivers/vfio-pci/bind # 需要modprobe -i vfio-pci之后才有这个文件夹,但不加仍然可用exit 0
给脚本增加权限,否则无法执行:
$ sudo chmod 744 /etc/-tools//init-top/vfio.sh
完成后刷新,这个命令会执行上面的脚本:
$ sudo - -u -k all
输出下面的结果,重启就可以正常屏蔽了 。
update-initramfs: Generating /boot/initrd.img-6.2.0-31-genericupdate-initramfs: Generating /boot/initrd.img-6.2.0-26-generic
重启配置成功后按照上一节的命令就能看到显卡的驱动被vfio-pci接管了,-smi也能发现显卡已经无法识别了 。
如果想恢复显卡的挂载,就把脚本中的两行echo...注释掉,并刷新,重启机器即可 。
4.3 开机脚本屏蔽法
有些地方用下面的方法成功了,但我试了没有效果,我把方法留在这里供大家尝试:
$ sudo vim /usr/bin/vfio-pci-.sh
脚本的内容:

【完整详细教程】Ubuntu22

文章插图
#!/bin/shif [ ! -z "$(ls -A /sys/class/iommu)" ]; thenecho "vfio-pci" > /sys/bus/pci/devices/0000:01:00.0/driver_overrideecho "vfio-pci" > /sys/bus/pci/devices/0000:01:00.1/driver_overridefimodprobe -i vfio-pci
再给脚本增加运行权限,否则启动时是不能运行的:
$ sudo chmod 744 /usr/bin/vfio-pci-.sh
最后在/etc/.d/vfio.conf内指定我们的脚本路径 。
$ sudo vim /etc/.d/vfio.conf
install vfio-pci /usr/bin/vfio-pci-override.sh
Arch Linux的官方中文文档也有详细的解释,但实际操作和有差异,放在这里作为一个参考资料 。PCIvia OVMF - Arch Linux 中文维基 () 。
因为用了,所以 vfio 也能正常工作了,上面说的bind文件也能找到了 。