Featured image of post Nvidia显卡(三):Fedora下的游戏、CUDA、深度学习、Docker等

Nvidia显卡(三):Fedora下的游戏、CUDA、深度学习、Docker等

在Fedora上使用Nvidia显卡的相关设置:游戏、CUDA编程、深度学习、Docker容器等

缘起

这是“Nvidia显卡”系列文章的第三篇,本系列文章主要记录如何使用Nvidia显卡,尤其是在Linux系统上使用Nvidia显卡。在之前的文章中,我记录了在Ubuntu系统上使用Nvidia显卡的相关设置,包括游戏、CUDA编程、深度学习、Docker容器等。现在我已经从Ubuntu迁移到了Fedora系统,而在Fedora上使用Nvidia显卡的设置与Ubuntu有所不同,所以在这里记录一下。

本系列的其他文章参见:

Fedora安装Nvidia显卡驱动

查看显卡信息

首先,我们需要查看一下我们的显卡信息,打开终端,输入以下命令:

1
lspci | grep VGA

如果你的电脑上安装了英伟达的显卡,你会看到类似以下的输出:

1
01:00.0 VGA compatible controller: NVIDIA Corporation Device 2803 (rev a1)

不知道为啥,我的电脑上显示的是NVIDIA Corporation Device 2803,而不是RTX 4060 Ti,不过没关系,我们只需要知道这是一块英伟达的显卡就行了。

安装Nvidia显卡驱动

在Ubuntu中,我们使用了apt源里的graphics-drivers包来安装Nvidia显卡驱动,而在Fedora中,我们需要使用rpmfusion源来安装Nvidia显卡驱动。

相比直接从Nvidia官网下载安装包,使用rpmfusion源安装Nvidia显卡驱动更为简单和方便,同时由于rpmfusion中的驱动是经历过在Fedora中测试的,所以更为稳定。主要步骤如下:

  1. 添加rpmfusion源:

    1
    2
    
    sudo dnf install https://download1.rpmfusion.org/free/fedora/rpmfusion-free-release-$(rpm -E %fedora).noarch.rpm
    sudo dnf install https://download1.rpmfusion.org/nonfree/fedora/rpmfusion-nonfree-release-$(rpm -E %fedora).noarch.rpm
    

    也可以在RPM Fusion官网下载与你的Fedora版本对应的rpmfusion源安装包,在Fedora系统里直接双击下载的安装包,Fedora会自动打开Discover软件中心,点击标题栏的“安装”按钮即可。一般我们需要安装两个源:rpmfusion-freerpmfusion-nonfree,前者包含了开源软件,后者包含了非开源软件。

    装好之后可以更新一下软件源:

    1
    
    sudo dnf update
    
  2. 安装Nvidia显卡驱动:

    可以参考RPM Fusion官网的说明,使用以下命令安装Nvidia显卡驱动:

    1
    2
    
    sudo dnf install akmod-nvidia # rhel/centos users can use kmod-nvidia instead
    sudo dnf install xorg-x11-drv-nvidia-cuda #optional for cuda/nvdec/nvenc support
    

    这里的akmod-nvidia是Fedora中Nvidia显卡驱动的包名,安装后会自动编译内核模块。

  3. (可选)安全启动:

    什么是安全启动

    安全启动是一种安全标准,旨在确保计算机在启动时只加载经过验证的操作系统和软件。它可以防止恶意软件在系统启动时加载,从而提高系统的安全性。简单来说,安全启动可以确保只有可信的软件才能在系统启动时运行。

    安全启动是如何工作的

    1. UEFI固件中有一个安全启动数据库,用于存储所有被信任的公钥和证书。一般来说,被信任的公钥包括操作系统厂商、硬件厂商等的公钥,以及用户自己生成的公钥。
    2. 当计算机启动时,UEFI固件会验证每个加载的组件(如操作系统内核、驱动程序等)是否被信任。
    3. 只有在安全启动数据库中注册的组件才能被加载,未授权的组件将被阻止。

    Linux内核模块(如Nvidia显卡驱动)需要经过签名才能在启用了安全启动的系统上加载。如果内核模块没有签名,或者签名不被信任,那么在启用了安全启动的系统上,这些模块将无法加载,从而导致显卡驱动无法工作。这就是为什么安装了Nvidia显卡驱动后,需要为Linux内核模块生成签名并注册到安全启动数据库中。

    我是否需要安全启动

    对于普通用户(即对电脑了解有限,也不了解电脑启动过程的用户)而言,我的建议是启用安全启动;对于高级用户(知道自己在干什么,尤其是知道系统在启动时在干什么,或者知道自己让系统在启动时干什么的用户)而言,我的建议是可以禁用安全启动。

    如果你的电脑启用了安全启动

    如果你的电脑启用了安全启动(Secure Boot),可能会导致Nvidia显卡驱动无法加载。你可以在BIOS中禁用安全启动。

    如果你不想禁用安全启动,可以参考RPM Fusion官网的说明,注册一个密钥并将其添加到你的系统中,以启用安全启动。具体步骤如下:

    • 安装相关工具

      1
      
      sudo dnf install kmodtool akmods mokutil openssl
      
    • 生成密钥

      1
      
      sudo kmodgenca -a
      
    • 注册密钥

      1
      
      sudo mokutil --import /etc/pki/akmods/certs/public_key.der
      

      这里会提示你设置一个密码,这个密码在重启后需要输入。

    注意:由于这里是给当前的内核版本生成密钥,所以之后一旦更新了内核版本,就可能需要重新生成密钥并注册(即重复生成密钥注册密钥的步骤)。

  4. 重启电脑

    • 如果你在上一步设置了安全启动,重启后进入MOK管理界面,选择“Enroll MOK”,输入你设置的密码,完成后继续启动系统。
    • 如果你在上一步禁用了安全启动,直接重启电脑即可。
  5. 确认显卡驱动是否安装成功:

    1
    
    nvidia-smi
    

    如果你看到了类似以下的输出,那么恭喜你,你的Nvidia显卡驱动安装成功了:

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    
    +-----------------------------------------------------------------------------+
    | NVIDIA-SMI 470.57.02    Driver Version: 470.57.02    CUDA Version: 12.5     |
    |-------------------------------+----------------------+----------------------+
    | GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
    | Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
    |                               |                      |               MIG M. |
    |===============================+======================+======================|
    |   0  NVIDIA RTX 4060 Ti  Off  | 00000000:01:00.0 Off |                  N/A |
    | N/A   41C    P8    10W /  N/A |      0MiB /  7611MiB |      0%      Default |
    |                               |                      |                  N/A |
    +-------------------------------+----------------------+----------------------+
    

