1. 裸金属设备的默认内核驱动绑定
裸金属环境中的 PCI 设备(例如 GPU)默认会由系统自动加载的内核驱动绑定。例如,NVIDIA GPU 通常被 nvidia
或 nouveau
驱动占用,而 AMD GPU 则可能由 amdgpu
或类似驱动占用。这种绑定是系统自动执行的,用于提供设备的正常使用。
验证方法
运行以下命令查看设备绑定的内核驱动:
lspci -v -s 3d:00.0
输出中会包含类似以下内容
上述信息表明设备被 nvidia
驱动占用
2. GPU 设备可能被宿主机服务使用
裸金属服务器可能配置了用于图形处理或计算的服务,这些服务会加载并使用 GPU 的内核驱动。例如:
- 图形界面(Xorg/Wayland)
- 机器学习框架(如 TensorFlow、PyTorch)
- CUDA 驱动环境
- 宿主机本身的显卡显示功能
这些服务会自动加载相关内核模块,从而占用 GPU。
3. IOMMU 未启用导致设备未隔离
如果裸金属机器未启用 IOMMU(输入输出内存管理单元),设备不会被隔离,系统会认为 GPU 是宿主机的一部分,并自动加载默认的内核驱动程序进行管理。这使得 GPU 无法直接释放给虚拟机或其他用户。
验证 IOMMU 是否启用
运行以下命令检查 IOMMU 状态:
dmesg | grep -i iommu
若输出中未包含 DMAR: IOMMU enabled
或类似信息,则表明未启用 IOMMU。
4. 是否挂载到宿主机服务
裸金属 GPU 可能被宿主机中的服务挂载,例如 CUDA 或 OpenCL 环境配置时默认将 GPU 资源分配给宿主机的服务进程。可以通过以下命令检查:
nvidia-smi
若看到进程列表中有 GPU 使用记录,则表明 GPU 正被宿主机服务挂载。
解决方案:解除设备占用
- 卸载当前内核驱动 使用以下命令卸载 GPU 当前绑定的内核驱动:
sudo rmmod nvidia
sudo rmmod nouveau
如果是 AMD GPU,卸载驱动的命令为:
sudo rmmod amdgpu
2.将设备绑定到 VFIO 驱动 在需要使用 GPU 透传给虚拟机时,需绑定到 VFIO 驱动。执行以下步骤:
- 加载 VFIO 模块:
modprobe vfio
modprobe vfio-pci
绑定 GPU 到 VFIO: 获取 GPU 的 PCI 地址(如3d:00.0
),运行以下命令:
echo "0000:3d:00.0" > /sys/bus/pci/devices/0000:3d:00.0/driver/unbind
echo "vfio-pci" > /sys/bus/pci/devices/0000:3d:00.0/driver_override
3.启用 IOMMU 隔离 在 GRUB 中启用 IOMMU 支持(参考之前的 GRUB 配置),并重启系统以确保设备隔离:
GRUB_CMDLINE_LINUX="intel_iommu=on iommu=pt"
**4.检查设备是否被 VFIO 占用** 确保设备已成功被 VFIO 占用:
lspci -v -s 3d:00.0 | grep -i kernel
Kernel driver in use: vfio-pci
设备被占用的原因是裸金属系统自动加载内核驱动绑定设备,或者宿主机服务占用了 GPU。如果需要解除占用并将设备用于虚拟机或特定任务,可以通过卸载内核驱动、绑定到 VFIO 驱动以及启用 IOMMU 隔离来解决问题。