服务器配置
服务器版本:alamlinux 9.0,ip 192.168.20.7
虚拟机名称 instance-000000d9
20.7服务器上有GPU先看,
安装pci工具
dnf -y install pciutils
服务器上默认是没安装的。
[root@localhost ~]# dnf -y install lspci
Last metadata expiration check: 3:08:55 ago on Sat Jan 17 07:19:59 2026.
No match for argument: lspci
Error: Unable to find a match: lspci
[root@localhost ~]# dnf provides lspci
Last metadata expiration check: 3:09:02 ago on Sat Jan 17 07:19:59 2026.
pciutils-3.7.0-7.el9.i686 : PCI bus related utilities
Repo : appstream
Matched from:
Filename : /usr/sbin/lspci
Provide : /sbin/lspci
pciutils-3.7.0-7.el9.x86_64 : PCI bus related utilities
Repo : baseos
Matched from:
Filename : /usr/sbin/lspci
Provide : /sbin/lspci
[root@localhost ~]# dnf -y install pciutils查看显卡版本
lspci |grep -i vga
[root@localhost ~]# lspci |grep -i vga
04:00.0 VGA compatible controller: NVIDIA Corporation GA104 [GeForce RTX 3060] (rev a1)
查看设备供应商和ID
lspci -nn | grep -i vga
[root@localhost ~]# lspci -nn | grep -i vga
04:00.0 VGA compatible controller [0300]: NVIDIA Corporation GA104 [GeForce RTX 3060] [10de:2487] (rev a1)查看 iommu是否启用
[root@localhost ~]# dmesg | grep -i iommu
[ 0.164192] DMAR-IR: IOAPIC id 3 under DRHD base 0xfbffc000 IOMMU 0
[ 0.164195] DMAR-IR: IOAPIC id 1 under DRHD base 0xc7ffc000 IOMMU 1
[ 0.164198] DMAR-IR: IOAPIC id 2 under DRHD base 0xc7ffc000 IOMMU 1
[ 1.299717] iommu: Default domain type: Translated
[ 1.299717] iommu: DMA domain TLB invalidation policy: lazy mode
[root@localhost ~]#
[root@localhost ~]# # 检查内核启动参数是否包含iommu参数
cat /proc/cmdline
BOOT_IMAGE=(hd0,gpt2)/vmlinuz-5.14.0-570.12.1.el9_6.x86_64 root=/dev/mapper/almalinux-root ro crashkernel=1G-4G:192M,4G-64G:256M,64G-:512M resume=/dev/mapper/almalinux-swap rd.lvm.lv=almalinux/root rd.lvm.lv=almalinux/swap
[root@localhost ~]# dmesg | grep -E "DMAR:|Intel-IOMMU:|AMD-Vi"
[ 0.164148] DMAR: Host address width 46
[ 0.164151] DMAR: DRHD base: 0x000000fbffc000 flags: 0x0
[ 0.164161] DMAR: dmar0: reg_base_addr fbffc000 ver 1:0 cap 8d2078c106f0466 ecap f020df
[ 0.164166] DMAR: DRHD base: 0x000000c7ffc000 flags: 0x1
[ 0.164173] DMAR: dmar1: reg_base_addr c7ffc000 ver 1:0 cap 8d2078c106f0466 ecap f020df
[ 0.164177] DMAR: RMRR base: 0x0000007b3e2000 end: 0x0000007b3f2fff
[ 0.164181] DMAR: ATSR flags: 0x0
[ 0.164184] DMAR: RHSA base: 0x000000c7ffc000 proximity domain: 0x0
[ 0.164187] DMAR: RHSA base: 0x000000fbffc000 proximity domain: 0x1
[root@localhost ~]#
从上述grub启动来看看,启动默认没启用iommu,
修改grub进行开启iommu
在cmdline_linux后面添加 intel_iommu=on iommu=pt
GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)"
GRUB_DEFAULT=saved
GRUB_DISABLE_SUBMENU=true
GRUB_TERMINAL_OUTPUT="console"
GRUB_CMDLINE_LINUX="crashkernel=1G-4G:192M,4G-64G:256M,64G-:512M resume=/dev/mapper/almalinux-swap rd.lvm.lv=almalinux/root rd.lvm.lv=almalinux/swap intel_iommu=on iommu=pt"
GRUB_DISABLE_RECOVERY="true"
GRUB_ENABLE_BLSCFG=true查看操作系统是怎么启动的
[root@localhost ~]# # 检查是否使用UEFI
ls /sys/firmware/efi 2>/dev/null && echo "UEFI系统" || echo "BIOS/MBR系统"
UEFI系统
# 查看GRUB配置文件位置
ls -la /boot/grub2/
config_table efivars esrt fw_platform_size fw_vendor mok-variables runtime runtime-map systab vars
total 16
drwx------. 3 root root 50 Jan 15 23:34 .
dr-xr-xr-x. 5 root root 4096 Jan 15 23:38 ..
drwx------. 2 root root 25 Jan 15 23:32 fonts
-rw-------. 1 root root 6475 Jan 15 23:34 grub.cfg
-rw-r--r--. 1 root root 1024 Jan 15 23:34 grubenv更新
将生成的配置写入GRUB配置文件:
grub2-mkconfig -o /boot/grub2/grub.cfg同时更新EFI分区(可选但推荐):
cp /boot/efi/EFI/almalinux/grub.cfg /boot/efi/EFI/almalinux/grub.cfg.backup.$(date +%Y%m%d) 2>/dev/null || true cp /boot/grub2/grub.cfg /boot/efi/EFI/almalinux/grub.cfg新版本9.0用下面工具更新内核
grubby --update-kernel=ALL --args="intel_iommu=on iommu=pt"
重新启动
reboot
验证iommu是否启用
[root@localhost ~]# cd /sys/bus/pci/devices/0000\:04\:00.0/
[root@localhost ~]# ls -l 里面如果有group就是启用了。
[root@localhost ~]# dmesg | grep -i "iommu.*enabled\|DMAR.*enabled"
[ 0.164904] DMAR-IR: Enabled IRQ remapping in xapic mode
检查gpu直通的脚本
#!/bin/bash
echo "=== NVIDIA RTX 3060直通检查 ==="
echo ""
echo "1. IOMMU状态:"
echo " ✅ IOMMU已启用 (iommu_group文件存在)"
echo ""
echo "2. GPU设备信息:"
GPU_PCI="04:00.0"
GPU_AUDIO="04:00.1"
for dev in $GPU_PCI $GPU_AUDIO; do
echo " 设备 $dev:"
lspci -nn -s $dev
# 检查IOMMU组
dev_path="/sys/bus/pci/devices/0000:$dev"
if [ -L "$dev_path/iommu_group" ]; then
group=$(basename $(readlink $dev_path/iommu_group))
echo " ✅ 在 IOMMU Group $group"
else
echo " ❌ 不在IOMMU组中"
fi
echo ""
done
echo "3. 检查IOMMU组内容:"
group_path="/sys/bus/pci/devices/0000:$GPU_PCI/iommu_group"
if [ -L "$group_path" ]; then
group_num=$(basename $(readlink $group_path))
echo " IOMMU Group $group_num 包含以下设备:"
for device in /sys/kernel/iommu_groups/$group_num/devices/*; do
device_id=$(basename $device)
device_info=$(lspci -nns $device_id)
echo " - $device_info"
# 检查是否还有其他PCI设备在同一组
if [ "$device_id" != "0000:$GPU_PCI" ] && [ "$device_id" != "0000:$GPU_AUDIO" ]; then
echo " ⚠️ 注意:有其他设备在同一IOMMU组,可能需要一起直通"
fi
done
fi
echo ""
echo "4. 当前驱动状态:"
for dev in $GPU_PCI $GPU_AUDIO; do
echo " 设备 $dev:"
lspci -k -s $dev | grep -A2 "Kernel driver in use" || echo " 无驱动信息"
done
echo ""
echo "5. 直通准备建议:"
echo " GPU设备ID: 10de:2487 (RTX 3060)"
echo " Audio设备ID: 10de:228b"
echo ""
echo " 需要一起直通的设备:"
echo " - 04:00.0 (GPU)"
echo " - 04:00.1 (Audio)"
echo ""
echo " 检查是否有其他设备在同一IOMMU组:"
group_num=$(basename $(readlink /sys/bus/pci/devices/0000:04:00.0/iommu_group 2>/dev/null) 2>/dev/null)
if [ ! -z "$group_num" ]; then
device_count=$(ls -1 /sys/kernel/iommu_groups/$group_num/devices/ 2>/dev/null | wc -l)
echo " IOMMU组 $group_num 有 $device_count 个设备"
if [ $device_count -gt 2 ]; then
echo " ⚠️ 警告:有其他设备需要一起直通"
fi
fi检查结果如下
=== NVIDIA RTX 3060直通检查 ===
1. IOMMU状态:
✅ IOMMU已启用 (iommu_group文件存在)
2. GPU设备信息:
设备 04:00.0:
04:00.0 VGA compatible controller [0300]: NVIDIA Corporation GA104 [GeForce RTX 3060] [10de:2487] (rev a1)
✅ 在 IOMMU Group 88
设备 04:00.1:
04:00.1 Audio device [0403]: NVIDIA Corporation GA104 High Definition Audio Controller [10de:228b] (rev a1)
✅ 在 IOMMU Group 88
3. 检查IOMMU组内容:
IOMMU Group 88 包含以下设备:
- 04:00.0 VGA compatible controller [0300]: NVIDIA Corporation GA104 [GeForce RTX 3060] [10de:2487] (rev a1)
- 04:00.1 Audio device [0403]: NVIDIA Corporation GA104 High Definition Audio Controller [10de:228b] (rev a1)
4. 当前驱动状态:
设备 04:00.0:
Kernel driver in use: nouveau
Kernel modules: nouveau
设备 04:00.1:
Kernel driver in use: snd_hda_intel
Kernel modules: snd_hda_intel
5. 直通准备建议:
GPU设备ID: 10de:2487 (RTX 3060)
Audio设备ID: 10de:228b
需要一起直通的设备:
- 04:00.0 (GPU)
- 04:00.1 (Audio)
检查是否有其他设备在同一IOMMU组:
IOMMU组 88 有 2 个设备🎯 当前状态总结:
✅ IOMMU已启用 - GPU在IOMMU Group 88
✅ 设备分组正确 - GPU和Audio在同一IOMMU组
✅ 可直通 - 只有2个设备,可以一起直通
⚠️ 需要更换驱动 - 当前使用nouveau和snd_hda_intel驱动,需要切换为VFIO
完美!你的GPU直通条件已经满足了。GPU和音频设备在同一个IOMMU组(Group 88),这是直通的理想情况。现在可以开始准备直通了。
🎯 当前状态总结:
✅ IOMMU已启用 - GPU在IOMMU Group 88
✅ 设备分组正确 - GPU和Audio在同一IOMMU组
✅ 可直通 - 只有2个设备,可以一起直通
⚠️ 需要更换驱动 - 当前使用nouveau和snd_hda_intel驱动,需要切换为VFIO
🔧 准备直通的步骤:
1. 配置VFIO驱动并屏蔽当前驱动:
mkdir ~/bin;
cd bin
cat install_vfio.sh <<'EOF'
#!/bin/bash
echo "=== 配置VFIO驱动进行GPU直通 ==="
echo ""
# 1. 获取设备ID
GPU_VENDOR="10de"
GPU_DEVICE="2487"
AUDIO_VENDOR="10de"
AUDIO_DEVICE="228b"
echo "1. 设备ID信息:"
echo " GPU: $GPU_VENDOR:$GPU_DEVICE (RTX 3060)"
echo " Audio: $AUDIO_VENDOR:$AUDIO_DEVICE"
echo ""
# 2. 创建VFIO配置
echo "2. 创建VFIO配置:"
VFIO_CONF="/etc/modprobe.d/vfio.conf"
echo "options vfio-pci ids=$GPU_VENDOR:$GPU_DEVICE,$AUDIO_VENDOR:$AUDIO_DEVICE" | sudo tee $VFIO_CONF
echo "options vfio-pci disable_vga=1" | sudo tee -a $VFIO_CONF
echo "✅ VFIO配置创建完成: $VFIO_CONF"
echo ""
# 3. 屏蔽Nouveau驱动
echo "3. 屏蔽Nouveau驱动:"
NOUVEAU_BLACKLIST="/etc/modprobe.d/blacklist-nouveau.conf"
echo "blacklist nouveau" | sudo tee $NOUVEAU_BLACKLIST
echo "options nouveau modeset=0" | sudo tee -a $NOUVEAU_BLACKLIST
echo "✅ Nouveau驱动已屏蔽"
echo ""
# 4. 确保VFIO模块在启动时加载
echo "4. 配置模块加载:"
MODULES_CONF="/etc/modules-load.d/vfio-pci.conf"
echo "vfio" | sudo tee $MODULES_CONF
echo "vfio_iommu_type1" | sudo tee -a $MODULES_CONF
echo "vfio_pci" | sudo tee -a $MODULES_CONF
echo "vfio_virqfd" | sudo tee -a $MODULES_CONF
echo "✅ VFIO模块配置完成"
echo ""
# 5. 重新生成initramfs
echo "5. 重新生成initramfs..."
sudo dracut -f --kver $(uname -r)
echo "✅ initramfs重新生成完成"
echo ""
echo "6. 重启系统以使更改生效:"
echo " sudo reboot"
echo ""
echo "重启后验证命令:"
echo " lspci -k -s 04:00.0 # 应显示vfio-pci驱动"
echo " lspci -k -s 04:00.1 # 应显示vfio-pci驱动"
EOF
chmod +x install_vfio.sh
# 运行并重启
./install_vfio.sh
reboot
2. 重启后验证驱动是否切换:
快速检测
lspci -k -s 04:00.0
[root@localhost ~]# lspci -k -s 04:00.0
04:00.0 VGA compatible controller: NVIDIA Corporation GA104 [GeForce RTX 3060] (rev a1)
Subsystem: Shenzhen Colorful Yugong Technology and Development Co. Device 0000
Kernel driver in use: vfio-pci
Kernel modules: nouveau
[root@localhost ~]# lspci -k -s 04:00.1
04:00.1 Audio device: NVIDIA Corporation GA104 High Definition Audio Controller (rev a1)
Subsystem: Shenzhen Colorful Yugong Technology and Development Co. Device 0000
Kernel driver in use: vfio-pci
Kernel modules: snd_hda_intel
[root@localhost ~]#
`脚本检测
# 重启后运行此脚本验证
#!/bin/bash
echo "=== 重启后驱动验证 ==="
echo ""
echo "1. 检查GPU驱动:"
echo "设备 04:00.0 (GPU):"
lspci -k -s 04:00.0
echo ""
echo "2. 检查Audio驱动:"
echo "设备 04:00.1 (Audio):"
lspci -k -s 04:00.1
echo ""
echo "3. 验证VFIO模块:"
lsmod | grep vfio
echo ""
echo "4. 检查设备是否绑定到VFIO:"
for dev in 04:00.0 04:00.1; do
driver_path="/sys/bus/pci/devices/0000:$dev/driver"
if [ -L "$driver_path" ]; then
driver=$(basename $(readlink $driver_path))
echo "设备 $dev: 绑定到驱动 $driver"
if [ "$driver" = "vfio-pci" ]; then
echo " ✅ 正确绑定到VFIO驱动"
else
echo " ❌ 未绑定到VFIO驱动"
fi
else
echo "设备 $dev: 未绑定驱动"
fi
done6. 手动添加PCI设备到现有虚拟机:
我的虚拟机名称 instance-000000d9
# 查找虚拟机XML配置
sudo virsh dumpxml 虚拟机名称 > vm-config.xml
# 编辑XML添加GPU设备
# 添加上面的<hostdev>配置
# 定义新的配置
sudo virsh define vm-config.xml
# 启动虚拟机
sudo virsh start 虚拟机名称7. 验证直通是否工作:
# 检查虚拟机中的设备
virsh domblklist 虚拟机名称
virsh domiflist 虚拟机名称
virsh dumpxml 虚拟机名称 | grep hostdev
# 查看虚拟机控制台
virsh console 虚拟机名称⚠️ 重要注意事项:
NVIDIA驱动限制:NVIDIA消费级显卡在虚拟机中可能受限,需要:
- 添加
<kvm><hidden state='on'/></kvm>隐藏虚拟机标识 - 可能需要在虚拟机中安装特定版本的NVIDIA驱动
- 添加
主机显示:直通后主机将无法使用RTX 3060,确保主机有另一个显示输出
备份:在修改前备份虚拟机配置
sudo virsh dumpxml 虚拟机名称 > vm-backup.xml🚀 快速开始步骤:
# 1. 配置VFIO驱动
sudo bash -c 'cat > /etc/modprobe.d/vfio.conf << EOF
options vfio-pci ids=10de:2487,10de:228b
options vfio-pci disable_vga=1
EOF'
# 2. 屏蔽nouveau
sudo bash -c 'echo "blacklist nouveau" > /etc/modprobe.d/blacklist-nouveau.conf'
sudo bash -c 'echo "options nouveau modeset=0" >> /etc/modprobe.d/blacklist-nouveau.conf'
# 3. 重新生成initramfs
sudo dracut -f
# 4. 重启
sudo reboot重启后验证驱动已切换到VFIO,然后就可以创建虚拟机并进行直通了!
虚拟机里配置直通
好的,我来帮你将GPU直通到openEuler虚拟机。首先需要找到你的虚拟机配置,然后添加直通设备。
🔍 先找到虚拟机信息:
# 查看虚拟机状态
sudo virsh list --all
# 获取虚拟机详细信息
sudo virsh dominfo instance-000000d9
# 导出虚拟机XML配置
sudo virsh dumpxml instance-000000d9 > instance-000000d9.xml📋 查看当前虚拟机配置:
# 查看虚拟机的PCI设备配置
sudo virsh dumpxml instance-000000d9 | grep -A5 -B5 "hostdev\|pci"
# 查看虚拟机是否已使用UEFI
sudo virsh dumpxml instance-000000d9 | grep -i "loader\|ovmf"
# 查看虚拟机的features设置
sudo virsh dumpxml instance-000000d9 | grep -A10 -B5 "<features>"##
openstack管理下的为openEuler虚拟机添加GPU直通:
openstack管理的虚拟机不可以使用virsh edit xml 来操作,必须使用openstack的命令修改。
首先检查ai-server虚拟机的信息
# 使用正确的ID查看
SERVER_ID=$(openstack server list --all | grep ai-server | awk '{print $2}')
echo "服务器ID: $SERVER_ID"
# 查看所有信息
openstack server show $SERVER_ID
# 或者使用json格式查看
openstack server show $SERVER_ID -f json
# 查看特定字段
openstack server show $SERVER_ID \
-c id \
-c name \
-c status \
-c OS-EXT-SRV-ATTR:hypervisor_hostname \
-c flavor \
-c image \
-c addresses
openstack flavor create gpu.8c16g \
--ram 16384 \
--disk 200 \
--vcpus 8 \
--property "pci_passthrough:alias"="gpu_3060:1" \
--property "pci_passthrough:alias"="gpu_3060_audio:1"