测试显卡

我们可以使用glmark2来测试显卡性能。

  1. 安装glmark2
1
sudo dnf install glmark2
  1. 运行glmark2
1
glmark2

如果在终端中看到了类似以下的输出,那么说明显卡性能测试成功:

1
2
3
4
5
6
7
8
=======================================================
    glmark2 2021.02
=======================================================
    OpenGL Information
    GL_VENDOR:     NVIDIA Corporation
    GL_RENDERER:   NVIDIA GeForce RTX 4060 Ti/PCIe/SSE2
    GL_VERSION:    4.6.0 NVIDIA 555.58.02
=======================================================

并且会有一个窗口弹出来,显示正在测试的内容。测试完成后,终端中会显示测试的分数。

glmark2

游戏

Linux系统本来是不太适合玩游戏的,但是随着Steam的推广,越来越多的游戏可以通过Proton在Linux上运行。Proton是Valve开发的一个基于Wine的工具,可以在Linux上运行Windows游戏。

在Ubuntu上安装Steam还需要安装一些额外的依赖包,并且手动安装Proton。而在Fedora上,安装Steam就非常简单了,而且默认就包含了Proton。

安装Steam

  1. 安装Steam:
1
sudo dnf install steam
  1. 登录Steam账号

在开始菜单中找到Steam就可以点击打开,登录你的Steam账号即可。

Steam

安装游戏

如果你是第一次使用Steam,尚未购买任何游戏,你可以选择一些免费的游戏进行测试,例如《Dota 2》、《Counter-Strike: Global Offensive》等。

Dota 2

启动游戏

安装好之后可以点击“Launch”来启动游戏,但是第一次启动往往不会成功,需要启动三次。

Steam组件

  • 第一次启动会卡在下载一个组件上面,点开下载管理,发现它试图下载Steam Linux Runtime 2.0。但不知为何一直无法启动下载,而且明明已经有来Steam Linux Runtime 3.0。我只能取消启动。
  • 第一次取消启动之后再次启动游戏,Steam Linux Runtime 2.0会被成功下载,游戏进入加载界面。但会卡在一个全屏黑屏的界面。只能点击停止游戏。
  • 第三次启动游戏,这次游戏会成功加载,进入着色器编译阶段。等待着色器编译完成就可以正常启动了。

手柄

如果你使用手柄,还需要一点点额外的配置。默认使用USB线来连接但话直接就能玩。

如果使用XBox手柄,可以通过蓝牙连接。但即使连上,你可能会发现手柄依然不能控制游戏。这是因为缺少相关驱动,我们可以安装xpadneo包来解决这个问题:

1
sudo dnf install xpadneo

然后重新连接蓝牙。连接上时手柄会轻微震动一下,而之前连接时是没有震动的,这说明手柄已经成功被识别,可以用来玩游戏了。

CUDA编程

CUDA是英伟达公司推出的并行计算平台和编程模型,可以利用GPU的并行计算能力,加速计算密集型应用程序。CUDA编程需要安装Nvidia显卡驱动和CUDA工具包。而且CUDA版本和Nvidia显卡驱动版本有一定的对应关系,需要根据自己的显卡驱动版本选择合适的CUDA版本。

2025年8月更新:安装完发现这样安装还是不行,主要是Fedora 42和CUDA 12.9的兼容性问题。可直接参见最后的“问题”部分。

安装CUDA

  1. 查看Nvidia显卡驱动需要的CUDA版本:
1
nvidia-smi

