kvm单显卡直通(二)

Tip: 单显卡直通请参考这一篇
Tip: 核显直通请参考这一篇

1 系统配置

系统配置如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
❯ neofetch
-` lux@Worisur
.o+` -----------
`ooo/ OS: Arch Linux x86_64
`+oooo: Kernel: 6.12.4-arch1-1
`+oooooo: Uptime: 13 hours, 21 mins
-+oooooo+: Packages: 1065 (pacman)
`/:-:++oooo+: Shell: zsh 5.9
`/++++/+++++++: Resolution: 3840x2160
`/++++++++++++++: Terminal: /dev/pts/1
`/+++ooooooooooooo/` CPU: AMD Ryzen 9 7950X (32) @ 5.881GHz
./ooosssso++osssssso+` GPU: AMD ATI 6c:00.0 Raphael
.oossssso-````/ossssss+` GPU: NVIDIA GeForce RTX 4060
-osssssso. :ssssssso. GPU: NVIDIA GeForce RTX 4080 SUPER
:osssssss/ osssso+++. Memory: 39318MiB / 63436MiB
/ossssssss/ +ssssooo/-
`/ossssso+/:- -:/+osssso+-
`+sso+:-` `.-/+oso:
`++:. `-/+/
.` `/

2 直通思路

主机有两块独立显卡,4060已经直通给其中一台虚拟机使用,目前想把4080s直通给另外一台,但是要求虚拟机关机的时候,能恢复linux图形化界面。

IOMMU配置请参考这里

3 Hooks

单显卡直通配置的核心,通过配置虚拟机启动和关闭的钩子,实现显卡的自动释放和回收。首先线获得脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
sudo wget 'https://raw.githubusercontent.com/PassthroughPOST/VFIO-Tools/master/libvirt_hooks/qemu' -O /etc/libvirt/hooks/qemu

* 内容如下:
#!/usr/bin/env bash
#
# Author: SharkWipf
#
# Copy this file to /etc/libvirt/hooks, make sure it's called "qemu".
# After this file is installed, restart libvirt.
# From now on, you can easily add per-guest qemu hooks.
# Add your hooks in /etc/libvirt/hooks/qemu.d/vm_name/hook_name/state_name.
# For a list of available hooks, please refer to https://www.libvirt.org/hooks.html
#
GUEST_NAME="$1"
HOOK_NAME="$2"
STATE_NAME="$3"
MISC="${@:4}"

BASEDIR="$(dirname $0)"
HOOKPATH="$BASEDIR/qemu.d/$GUEST_NAME/$HOOK_NAME/$STATE_NAME"
set -e # If a script exits with an error, we should as well.
# check if it's a non-empty executable file
if [ -f "$HOOKPATH" ] && [ -s "$HOOKPATH" ] && [ -x "$HOOKPATH" ]; then
eval \"$HOOKPATH\" "$@"
elif [ -d "$HOOKPATH" ]; then
while read file; do
# check for null string
if [ ! -z "$file" ]; then
eval \"$file\" "$@"
fi
done <<< "$(find -L "$HOOKPATH" -maxdepth 1 -type f -executable -print;)"
fi

创建启动和关闭脚本:

1
sudo mkdir /etc/libvirt/hooks/qemu.d /etc/libvirt/hooks/qemu.d/虚拟机名称 /etc/libvirt/hooks/qemu.d/虚拟机名称/prepare /etc/libvirt/hooks/qemu.d/虚拟机名称/prepare/begin /etc/libvirt/hooks/qemu.d/虚拟机名称/release /etc/libvirt/hooks/qemu.d/虚拟机名称/release/end

创建 /etc/libvirt/hooks/qemu.d/虚拟机名称/prepare/begin/start.sh:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#!/bin/bash
## Helpful to read output when debugging
set -x

# Stop display manager
systemctl stop display-manager.service
## Uncomment the following line if you use GDM
#killall gdm-x-session

# Unbind VTconsoles
echo 0 > /sys/class/vtconsole/vtcon0/bind
echo 0 > /sys/class/vtconsole/vtcon1/bind

# Unbind EFI-Framebuffer
echo efi-framebuffer.0 > /sys/bus/platform/drivers/efi-framebuffer/unbind

# Avoid a Race condition by waiting 2 seconds. This can be calibrated to be shorter or longer if required for your system
sleep 2

# Unload all Nvidia drivers
modprobe -r nvidia_drm
modprobe -r nvidia_modeset
modprobe -r nvidia_uvm
modprobe -r nvidia

## Load vfio
modprobe vfio
modprobe vfio_iommu_type1
modprobe vfio_pci

创建 /etc/libvirt/hooks/qemu.d/虚拟机名称/release/end/stop.sh:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#!/bin/bash
set -x

## Unload vfio
modprobe -r vfio_pci
modprobe -r vfio_iommu_type1
modprobe -r vfio

# Rebind VT consoles
echo 1 > /sys/class/vtconsole/vtcon0/bind
echo 1 > /sys/class/vtconsole/vtcon1/bind

nvidia-xconfig --query-gpu-info > /dev/null 2>&1
echo "efi-framebuffer.0" > /sys/bus/platform/drivers/efi-framebuffer/bind

modprobe nvidia_drm
modprobe nvidia_modeset

modprobe nvidia_uvm
modprobe nvidia

# Restart Display Manager
systemctl start display-manager.service
1
2
3
sudo chmod +x /etc/libvirt/hooks/qemu
sudo chmod +x /etc/libvirt/hooks/qemu.d/虚拟机名称/prepare/begin/start.sh
sudo chmod +x /etc/libvirt/hooks/qemu.d/虚拟机名称/release/end/stop.sh

4 问题解决

4.1 启用 vfio 后主机无法启动并卡在黑屏,且系统无响应

内核启动时添加 video=efifb:off 内核参数即可解决该问题。


kvm单显卡直通(二)
https://worisur.github.io/2024/12/11/2024-12-11.kvm单显卡直通(二)/
作者
worisur
发布于
2024年12月11日
许可协议