参考:
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 驱动绑定。"