CUDA Version一行中,可以看到Nvidia显卡驱动需要的CUDA版本,例如CUDA Version: 12.9。即我们需要安装CUDA 12.9。

  1. 安装CUDA:

在Ubuntu中安装CUDA时,我们直接参照了Nvidia官网上的安装指南。

在Fedora中,由于我们刚才在安装驱动时用的时RPM Fusion仓库,直接参照Nvidia官网的话可能会遇到版本不匹配的问题。例如上一步中我们查到需要安装CUDA 12.9,但在Nvidia官网上可能只提供CUDA 13.0的安装包,如果直接按照Nvidia官网上的指示安装,就会造成版本不匹配的问题。这是因为RPM Fusion在Nvidia官方发布驱动之后还要测试,稳定之后才会推送到RPM仓库。因此我们这里还是要按照RPM Fusion上的说明来安装CUDA。

其命令如下:

1
2
3
4
5
sudo dnf config-manager addrepo --from-repofile=https://developer.download.nvidia.com/compute/cuda/repos/fedora41/$(uname -m)/cuda-fedora41.repo
sudo dnf clean all
sudo dnf module disable nvidia-driver
sudo dnf config-manager setopt cuda-fedora41-$(uname -m).exclude=nvidia-driver,nvidia-modprobe,nvidia-persistenced,nvidia-settings,nvidia-libXNVCtrl,nvidia-xconfig
sudo dnf -y install cuda-toolkit

注意到上面的命令中安装的CUDA版本是为Fedora 41准备的,而我们的Fedora版本是42。但是不用担心,RPM Fusion上的说明里也提到了,上述命令对于Fedora 41之后的版本都适用。

  1. 配置环境变量:

如果安装成功,你会在/usr/local/cuda-12.9目录下看到CUDA的安装文件。同时你会在/usr/local/cuda目录下看到一个指向/usr/local/cuda-12.9的软链接。如果之后升级CUDA版本,/usr/local/cuda会指向新的CUDA版本目录。

我们需要配置环境变量,使得CUDA可以被找到。将cuda的bin目录和lib64目录添加到PATH和LD_LIBRARY_PATH环境变量时,我们使用/usr/local/cuda目录,而不是/usr/local/cuda-12.9目录,因为这样可以在以后升级CUDA版本时不需要修改环境变量。

如果你使用bash,可以在~/.bashrc文件中添加以下内容:

1
2
3
echo 'export PATH=/usr/local/cuda/bin${PATH:+:${PATH}}' >> ~/.bashrc
echo 'export LD_LIBRARY_PATH=/usr/local/cuda/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}' >> ~/.bashrc
source ~/.bashrc

如果使用其他shell,可以将以上内容添加到对应的配置文件中。

  1. 测试CUDA:
1
nvcc --version

如果你看到了类似以下的输出,那么说明CUDA安装成功:

1
2
3
4
5
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2024 NVIDIA Corporation
Built on Thu_Jun__6_02:18:23_PDT_2024
Cuda compilation tools, release 12.9, V12.9.82
Build cuda_12.9.r12.9/compiler.34385749_0

问题

经历上面的步骤,看似我们已经成功安装了CUDA,但实际上上面的编译器在Fedora 42中是不能用的。如果你直接使用它来编译,会报错gcc版本不匹配。因为上面安装的CUDA版本是12.9,它只匹配GCC 14及以下的版本,而Fedora 42默认安装的是GCC 15。

而且这个问题也无法通过安装GCC 14来解决,因为即使安装了GCC 14,Fedora 42中的库、头文件之类的仍然是GCC 15的版本,所以编译时仍会报错。

这个问题很难解决,一个办法是不再使用RPM Fusion来安装Nvidia驱动、CUDA等,而是直接从Nvidia官网下载安装包来安装CUDA 13.0及对应的驱动。CUDA 13.0是支持GCC15的,然而这依然会有两个问题:

  1. 无法使用Fedora的包管理系统来管理Nvidia驱动和CUDA的安装和升级。万一有跟他们相关的依赖是由Fedora管理的,那么没准哪一次更新时就会更新失败。问题严重时甚至会影响系统的稳定性。
  2. 深度学习常用的PyTorch至今(2025年8月)仍未适配CUDA 13.0,所以安装了CUDA 13.0仍然无法搞很多深度学习。

如果你非要使用Fedora系统,我认为目前(2025年8月)有两个解决方案:

  • 一是放弃Fedora 42,转向Fedora 41。但这估计不能通过简单的系统版本降级来实现,因为牵涉到的东西太多。估计只能重装系统。
  • 二是使用虚拟化的容器来配置。等到之后RPM Fusion和PyTorch都支持CUDA 13.0了,或许可以再把容器丢掉。

我思考过后选择了第二个选项。我决定把安装好的Nvidia驱动和CUDA先放在这里,另起一个docker/Podman容器来配置CUDA编程和深度学习开发环境。主要想法是在容器中运行Ubuntu 24.04,安装与之兼容的CUDA和Nvidia驱动,由于PyTorch暂未支持CUDA 13.0,因此在容器中使用CUDA 12.9。具体配置过程我会另起一篇文章,请参见:

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计