searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

裸金属环境设备被某些内核模块占用的原因分析

2024-12-06 09:31:01
7
0

1. 裸金属设备的默认内核驱动绑定

裸金属环境中的 PCI 设备(例如 GPU)默认会由系统自动加载的内核驱动绑定。例如,NVIDIA GPU 通常被 nvidianouveau 驱动占用,而 AMD GPU 则可能由 amdgpu 或类似驱动占用。这种绑定是系统自动执行的,用于提供设备的正常使用。

验证方法

运行以下命令查看设备绑定的内核驱动:
lspci -v -s 3d:00.0
输出中会包含类似以下内容
image.png
上述信息表明设备被 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 正被宿主机服务挂载。

解决方案:解除设备占用

  1. 卸载当前内核驱动 使用以下命令卸载 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 隔离来解决问题。
0条评论
作者已关闭评论
郑****娜
8文章数
0粉丝数
郑****娜
8 文章 | 0 粉丝
原创

裸金属环境设备被某些内核模块占用的原因分析

2024-12-06 09:31:01
7
0

1. 裸金属设备的默认内核驱动绑定

裸金属环境中的 PCI 设备(例如 GPU)默认会由系统自动加载的内核驱动绑定。例如,NVIDIA GPU 通常被 nvidianouveau 驱动占用,而 AMD GPU 则可能由 amdgpu 或类似驱动占用。这种绑定是系统自动执行的,用于提供设备的正常使用。

验证方法

运行以下命令查看设备绑定的内核驱动:
lspci -v -s 3d:00.0
输出中会包含类似以下内容
image.png
上述信息表明设备被 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 正被宿主机服务挂载。

解决方案:解除设备占用

  1. 卸载当前内核驱动 使用以下命令卸载 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 隔离来解决问题。
文章来自个人专栏
软件开发问题记录
5 文章 | 1 订阅
0条评论
作者已关闭评论
作者已关闭评论
0
0