KVM 直通显卡给虚拟机

宿主机配置

  • 主板: Gigabyte UG2.0
  • CPU: I7 8700K
  • RAM: 幻光戟 32G 3200hz
  • GPU: 集显 - HD630, 独显 - 华硕 Nvidia 1060 6G
  • SSD: 惠普 EX950 512G, 惠普 EX920 512G, 东芝 Q200EX 480G
  • OS : ARCHLINUX
  • VM : WIN10 1909u20

注意: 确保CPU支持VT-x/VT-d, BIOS开启集显并且默认为集显


安装加载相关包及加载内核模块

  1. 安装 QUEM 及其他需要的包
  sudo pacman -S qemu libvirt virt-manager ebtables dnsmasq bridge-utils openbsd-netcat ovmf
  # virt-manager 图形化管理工具
  # ovmf UEFI启动需要
  # 联网需要的组件
  ### ebtables dnsmasq 用于默认的 NAT/DHCP网络
  ### bridge-utils 用于桥接网络
  ### openbsd-netcat 通过 SSH 远程管理
  sudo systemctl enable libvirtd # 守护服务自启
  sudo systemctl enable virtlogd
  1. 加载内核模块
  sudo modprobe vfio vfio_pci

virtio 模块加载配置

将以下内容添加到 /etc/modules-load.d/virtio-net.conf

  # Load virtio_net.ko at boot
  #网络设备
  virtio_net
  #块设备
  virtio_blk
  #控制器设备
  virtio_scsi  
  #串行设备
  #virtio_serial  

设置 UEFI 启动

修改以下内容

  nvram = [
"/usr/share/ovmf/x64/OVMF_CODE.fd:/usr/share/ovmf/x64/OVMF_VARS.fd:/usr/share/ovmf/x64/OVMF.fd:/usr/share/ovmf/ia32/OVMF_CODE.fd:/usr/share/ovmf/ia32/OVMF_VARS.fd:/usr/share/ovmf/ia32/OVMF.fd"
]	

修改内核启动参数( systemd-boot )

  sudo vim /boot/loader/entries/arch.conf
  options  root=PARTLABEL=root rw intel_iommu=on iommu=pt vfio-pci.ids=10de:1b83,10de:10f0,8087:0025,8086:2526 pci=realloc
  ### 启用iommu支持
  # intel_iommu=on Intel | amd_iommu=on Amd
  # iommu=pt 防止Linux接触无法通过的设备
  ### vfio-pci.ids 需要直通的设备ID, 通过 lspci -nn 查看
  # 10de:1b83: Nvidia 1060 6G
  # 10de:10f0: Nvidia audio 
  # 8087:0025: Intel WIFI 9260AC
  # 8086:2526: Bluetooth
  # 126f:2262: Nvme ssd
  ### kvm中直接添加, 不需要vfio接管
  # 04b4:4042: IKBC keyborad
  # 046d:c08b: 罗技G502
  ### video=efifb:off 可选项, 当dmesg|grep vfio-pci出现下面错误时可尝试启用
  ## vfio-pci 0000:04:00.0: BAR 3: can't reserve [mem 0xca000000-0xcbffffff 64bit]
  # pci=realloc 热插拔

  # 尽早加载vfio
  sudo vim /etc/mkinitcpio.conf
  # MODLUES 中加入
  MODULES=(vfio_pci vfio vfio_iommu_type1 vfio_virqfd)
  # HOOKS
  HOOKS=(modconf)
  # 更新 initramfs 
  mkinitcpio -p linux
  # 将当前用户加入kvm组
  sudo usermod -a -G kvm aeno
  # 屏蔽 
  echo "blacklist nouveau" | sudo tee -a /etc/modprobe.d/nouveau_blacklist.conf
  # 重启宿主机
  systemctl reboot
  # 重启后查看vfio是否正常接管对应设备
  dmesg | grep --color vfio
  # [    5.551363] vfio-pci 0000:01:00.0: vgaarb: changed VGA decodes: olddecodes=io+mem,decodes=io+mem:owns=none
  # [    5.565384] vfio_pci: add [10de:1b83[ffffffff:ffffffff]] class 0x000000/00000000
  # [    5.582035] vfio_pci: add [10de:10f0[ffffffff:ffffffff]] class 0x000000/00000000
  # [    6.763044] vfio-pci 0000:01:00.0: vgaarb: changed VGA decodes: olddecodes=io+mem,decodes=io+mem:owns=none

virt-manager 创建虚拟机并以 UEFI 启动, 传递显卡硬件ID

处理著名的 Nvidia 43 错误码

  1. 配置文件 hyperv 节点最后加入:
    conf <vendor_id state='on' value='whatever'/>
  2. 配置文件 features 节点最后加入:
    ```conf


// TODO 独占磁盘
// TODO 透传键鼠, 蓝牙

// sudo modprobe -r btusb rfcomm iwlwifi
# Kvm   ArchLinux   Linux  

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×