有人设法用单直通显卡运行 Linux 和 KVM Windows 吗?

有人设法用单直通显卡运行 Linux 和 KVM Windows 吗?

我有一个 Ubuntu 系统,它在 KVM 中运行 FreeNAS,并使用一个 SATA 控制器卡作为直通。因此,我的主板上只有一个 PCIe 插槽可以安装显卡。我现在还想运行一个能够运行需要 GPU 的 3D CAD 软件的 Windows KVM。

我读过几篇描述使用第二张显卡直通在 KVM 中运行的窗口的文章。但是我想运行一个只使用一张显卡的不同设置:

  • 无需显卡即可运行主 Linux(仅在安装或维护时附加到它)
  • 将单个显卡直通到 Windows KVM,也将鼠标/键盘直通到 Windows
  • 通过 ssh 操作 linux 或者安装一个无人值守服务器并通过该服务器从 Windows 进行连接。

是否有一些资源可以描述如何实现这样的设置?有人尝试过吗?我猜顺序应该是这样的:

  • 在linux上安装vnc服务器,通过vnc服务器接口进行操作
  • 添加 GRUB 启动设置,让 vfio 处理显卡
  • 重新启动进入无头模式并设置一个自动启动的 Windows KVM,并连接显卡

听起来可行(?)但我想有很多陷阱,而且我不想冒险使用我当前的设置......

答案1

从...开始本教程我使用下面的脚本让 AMD 5450 主显卡直通(主机无头运行)。

  • 进行标准 vfio 准备
  • 添加video=efifb:off到 cmdline,否则 efifb 会在 vfio 之前抓取 PCI 条。
  • 客户 UEFI(OVMF 映像来自apt-get install ovmf
  • -vga qlx使用后,qlx Monitor 在 Windows 中被禁用(显示设置)
  • 没有适合 AMD 5450 的 romfiles。

我也尝试使用 NVidia 710b,但是一直卡在“Code 43”上。可能是因为尝试通过主卡时需要 romfile。

脚本:

#!/bin/bash

b=$(pwd)

passthrough=0
qxl=1
uefi=1
ovmf=0
net=0
while getopts "bpQUon" opt; do
  case $opt in
      p) passthrough=1 ;;
      Q) qxl=0 ;;
      U) uefi=0 ;;
      n) net=1 ;;
      o) ovmf=1 ;;
  esac
done

cp ${b}/uefi/usr/share/edk2.git/ovmf-x64/OVMF_VARS-pure-efi.fd .
OPTS=""
# Basic CPU settings.
OPTS="$OPTS -cpu host,kvm=off"
OPTS="$OPTS -smp 4,sockets=1,cores=4,threads=1"
# Enable KVM full virtualization support.
OPTS="$OPTS -enable-kvm"
# Assign memory to the vm.
OPTS="$OPTS -m 4000"

# VFIO GPU and GPU sound passthrough.
if [ "$passthrough" == "1" ]; then
    #,multifunction=on,romfile=/mnt/nvidia_efi.rom" ,romfile=${b}/bioses/XFX.HD5450.1024.110612.rom
    #OPTS="$OPTS -device vfio-pci,host=05:00.0,multifunction=on,romfile=${b}/bioses/XFX.HD5450.1024.110612.rom"
    #,romfile=${b}/bioses/XFX.HD5450.1024.110612_1.rom
    OPTS="$OPTS -device vfio-pci,host=01:00.0,multifunction=on" 
    #,romfile=/mnt/data-n0/vms-win/romfile_radeon.bin
    #,romfile=/mnt/nvidia_efi.rom"
    OPTS="$OPTS -device vfio-pci,host=01:00.1"
fi

# Supply OVMF (general UEFI bios, needed for EFI boot support with GPT disks).
if [ "$uefi" == "1" ]; then
    if [ "$ovmf" == "0" ]; then
    OPTS="$OPTS -drive if=pflash,format=raw,readonly,file=${b}/uefi/usr/share/edk2.git/ovmf-x64/OVMF_VARS-pure-efi.fd"
    OPTS="$OPTS -drive if=pflash,format=raw,file=${b}/OVMF_VARS-pure-efi.fd"
    else
    mkdir -p ${b}/hda-contents
    #OPTS="$OPTS -pflash ${b}/ovmf_pkg/OVMF.fd"
    OPTS="$OPTS -drive if=pflash,format=raw,readonly,file=${b}/ovmf_pkg/OVMF.fd"
    OPTS="$OPTS -drive if=pflash,format=raw,file=${b}/OVMF_VARS-pure-efi.fd"
    fi
fi

# Load our created VM image as a harddrive.
OPTS="$OPTS -hda ${b}/win10_uefi_cpu_host_qemu_vm.qcow2"
# Load our OS setup image e.g. ISO file.

#OPTS="$OPTS -cdrom ${b}/windows_10.iso"
OPTS="$OPTS -cdrom ${b}/virtio-win-0.1.141.iso"

if [ "$qxl" == "1" ]; then
    # Use the following emulated video device (use none for disabled).
    OPTS="$OPTS -vga qxl"
else
    # Use an emulated video device (use none for disabled).
    #  -vga none -device qxl
    OPTS="$OPTS -vga none -device qxl "
fi

OPTS="$OPTS -spice port=5900,addr=127.0.0.1,disable-ticketing "

# Redirect QEMU's console input and output.
OPTS="$OPTS -monitor stdio"

if [ "${net}" == "1" ]; then
    # Improve the network performance by utilizing virtio-net.
    OPTS="$OPTS -device virtio-net,netdev=net0,mac=de:ad:be:ef:33:4a"
    OPTS="$OPTS -netdev tap,id=net0,ifname=vmtap0,script=./qemu-ifup,downscript=./qemu-ifdown"
else
    OPTS="$OPTS -net none "
fi

#Bus 003 Device 004: ID 1c4f:0002 SiGma Micro Keyboard TRACER Gamma Ivory
#Bus 003 Device 002: ID 1a40:0201 Terminus Technology Inc. FE 2.1 7-port Hub

# USB mouse
if [ "$passthrough" == "1" ]; then
    OPTS="$OPTS -usb"
    OPTS="$OPTS -device usb-ehci,id=ehci"
    OPTS="$OPTS -device usb-host,bus=usb-bus.0,vendorid=0x17ef,productid=0x6019 "
    OPTS="$OPTS -device usb-host,bus=usb-bus.0,vendorid=0x1c4f,productid=0x0002 "
fi
#if [ "$passthrough" == "1" ]; then
#    OPTS="$OPTS -usb"
#    OPTS="$OPTS -device usb-ehci,id=ehci"
#    OPTS="$OPTS -device usb-host,bus=usb-bus.0,vendorid=0x17ef,productid=0x6019 "
#    OPTS="$OPTS -device usb-host,bus=usb-bus.0,vendorid=0x1c4f,productid=0x0002 "
#fi

#OPTS="$OPTS -device usb-host,hostbus=3,hostaddr=4"
#OPTS="$OPTS -device usb-host,hostbus=3,hostaddr=2"

#OPTS="$OPTS -device usb-host,bus=xhci.0,vendorid=0x1c4f,productid=0x0002 "
#OPTS="$OPTS -device usb-host,bus=xhci.0,vendorid=0x1a40,productid=0x0201 "

#OPTS="$OPTS -usbdevice host:1c4f:0002"
# USB keyboard
#OPTS="$OPTS -usbdevice host:1a40:0201"

sudo qemu-system-x86_64 $OPTS

相关内容