服务器配置

服务器版本: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

更新

  1. 将生成的配置写入GRUB配置文件:
    grub2-mkconfig -o /boot/grub2/grub.cfg

  2. 同时更新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
done

6. 手动添加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 虚拟机名称

⚠️ 重要注意事项:

  1. NVIDIA驱动限制:NVIDIA消费级显卡在虚拟机中可能受限,需要:

    • 添加<kvm><hidden state='on'/></kvm>隐藏虚拟机标识
    • 可能需要在虚拟机中安装特定版本的NVIDIA驱动
  2. 主机显示:直通后主机将无法使用RTX 3060,确保主机有另一个显示输出

  3. 备份:在修改前备份虚拟机配置

   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"