内核更新时无法正常加载NVIDIA GPU(Tesla)驱动

更新时间:
复制 MD 格式

当升级GPU实例的操作系统(例如Alibaba Cloud Linux、RedHat、CentOS、Ubuntu等)内核时,可能会因为两个内核的kABI(Kernel Application Binary Interface)不一致,导致旧内核上构建的GPU(Tesla)驱动无法在新的内核上加载。内核升级后,请根据内核的kAPI(Kernel Application Programming Interface)是否存在变化,采取不同的方案解决该问题。

问题现象

升级GPU实例的操作系统内核时,出现GPU(Tesla)驱动无法在新的内核上加载,即无法在新的内核版本上插入旧内核的NVIDIAKO,导致该驱动无法正常使用。报错信息如下:

$sudo insmod ./nvidia.ko
insmod: ERROR: could not insert module ./nvidia.ko: Invalid module format

问题原因

升级内核包后导致NVIDIA GPU(Tesla)驱动无法加载的可能原因如下:

  • 升级前后两个内核的kABI不一致,导致旧内核上构建的NVIDIA GPU(Tesla)驱动无法在新内核上加载。

  • NVIDIA GPU(Tesla)驱动的默认KO(Kernel Object)安装目录不在 /lib/modules/(uname−r)/extra下,导致新的内核包安装时无法对其创建软链接。

解决方案

基于以上原因,根据内核的kAPI影响情况,采取不同的解决方案:

