参考:

cloud.tencent.com/developer/article/2517529

自动生成 /etc/modprobe.d/vfio.conf 脚本:

#!/bin/bash
#===============================================================================
# 脚本名称: generate_vfio_conf.sh
# 功能描述: 自动检测本机所有 NVIDIA GPU (及关联 HDMI 音频设备) 的 PCI 设备 ID,
#            生成适合 PVE GPU 直通的 /etc/modprobe.d/vfio.conf 配置文件。
# 使用方法: 以 root 权限运行脚本,根据提示操作。
#===============================================================================

set -euo pipefail

# ------------ 检查执行权限 ------------
if [[ $EUID -ne 0 ]]; then
   echo "此脚本需要 root 权限,请使用 sudo 运行。" >&2
   exit 1
fi

# ------------ 定义常量 ------------
CONF_FILE="/etc/modprobe.d/vfio.conf"

# ------------ 获取 NVIDIA 设备 ID ------------
echo "正在扫描系统中的 NVIDIA 设备..."
# 利用 lspci -nn 提取 [vendor:device] 格式的 ID,例如 [10de:1b06]
NVIDIA_DEVICES=$(lspci -nn | grep -i 'nvidia' | grep -oP '\[\K[0-9a-f]{4}:[0-9a-f]{4}(?=\])' | sort -u)

if [[ -z "$NVIDIA_DEVICES" ]]; then
    echo "未检测到任何 NVIDIA 设备,脚本退出。"
    exit 0
fi

echo "检测到以下 NVIDIA 设备 ID:"
echo "$NVIDIA_DEVICES"
echo ""

# ------------ 构建 ID 列表字符串 (逗号分隔) ------------
IDS=""
for dev in $NVIDIA_DEVICES; do
    if [[ -z "$IDS" ]]; then
        IDS="$dev"
    else
        IDS="$IDS,$dev"
    fi
done

# ------------ 生成完整的 vfio.conf 内容 ------------
VFIOCONF_CONTENT=$(cat <<EOF
# 此文件由脚本自动生成于 $(date)
# 用于 vfio-pci 驱动绑定 NVIDIA GPU 及相关音频设备
options vfio-pci ids=$IDS

# 确保 vfio-pci 驱动在 nouveau 和 nvidia 驱动之前加载
softdep nouveau pre: vfio-pci
softdep nvidia pre: vfio-pci
EOF
)

# ------------ 预览并确认写入 ------------
echo "=============================================="
echo "即将写入 $CONF_FILE 的内容如下:"
echo "=============================================="
echo "$VFIOCONF_CONTENT"
echo "=============================================="
echo ""

read -p "确认写入以上内容到 $CONF_FILE ? (y/N) " -r CONFIRM
if [[ ! "$CONFIRM" =~ ^[Yy]$ ]]; then
    echo "已取消操作,未修改任何文件。"
    exit 0
fi

# ------------ 写入配置文件 ------------
echo "$VFIOCONF_CONTENT" > "$CONF_FILE"
echo "已成功写入 $CONF_FILE"

# ------------ 更新 initramfs ------------
echo "正在更新 initramfs 使配置生效..."
if command -v update-initramfs &>/dev/null; then
    update-initramfs -u
    echo "initramfs 更新完成。"
else
    echo "未找到 update-initramfs 命令,请手动执行: update-initramfs -u"
fi

echo "配置完成。请重启宿主机以应用 vfio-pci 驱动绑定。"