SDB:NVIDIA drivers
默认情况下,openSUSE 为 NVIDIA GPU 提供开源的 nouveau 驱动程序,但是某些 特性可能不受支持,需要使用 NVIDIA 驱动程序代替。
NVIDIA 提供一个 开源模块和专有模块。 NVIDIA 推荐开源模块(如果设备支持)。 您可以在 这篇 openSUSE 博客文章中找到有关安装驱动程序的更多详细信息。
如果您禁用了多版本内核软件包,请确保在 /etc/zypp/zypp.conf 中重新启用它们。 它应该包含行 multiversion = provides:multiversion(kernel)。
出于 许可原因,驱动程序通过 NVIDIA 的 openSUSE 仓库提供。 您第一次重新加载软件仓库时,系统会询问您是否信任 NVIDIA 的 GPG 密钥。 此密钥的指纹应为 2FB0 3195 DECD 4949 2BD1 C17A B1D0 D788 DB27 FD5A。
如果您正在升级到新的 GPU,我们建议您在更换显卡之前卸载任何可能特定于旧硬件的 NVIDIA 驱动程序。
添加 NVIDIA 仓库
通常,当安装程序检测到正确的硬件时,Nvidia 仓库默认会添加。 仅当尚未添加时才添加仓库。
通过 Leap、Tumbleweed、Slowroll 上的终端
作为 root 用户,在终端中输入以下命令之一(与您的 openSUSE 分发版风格匹配)。
# zypper install openSUSE-repos-Leap-NVIDIA # zypper install openSUSE-repos-Tumbleweed-NVIDIA # zypper install openSUSE-repos-Slowroll-NVIDIA
或
# zypper addrepo --refresh 'https://download.nvidia.com/opensuse/leap/$releasever' NVIDIA # zypper addrepo --refresh https://download.nvidia.com/opensuse/tumbleweed NVIDIA
(目前 Tumbleweed 仓库也由 Slowroll 使用。)
通过 Aeon、Kalpa、Leap Micro 上的终端
为了成功安装驱动程序,需要更多步骤。 作为 root 用户,在终端中输入以下命令
# cp /usr/etc/transactional-update.conf /etc/transactional-update.conf
使用超级用户权限打开新创建的文件
# vim /etc/transactional-update.conf
调整并取消注释 ZYPPER_AUTO_IMPORT_KEYS
ZYPPER_AUTO_IMPORT_KEYS=1
使用 ESC + :q 保存文件。 作为 root 用户,在终端中输入以下命令
# transactional-update -i pkg install openSUSE-repos-MicroOS-NVIDIA
安装
自动安装(在 Tumbleweed 上测试过)
要自动检测并安装适合您硬件的驱动程序,请运行
# zypper install-new-recommends
在 Leap 15.6 和 Tumbleweed 上安装开源驱动程序
不幸的是,在我们的 Leap 15.6 和 Tumbleweed 仓库中,我们仍然有旧版专有驱动程序(版本 550)的软件包,这些软件包仍然注册用于 Turing+ GPU。 原因在于,当时开源驱动程序尚未被认为对桌面环境稳定。 因此,如果您拥有 Turing+ GPU(使用 inxi -aG 检查),并且希望在 Leap 15.6 上使用开源驱动程序(推荐!),请使用以下命令代替上面的命令。
# zypper in nvidia-open-driver-G06-signed-kmp-meta
否则,您最终会得到一个初始的专有驱动程序版本 550,然后该版本将被更新到当前版本的专有驱动程序,但不会自动替换为开源驱动程序。
手动安装
获取硬件信息
在终端中
# lspci | grep VGA # lscpu | grep Arch
或者
# hwinfo --gfxcard | grep Model # hwinfo --arch
使用 inxi 工具
# inxi -G # inxi -Ga
确定驱动程序版本
要确定适合您显卡的适当驱动程序版本,请将您的硬件信息输入到 NVIDIA 的驱动程序搜索引擎。
注意:NVIDIA 驱动程序版本映射到以下命名约定,如下所示。 当您准备好通过命令行/zypper 安装时,您需要此信息。
- G03 = 驱动程序 v340 = 遗留驱动程序
- G04 = 驱动程序 v390 = 遗留驱动程序
- G05 = 驱动程序 v470 = 遗留驱动程序
- G06 = 驱动程序 v550/v580
通过 Myrlyn 手动安装(适用于 Leap 和 Tumbleweed)
- 打开 Myrlyn
- 查看 > 仓库 > NVIDIA
- 选择适当的驱动程序,例如
x11-video-nvidiaG04或x11-video-nvidiaG05或nvidia-video-G06 - 可选地选择相应的 OpenGL 加速库;
nvidia-glG04或nvidia-glG05或nvidia-gl-G06。 - 按“接受”。
- 重新启动您的计算机。
通过命令行手动安装
目前,这是在 openSUSE Aeon 和 Kalpa 中安装驱动程序的唯一方法。
一旦您知道哪个产品映射到适当的驱动程序命令映射(例如 G04 或 G05 或 G06),您可以使用
Leap 和 Tumbleweed
# zypper in <x11-video-nvidiaG04 or x11-video-nvidiaG05 or nvidia-video-G06> # zypper in <nvidia-glG04 or nvidia-glG05 or nvidia-gl-G06> # zypper in <nvidia-computeG04 or nvidia-computeG05 or nvidia-compute-G06 and nvidia-compute-utils-G06>
Aeon、Kalpa 和 MicroOS
/etc/zypp/zypper.conf,如下所示# vim /etc/zypp/zypper.conf
取消注释该行
#autoAgreeWithLicenses = no
并将其更改为
autoAgreeWithLicenses = yes
安装正确的 GPU 驱动程序
- 对于 nvidia-open-driver-G06
# transactional-update -i pkg in nvidia-open-driver-G06-signed-kmp-default
# version=$(rpm -qa --queryformat '%{VERSION}\n' nvidia-open-driver-G06-signed-kmp-default | cut -d "_" -f1 | sort -u | tail -n 1)
# transactional-update --continue -i pkg in nvidia-video-G06 == ${version} nvidia-compute-utils-G06 == ${version}
- 对于 nvidia-video-G06
# transactional-update -i pkg in nvidia-driver-G06-kmp-default nvidia-video-G06 nvidia-gl-G06 nvidia-compute-G06
- 对于 x11-video-nvidiaG05
# transactional-update -i pkg in nvidia-gfxG05-kmp-default x11-video-nvidiaG05 nvidia-glG05 nvidia-computeG05
- 对于 x11-video-nvidiaG04
# transactional-update -i pkg in nvidia-gfxG04-kmp-default x11-video-nvidiaG04 nvidia-glG04 nvidia-computeG04
将 rd.driver.blacklist=nouveau 附加到 /etc/kernel/cmdline,并运行
# transactional-update --continue initrd
重新启动您的计算机,然后使用 dmesg 和 lsmod 验证是否已成功加载 NVIDIA 模块。
Secureboot
Leap 和 Tumbleweed 中的内核默认情况下将拒绝在启用 安全启动的机器上加载任何未签名的内核模块。
在 NVIDIA 驱动程序安装期间,会创建一个 MOK 密钥对,并且内核模块使用创建的私钥进行签名。 创建的证书(公钥)保留在以下存储中 /usr/share/nvidia-pubkeys,并且安装程序尝试将其导入到要注册的 MOK 公钥列表中。
在接下来的重新启动期间,可以轻松地将此证书注册到 MOK 数据库。 用于此目的的 EFI 工具(mokutil)会自动启动:在工具内部,选择“注册 MOK”,然后选择“继续”,然后选择“是”。 提示输入密码时,使用 root 密码(美国键盘布局!)。 现在,证书已添加到 MOK 数据库,并被视为受信任,这将允许加载具有匹配签名的内核模块。 要完成,从那里选择“重新启动”。
如果导入失败(例如,未设置 root 密码),或者在第一次重新启动后错过证书注册的超时,您可以再次导入证书,方法是运行以下命令
- 对于 nvidia-driver-G0X(X >= 6)
# mokutil --import /usr/share/nvidia-pubkeys/MOK-nvidia-driver-G0<X>-<driver_version>-<kernel_flavor>.der --root-pw
- 对于 nvidia-gfxG0X(X < 6)
# mokutil --import /usr/share/nvidia-pubkeys/MOK-nvidia-gfxG0<X>-<driver_version>-<kernel_flavor>.der --root-pw
然后重新启动机器并按照上述步骤注册证书。
作为最后的手段,如果您在使用安全启动时遇到问题,您可以自行承担风险禁用内核模块的验证
# mokutil --disable-validation
驱动程序更新
在驱动程序更新期间,旧的和不再使用的公钥正在注册以从 MOK 数据库中删除。 因此,除了“注册 MOK”菜单项外,在重新启动机器后,MOK 工具中还会出现“删除 MOK”菜单项。 为了最终从 MOK 数据库中删除它,请选择“删除 MOK”,然后选择“继续”,然后选择“是”。 提示输入密码时,使用 root 密码(美国键盘布局!)。 您可以在选择“查看密钥 X”时查看证书/描述,以便不要删除错误的密钥。 从那里按任意键继续。
卸载 NVIDIA 驱动程序
识别已从 NVIDIA 仓库安装的每个软件包。 由于仓库名称可能不同,具体取决于添加方式,因此首先需要识别正确的仓库
# zypper lr # zypper search -ir <repo name or number>
为了进行适当的清理,您可能需要卸载所有列出的软件包。
在安装 NVIDIA 驱动程序时,nouveau 驱动程序已被列入黑名单。 为了确保开源驱动程序能够接管,请确保 /etc/modprobe.d/ 中没有包含 blacklist nouveau 字样的文件。 另外,检查 /etc/default/grub 是否不再包含 rd.driver.blacklist=nouveau,并且 grub2-mkconfig -o /boot/grub2/grub.cfg 运行以更新 grub.cfg。 另外,如果未自动发生,请删除或重命名 /lib/modprobe.d/09-nvidia-modprobe-bbswitch-G04.conf。 卸载软件包后,您可能需要通过运行重新创建 initrd
# dracut -f --regenerate-all
故障排除
- https://en.opensuse.net.cn/SDB:NVIDIA_troubleshooting
- 如果您在安装专有驱动程序后在登录屏幕之前计算机冻结,并且您正在使用 GDM(通常如果您正在使用 GNOME 的情况),请尝试在 /etc/gdm/custom.conf 中添加 WaylandEnable=false。 这将禁用 GNOME Wayland 会话作为登录期间的选项。 如果您希望 Wayland 仍然启用,请运行以下命令并重新启动。
# sudo ln -sfv /dev/null /etc/udev/rules.d/61-gdm.rules
- 您可以通过在终端中运行
lsmod | grep nvidia来验证驱动程序是否已加载。 输出应如下所示
nvidia_drm 57344 2
nvidia_modeset 1187840 3 nvidia_drm
nvidia_uvm 1110016 0
nvidia 19771392 81 nvidia_uvm,nvidia_modeset
drm_kms_helper 229376 2 nvidia_drm,i915
drm 544768 13 drm_kms_helper,nvidia_drm,i915
中间列中的数字不必相同。 如果加载了驱动程序,则问题在于其他地方,因为这意味着它已成功安装。
- 如本指南前面所述,如果您正在使用安全启动,请务必接受 MOK,否则模块将无法加载。判断安全启动是否可能阻止模块加载的一种方法是查看
dmesg的输出,并搜索如下警告
Lockdown: modprobe: unsigned module loading is restricted; see man kernel_lockdown.7
modprobe: ERROR: could not insert 'nvidia': Required key not available
参见
Optimus 和 Switcheroo 控制
使用 NVIDIA Optimus(通常笔记本电脑上的情况)硬件配置的用户建议阅读 Switcheroo 控制说明。
CUDA
参与高性能计算应用开发的开发者和用户可能需要安装 CUDA 库。更多信息请参见 CUDA 工具包文档和 NVIDIA 开发者 上的下载链接。
这些资源不包含对 Aeon、Kalpa 和 MicroOS 用户的支持,只能用作信息背景。
openSUSE 现在有一个 cuda-cloud-opengpu 元包,它维护着 CUDA 工具、驱动版本、容器工具和可用内核的有效组合。 以前,具有不同更新周期的不同仓库会导致这些软件包之间出现不匹配。
注意 所有先前单独安装的 NVIDIA 包必须先删除! 元包必须是唯一直接安装的包,否则它将无法控制驱动程序、库和内核之间的链接更新何时发生。
Aeon、Kalpa、MicroOS 用户注意: 以下操作需要在交互式 transactional-update shell 中完成,即:sudo transactional-update -c shell
1. 查找已安装的 NVIDIA 工具和驱动程序
zypper search -si nvidia cuda
2. 删除已安装的 NVIDIA 包,以获得干净的起点
# zypper rm *nvidia* *cuda*
3. 验证您是否已按照 第一章 中所述添加了 NVIDIA 仓库。
4. 添加 CUDA 仓库
# zypper addrepo -f https://developer.download.nvidia.com/compute/cuda/repos/opensuse15/x86_64/ cuda
5. 安装 Open Kernel 驱动程序和 cuda-cloud-opengpu 元包
# zypper in nvidia-open-driver-G06-signed-cuda-kmp-default
# version=$(rpm -qa --queryformat '%{VERSION}\n' nvidia-open-driver-G06-signed-cuda-kmp-default | cut -d "_" -f1 | sort -u | tail -n 1)
# zypper install cuda-cloud-opengpu = ${version}
警告 预构建的 NVIDIA 驱动程序针对特定的内核版本,但由 NVIDIA 独立发布。 每次 openSUSE 发布新的内核版本时,NVIDIA 的驱动程序都会滞后,并且无法为较新的内核提供更新。 这不会导致安装错误,只是无法为新内核提供 NVIDIA 驱动程序。 您必须手动检查每次更新是否提供了 NVIDIA 驱动程序,或者设置一个 health-checker 脚本来执行此操作(这将导致每次更新失败并回滚,直到 NVIDIA 最终发布更新的驱动程序)。
警告 NVIDIA 经常在 cuda 仓库中发布新的 cuda-cloud-opengpu 版本,这些版本是不完整的。 Zypper 在自动更新期间,但是会始终忽略有关缺少依赖项的警告,并盲目安装它(自动确认更新/安装的 -y 也会确认损坏的更新/安装,无法区分)。 强烈建议手动从 repo-non-free 仓库安装 cuda-cloud-opengpu,该仓库没有此问题。 但是,repo-non-free 和 cuda-opensuse-x86_64 都需要存在并启用,因为 repo-non-free 不包含 cuda-cloud-opengpu 的大多数依赖项。
NVIDIA 容器工具包
截至 2025-12-05,不应安装 NVIDIA 官方 容器工具包仓库,如果已安装,应禁用或删除。 nvidia-container-toolkit 和相关软件包现在由 CUDA 仓库 提供。
NVIDIA UVM 驱动程序未在启动时加载
NVIDIA UVM 驱动程序不由 nvidia-persistenced.service 加载,通常仅在库使用它时按需加载。 这包括运行 nvidia-smi 工具。 如果您在系统自动启动时使用的容器中使用 NVIDIA GPU,则此驱动程序将未加载,并且在尝试从容器内部使用它时将无法加载。 要解决此问题,请添加一个 systemd 服务单元,该单元将自动运行 nvidia-smi -L 以列出您的 NVIDIA GPU,但副作用是加载 NVIDIA UVM 驱动程序。 将其设置为将运行使用 NVIDIA GPU 的容器的 systemd 服务(s) 的弱依赖项。
示例 systemd 服务单元文件
# Within file /etc/systemd/system/nvidia-uvm.service [Unit] Description=Create the NVIDIA UVM device node by calling nvidia-smi After=nvidia-persistenced.service Wants=nvidia-persistenced.service ConditionPathExists=/usr/bin/nvidia-smi # Don't run if there are no NVIDIA devices. The nvidia-persistenced.service will have created # this device if any GPUs exist, as well as /dev/nvidia# nodes. ConditionPathExists=/dev/nvidia-modeset [Service] Type=oneshot # Use the call that just enumerates, which will load the devices for all GPUs. ExecStart=/usr/bin/nvidia-smi -L # Verify the UVM driver is present now, triggering a failure exit code if not ExecStartPost=/bin/bash -c 'test -c /dev/nvidia-uvm' RemainAfterExit=yes User=root TimeoutStartSec=30 Restart=no [Install] WantedBy=multi-user.target # Make sure we get run any time docker.service needs to start, but don't block docker if we fail. WantedBy=docker.service # Add any other services that start containers needing the NVIDIA GPU as additional WantedBy= here.
重新加载您的 systemd 守护程序,以便它了解您的新服务,然后启用它。
sudo systemctl daemon-reload sudo systemctl enable nvidia-uvm.service
CDI 更新
如果您使用 CDI 方法向容器提供 NVIDIA GPU 支持(使用 --device=nvidia.com/gpu=... 而不是 --gpus=...),则在驱动程序更新时可能会遇到故障。 CDI 配置文件需要在大多数驱动程序更新时重新生成,否则它们将指向错误的位置。 对于使用自动更新和自动重启的无人值守服务器,可以通过在每次启动时简单地重新运行生成步骤来自动执行此操作。
由于未能正确生成 CDI 描述文件不会导致 nvidia-ctk 命令覆盖现有文件,因此将其作为启动的一部分通常是安全的。
推荐: 使所有启动容器的 systemd 服务都对该服务具有软依赖关系。
示例 systemd 服务单元文件
# Within file /etc/systemd/system/nvidia-ctk-update.service [Unit] Description=Regenerate the NVIDIA CDI config After=nvidia-persistenced.service Wants=nvidia-persistenced.service ConditionPathExists=/usr/bin/nvidia-ctk # Don't run if there are no nvidia devices ConditionPathExists=/dev/nvidia-modeset [Service] Type=oneshot ExecStart=bash -c 'nvidia-ctk cdi generate --output=/etc/cdi/nvidia.yaml' RemainAfterExit=yes User=root TimeoutStartSec=30 Restart=no [Install] WantedBy=docker.service # Add any other services that start containers and need NVIDIA GPU access via CDI as additional WantedBy= values
然后重新加载 systemd 守护程序,以便它找到您的新文件,并启用它以在启动时运行。
sudo systemctl daemon-reload sudo systemctl enable nvidia-ctk-update.service