通过DKMS自动构建NVIDIA GPU(Tesla)驱动

  1. NVIDIA GPU(Tesla)驱动上安装DKMS。

    1. 远程连接GPU实例。

      本文以Alibaba Cloud Linux 3系统的gn7i实例为例,具体操作,请参见使用Workbench登录Linux实例

    2. GPU实例上安装DKMS。

      sudo yum install dkms
    3. 手动为GPU安装NVIDIA GPU(Tesla)驱动。

      具体操作,请参见GPU计算型实例中手动安装Tesla驱动(Linux)

      安装过程中,请注意以下几点:

      • 出现以下提示(即是否将内核模块源代码注册到DKMS)时,选择Yes

        Would you like to register the kernel module sources with DKMS? This will allow DKMS to automatically build a new module, if you install a different kernel later.
        <Yes>  <No>
      • 选择YesNVIDIA GPU可能会报注册失败提示(如下所示),您无需担心,直接单击OK即可。

        WARNING: nvidia-installer was forced to guess the X library path '/usr/lib64' and X module path '/usr/lib64/xorg/modules'; these paths were not queryable from the system.  If X fails to find the NVIDIA X driver module, please install the `pkg-config` utility and the X.Org SDK/development package for your distribution and reinstall the driver.
      • 根据实际需要选择是否安装NVIDIA32位兼容性库。

    4. 执行以下命令,检测DKMS的当前状态。

      sudo dkms status

      结果显示如下,表示DKMS已安装成功。

      [ecs-userxxx 2Z ~]$ sudo dkms status
      nvidia/470.141.03, 5.10.134-16.3.al8.x86_64, x86_64: installed
    5. 执行ls命令,查看/usr/src/nvidia-${nvidia 驱动版本}目录下是否存放NVIDIA GPU(Tesla)驱动相关文件。

      本示例以nvidia-${nvidia 驱动版本}nvidia-470.141.03为例,请替换成您实际的驱动版本。

      [ecs-user@xxx ~]$ ls  /usr/src/nvidia-470.141.03
      common  conftest.sh  dkms.conf  Kbuild  Makefile  nvidia  nvidia-drm  nvidia-modeset  nvidia-peermem  nvidia-uvm
      说明

      NVIDIA GPU(Tesla)驱动默认将其相关代码或文件存放在 /usr/src/nvidia-${nvidia 驱动版本} 目录下,以便DKMS在内核更新后自动重新编译和安装驱动程序的内核模块。

  2. 安装新内核触发DKMS自动构建NVIDIA GPU(Tesla)驱动。

    本示例以新内核版本5.10.134-15.al8为例,请您根据业务需要替换为实际的内核版本。

    重要

    建议先安装 kernel-devel包然后安装kernel/kernel-core包,否则,DKMS不会自动构建NVIDIA GPU(Tesla)驱动。因为kernel/kernel-core包触发DKMS,而DKMS构建NVIDIA GPU(Tesla)驱动需要kernel-devel包,此时需要手动触发DKMS构建NVIDIA GPU(Tesla)驱动。具体操作,请参见步骤3:手动触发DKMS构建Tesla驱动

    1. 执行以下命令,安装新内核的kernel-devel包。

      sudo rpm -ivh kernel-devel-5.10.134-15.al8.x86_64.rpm --force
      [ecs-user@xxx ~]$ sudo rpm -ivh kernel-devel-5.10.134-15.al8.x86_64.rpm --force
      Verifying...                          ################################# [100%]
      Preparing...                          ################################# [100%]
      Updating / installing...
         1:kernel-devel-5.10.134-15.al8     ################################# [100%]
    2. 安装kernel/kernel-core包。

      本示例以安装kernel包为例。对于Alibaba Cloud Linux 3系统来说,需要安装kernel-core包,执行sudo rpm -ivh kernel-core-5.10.134-15.al8.x86_64.rpm --force命令即可。

      sudo rpm -ivh kernel-5.10.134-15.al8.x86_64.rpm --force
      sudo rpm -ivh kernel-5.10.134-15.al8.x86_64.rpm --force
      Verifying...                          ################################# [100%]
      Preparing...                          ################################# [100%]
      Updating / installing...
         1:kernel-5.10.134-15.al8           ################################# [100%]
    3. 执行以下命令,检查新内核下NVIDIA GPU(Tesla)驱动是否构建成功。

      find /lib/modules/5.10.134-15.al8.x86_64/ -name *nvidia*
      [ecs-user@iZxxxxxrjl6Z ~]$ find /lib/modules/5.10.134-15.al8.x86_64/ -name *nvidia*
      /lib/modules/5.10.134-15.al8.x86_64/extra/nvidia-drm.ko
      /lib/modules/5.10.134-15.al8.x86_64/extra/nvidia-uvm.ko
      /lib/modules/5.10.134-15.al8.x86_64/extra/nvidia.ko
      /lib/modules/5.10.134-15.al8.x86_64/extra/nvidia-peermem.ko
      /lib/modules/5.10.134-15.al8.x86_64/extra/nvidia-modeset.ko
    4. 执行sudo dkms status检查DKMS是否存在新的内核记录。

      [ecs-user@ixxxxxxxxxxrjl6Z ~]$ sudo dkms status
      nvidia/470.161.03, 5.10.134-15.al8.x86_64, x86_64: installed    # 目标内核版本
      nvidia/470.161.03, 5.10.134-16.3.al8.x86_64, x86_64: installed
      nvidia/470.161.03, 5.10.134-17.1.al8.x86_64, x86_64: installed
  3. (条件必选)如果您先安装了kernel/kernel-core包,然后安装kernel-devel包,需手动触发DKMS构建NVIDIA GPU(Tesla)驱动。

    1. 执行以下命令,构建NVIDIA GPU(Tesla)驱动。

      sudo dkms build -m nvidia -v ${nvidia 驱动的版本} -k ${新的内核版本} --force

      主要参数说明如下:

      • ${nvidia 驱动的版本}:请替换为NVIDIA GPU(Tesla)驱动的具体版本号,例如470.141.03

      • ${新的内核版本}:请替换为新内核的具体版本号,例如5.10.134-15.al8.x86_64

      [ecs-t...xxx...zd34Z ~]$ sudo dkms build -m nvidia -v 470.161.03 -k 5.10.134-15.al8.x86_64 --force
      Sign command: /lib/modules/5.10.134-15.al8.x86_64/build/scripts/sign-file
      Signing key: /var/lib/dkms/mok.key
      Public certificate (MOK): /var/lib/dkms/mok.pub
      Building module:
      Cleaning build area...
      Building module(s).....
      Signing module /var/lib/dkms/nvidia/470.161.03/build/nvidia.ko
      Signing module /var/lib/dkms/nvidia/470.161.03/build/nvidia-uvm.ko
      Signing module /var/lib/dkms/nvidia/470.161.03/build/nvidia-modeset.ko
      Signing module /var/lib/dkms/nvidia/470.161.03/build/nvidia-drm.ko
      Signing module /var/lib/dkms/nvidia/470.161.03/build/nvidia-peermem.ko
      Cleaning build area...
      DKMS: build completed.
    2. 执行以下命令,安装已构建好的NVIDIA GPU(Tesla)驱动。

      sudo dkms install -m nvidia -v ${nvidia 驱动版本} -k ${新的内核版本} --force
      [ecs-us xxx d34Z ~]$ sudo dkms install -m nvidia -v 470.161.03 -k 5.10.134-15.al8.x86_64 --force
      nvidia.ko:
      Running module version sanity check.
       - Original module
         - No original module exists within this kernel
       - Installation
         - Installing to /lib/modules/5.10.134-15.al8.x86_64/extra/
      nvidia-uvm.ko:
      Running module version sanity check.
       - Original module
         - No original module exists within this kernel
       - Installation
         - Installing to /lib/modules/5.10.134-15.al8.x86_64/extra/
      nvidia-modeset.ko:
      Running module version sanity check.
       - Original module
         - No original module exists within this kernel
       - Installation
         - Installing to /lib/modules/5.10.134-15.al8.x86_64/extra/
      nvidia-drm.ko:
      Running module version sanity check.
       - Original module
         - No original module exists within this kernel
       - Installation
         - Installing to /lib/modules/5.10.134-15.al8.x86_64/extra/
      nvidia-peermem.ko:
      Running module version sanity check.
       - Original module
         - No original module exists within this kernel
       - Installation
         - Installing to /lib/modules/5.10.134-15.al8.x86_64/extra/
      Adding any weak-modules
      depmod...
      DKMS: install completed.
         - Installing to /lib/modules/5.10.134-15.al8.x86_64/extra/
      nvidia-peermem.ko:
      Running module version sanity check.
       - Original module
         - No original module exists within this kernel
       - Installation
         - Installing to /lib/modules/5.10.134-15.al8.x86_64/extra/
      Adding any weak-modules
      depmod...
    3. 执行以下命令,检查新内核安装目录下NVIDIA GPU(Tesla)驱动是否已安装。

      find /lib/modules/5.10.134-16.3.al8.x86_64/ -name *nvidia*
      /lib/modules/5.10.134-16.3.al8.x86_64/extra/nvidia.ko
      /lib/modules/5.10.134-16.3.al8.x86_64/extra/nvidia-modeset.ko
      /lib/modules/5.10.134-16.3.al8.x86_64/extra/nvidia-drm.ko
      /lib/modules/5.10.134-16.3.al8.x86_64/extra/nvidia-peermem.ko
    4. 执行sudo dkms status检查DKMS是否存在新的内核记录。

      [ecs-u xxx pzd34Z ~]$ sudo dkms status
      nvidia/470.161.03, 5.10.134-15.al8.x86_64, x86_64: installed
      nvidia/470.161.03, 5.10.134-16.3.al8.x86_64, x86_64: installed

重新适配NVIDIA GPU(Tesla)驱动

如果内核升级后导致内核的kAPI受到影响发生变化,通过DKMS无法自动构建和安装NVIDIA GPU(Tesla)驱动,您需要重新适配NVIDIA GPU(Tesla)驱动。具体操作,请参见:GPU计算型实例中手动安装Tesla驱动(Linux)