## 安装 RTX 4060 

我购买的显卡是 微星 RTX 4060 NV Edition 8G ,这款限量版显卡外壳装饰有核弹厂绿色,个人觉得很好看,但是价格要比普通版贵 100。

MS RTX 4060 NV Edition 8G
MS RTX 4060 NV Edition 8G (this picture is stolen from MS official website)

笔者之前用 N 卡都是连服务器,自己的 PC 一直用的是 Intel 集显,没有独立显卡。这次安装显卡、驱动和相关软件包整个过程花费了 3 个小时左右,自己一边摸索一边踩了一点坑,这里记录一下,以后再折腾时可以参考,如果有朋友安装显卡时遇到问题,希望这些内容恰好能帮到你。

我第一次安装时,没有先把机箱背面的软板拆下来,而是插上显卡、插上电源、安装固定螺丝后直接开机,显卡是亮的,但显示器始终黑屏。我天真地以为,显卡正常安装 + 显示器 HDMI 连接到主板,就可以使用独显显示。实际上,显卡是有独立的 HDMI 接口用于连接显示器,插上显卡后,主板会屏蔽掉核显,显示器必须连接显卡才能正常显示。

折腾了一会,突然想起来,显卡一侧有几个接口 (?),于是重新给显卡卸下来看到了 HDMI 的接口,但机箱背面会挡住这些接口,捣鼓了几下原来这些背板可以拆!拍断大腿,我还以为机箱规格有问题,和显卡不适配!

tips1
机箱背面可拆卸的软质铁板,用于暴露显卡接口

另外在安装时需要注意的几点是:

  • 插拔显卡时需要摁住主板显卡插槽的卡扣,否则可能损伤到金手指。

    tips2
    特别注意在安装和拆卸显卡时,要摁住卡扣,垂直拔出,不要大力出奇迹
  • 显卡插上后机箱背面有固定螺丝需要安装,否则显卡会晃动,非常危险。

    tips3
    显卡插到主板上后,机箱背面要安装固定螺丝
  • 显卡供电使用电源的 PCI-E 接口。

    tips4
    显卡电源插口一般是 8pin 或 16pin,使用 1 组或 2 组 PCI-E 接口进行供电

最后,我使用的系统是 openSUSE Tumbleweed,当然,作为低贱的 Linux 用户,自然是没有 Windows 用户自带 NV 驱动的高贵特权。所以必须自己搞定驱动。

## 安装 NVIDIA Driver 

### 准备工作 

在显卡安装好成功点亮后,暂且先在 BIOS 设置中使用集显,开机安装显卡驱动。

我的 PC 搭载的是微星主板,开机后一直按 F12 进入 BIOS,导航到 "Settings -> Advanced -> Integrated Graphics Configuration" 设置页,设置 "Initiate Graphic Adaptor" 为 "IGD" (Integrated Graphics 即集成显卡),另一个选项是 "PEG" (PCI Express Graphics 即通过 PCIe 连接的显卡)。对于其他厂商的主板,我一概没用过,有问题的读者我相信你有能力自己解决 :D

集显开机后,首先用 lspci | grep VGA 查看系统 VGA 设备,看是否正常识别到了显卡。如果发现有集显和独显两个设备,那么就是正常的,否则检查前面的步骤。

get-nvidia-vga-device-info
查看系统 VGA 设备

我选择安装的是 NVIDIA 闭源专有驱动,我也建议你选择此驱动。用 lsmod | grep nvidia 检查一下是否有 NVIDIA 相关内核模块,如果有任何输出,请自行判断是否已装 NV 驱动以及是否需要卸载重装。

get-nvidia-kernel-module-info
检查内核 NVIDIA 相关模块,如果有的话你会看到类似这种的输出,否则不会有输出

你可能在装系统时安装了 nouveau 开源驱动 (此驱动不稳定且不支持较新的 NV 显卡,不推荐使用,请自行斟酌风险),为了正常安装专有驱动,需要先确保 nouveau 开源驱动已禁用。

# 检查是否有加载 nouveau 相关内核模块 (没有的话不会有任何输出)
$ lsmod | grep nouveau

# 执行下面的命令禁用 nouveau (openSUSE),就算没有 nouveau 也最好禁用一下
$ cat <<EOF | sudo tee /etc/modprobe.d/nvidia.conf
blacklist nouveau
options nouveau.modeset=0
EOF

# 重新生成 kernel initramfs
$ sudo dracut -f

# 重启机器
$ sudo reboot

# 重启后确保 nouveau 已被禁用
$ lsmod | grep nouveau

然后,需要确保 dkms 服务在你的系统上是正常运作的 (我的系统用的是 systemd 管理服务),如果没有的话用包管理器安装。如果 status 显示绿色 (enable 和 active),那就没啥问题了。

# 安装 dkms (如果没有)
$ sudo zypper install dkms

# 启动 dkms 服务
$ sudo systemctl enable --now dkms.service
Created symlink /etc/systemd/system/multi-user.target.wants/dkms.service → /usr/lib/systemd/system/dkms.service.

# 检查 dkms 状态
$ sudo systemctl status dkms.service
● dkms.service - Builds and install new kernel modules through DKMS
     Loaded: loaded (/usr/lib/systemd/system/dkms.service; enabled; preset: disabled)
     Active: active (exited) since Wed 2023-12-16 23:16:49 CST; 1s ago
       Docs: man:dkms(8)
    Process: 27990 ExecStart=/usr/sbin/dkms autoinstall --verbose --kernelver 6.6.6-1-default (code=exited, status=0/>
   Main PID: 27990 (code=exited, status=0/SUCCESS)
        CPU: 144ms

Dec 16 23:16:49 suse systemd[1]: Starting Builds and install new kernel modules through DKMS...
Dec 16 23:16:49 suse systemd[1]: Finished Builds and install new kernel modules through DKMS.

另外,还需要确保系统上有编译安装内核模块所需的头文件,驱动安装时必需。

# 安装构建内核模块所需的源文件 (如果没有)
$ sudo zypper install kernel-default-devel kernel-devel

### 安装驱动 

前往 https://www.nvidia.com/en-us/drivers/unix 根据你自己的内核类型和 CPU 指令集选择正确的驱动安装程序下载。执行安装程序后会进入一个用 ncurses 写的 TUI,根据提示选择 yes/no 即可完成安装。最后,使用 dracut 重新生成 Linux 启动镜像文件。注意程序名中的版本号是笔者当时安装时最新的驱动版本,你下载的安装程序名大概率是与我不同的。

# 添加执行权限
$ chmod +x NVIDIA-Linux-x86_64-535.146.02.run

# 运行驱动安装程序
$ sudo ./NVIDIA-Linux-x86_64-535.146.02.run

# 卸载驱动 (如果后续需要的话)
$ sudo ./NVIDIA-Linux-x86_64-535.146.02.run --uninstall

# 重新生成 Linux 启动镜像文件
$ sudo dracut -f

# 重启
$ sudo reboot

如果你是 Linux 用户,我强烈建议你装完驱动后,保留驱动安装程序,当你的系统滚挂了的时候,还可以进终端重新装 driver。

驱动安装完成后,什么也不做重启 PC,成功进入桌面,用 nvidia-smi 命令查看显卡状态,有下面的输出,说明驱动已经在正常工作了。但是,我们可以发现 "No running processes found" 而且显卡显存占用 "0MiB / 8188MiB",说明显卡根本没有在工作,难道它在偷懒吗 (?),还记得我们一开始装驱动时用的是集显 (不然无驱动状态下独显用不了啊),此时 BIOS 还没有设置使用独显,所以我们还需要进 BIOS 重新设置一下。

nvidia-smi-with-integrated-graphics
集显用于显示,独显可用于非图形相关工作

如果你没有使用独显显示和其他图形相关的需求 (比如只用来炼丹或写 CUDA),那么此时你已经拥有了一张性能可以完全释放和压榨的卡 (a freaking on-chip server?!),可以不用进 BIOS 设置独显了。但是,笔者确实有独显图形相关的需求 (指玩 Minecraft),所以还是得启用独显用于图形显示。重启进 BIOS 设置好后,再查看一下显卡状态,此时发现显存有占用了,X11 和 KDE 的各种进程也都用上了显卡。

nvidia-smi-with-pcie-graphics
禁用集显,仅用独显

我在后面使用中发现每次开机后都会有闪屏的问题,导致机器根本无法使用,我的窗口和桌面系统是 X11+KDE,在 nvidia-xconfig 生成的 /etc/X11/xorg.conf 配置文件的 Section "Device" 中加一行 Option "NoFlip" "true",然后重启即可彻底解决。这个配置选项将禁用 OpenGL Flipping (类似于某种交换 buffer 的操作?)。

In /etc/X11/xorg.conf
Section "Device"
    Identifier     "Device0"
    Driver         "nvidia"
    VendorName     "NVIDIA Corporation"
+   Option "NoFlip" "true"
EndSection

如果你使用的不是 X 窗口系统 (比如 Wayland) 但出现了类似的问题,这个方法肯定是不会奏效的,你已经是一个成熟的 Linux 用户了,相信你一定有能力自己解决 :D

玩 Minecraft 从未感到如此流畅,一口气尝试了各种小时候垂涎三尺的光影材质包,2k 帧率基本上都稳定在 100 FPS (虽然我显示器只有 60Hz),画质十分美丽,感觉超过了原神。

let-us-play-minecraft
Minecraft 1.20.1 Vanilla + BSL Shader Pack v8.2.04 High

## 安装 CUDA Toolkit 和 cuDNN 

### 安装 CUDA 

虽然显卡主要会用来玩 Minecraft,但是我还有写 CUDA 和炼丹的需求。

前往 CUDA 下载官网 https://developer.nvidia.com/cuda-downloads 选择操作系统、指令集等信息,"Installer Type" 建议选择 "runfile (local)",然后下方会将具体的安装命令显示给你。

# 下载 CUDA 本地安装程序 (你的版本号大概率与这个不一致)
$ wget https://developer.download.nvidia.com/compute/cuda/12.2.0/local_installers/cuda_12.2.0_535.54.03_linux.run

# 添加可执行权限
$ chmod +x ./cuda_12.2.0_535.54.03_linux.run

# 运行安装程序
$ ./cuda_12.2.0_535.54.03_linux.run --override

CUDA 安装程序也是用 ncurses 写的,执行后千万记得在 CUDA Installer 里面 uncheck 安装驱动的选项,然后只勾选 CUDA 相关的东西安装即可。

cuda-installer-uncheck-driver
CUDA Installer 取消安装驱动的选项

安装结束后会有提示,告诉你进一步的配置。

# 添加 CUDA 到链接器默认库查找路径
$ echo "/usr/local/cuda-12.2/lib64" >> /etc/ld.so.conf
$ sudo ldconfig

# 添加 CUDA 可执行程序路径到 bash 环境变量
$ echo "export PATH=$PATH:/usr/local/cuda-12.2/bin" >> ~/.bashrc
$ source ~/.bashrc

$ nvcc --version
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2023 NVIDIA Corporation
Built on Tue_Jun_13_19:16:58_PDT_2023
Cuda compilation tools, release 12.2, V12.2.91
Build cuda_12.2.r12.2/compiler.32965470_0

安装好后我写了一个 CUDA helloworld,尝试编译运行,结果报了一长串的编译错误,抱怨 gcc 版本不支持:

#error -- unsupported GNU version! gcc versions later than 12 are not supported! The nvcc flag '-allow-unsupported-compiler' can be used to override this version check; however, using an unsupported host compiler may cause compilation failure or incorrect run time execution. Use at your own risk.

原因是 nvcc 内部会调用系统默认 gcc,而当时我的系统 gcc 版本是 gcc-13,CUDA-12.2 仅支持 gcc-12 及以下。

解决办法很简单,nvcc 默认调用的 gcc 位于 /usr/local/cuda/bin/gcc,将其符号链接到 /usr/bin/gcc-12 即可。如果你的系统没有 gcc-12 的话,用包管理器装一个或者拉源码自行构建一个,建议将 gcc-12 安装到 /usr/local/bin,我使用的 openSUSE 在系统升级的过程中会帮你保留旧版本的 gcc 在 /usr/bin

# 软链接到 gcc-12
$ sudo ln -s /usr/bin/gcc-12 /usr/local/cuda/bin/gcc

### 安装 cuDNN 

cuDNN 是 CUDA 实现的 GPU 深度学习库,提供众多通用和常用的高性能算子,可用作深度学习框架如 PyTorch 和 TensorFlow 的后端。

前往 https://developer.nvidia.com/cudnn 下载 cuDNN,需要注册一个 NVIDIA developer account (fucking disgusting)。注意,cuDNN 需要与 CUDA 是配套的,要确保你的 CUDA 版本是支持你选择的 cuDNN 版本。

# 解压提取 cuDNN
$ tar -xvf cudnn-linux-x86_64-8.9.7.29_cuda12-archive.tar.xz

# 将头文件和库文件复制到之前安装的 CUDA 目录下
$ sudo cp cudnn-*-archive/include/cudnn*.h /usr/local/cuda/include
$ sudo cp -P cudnn-*-archive/lib/libcudnn* /usr/local/cuda/lib64
$ sudo chmod a+r /usr/local/cuda/include/cudnn*.h /usr/local/cuda/lib64/libcudnn*

Until next time!

## The End? 

这里用来记录滚挂和出问题的事件,不定时更新,我想看一下究竟能坚持多久,直到我无力回天:

  • 2024-01-04: 这是第一次,仅仅时隔 2 周多,我没想到会如此之快。一次内核升级后挂了,开机直接给我干进恢复终端,不过还好我有先见之明,系统上保存着驱动安装程序 (我再次强烈建议读者也这么做),于是尝试重装驱动+重启机器,活过来了。

  • 2024-02-04: 第二次滚挂,这次有些莫名其妙。尝试重新安装驱动,报错说当前驱动用的是 nouveau,排查发现 nvidia.conf 被覆写导致 nouveau 被启用。更新 nvidia.conf 禁用 nouveau 之后再 sudo dracut -f 生成 initramfs 重启,然后重装驱动,装完就又活过来了。

  • 2024-04-04: 第三次滚挂,内核从 6.7.6 升级到 6.8.1,重装驱动失败,nvidia_drm 模块构建失败 (貌似是与 CUDA 相关的模块),万幸的是去官网发现驱动有更新,于是抛弃旧的 535.146.02,用 wget 下载新的 550.67 版本,安装成功。蛋疼的是这次更新 KDE5 升级到了 KDE6,默认启用 Wayland,而且 SDDM 里面只有 Wayland session,Login 进去桌面黑屏 (of course, wayland + nvidia = black screen)。尝试 Ctrl-Alt-T 打开 Konsole,可以正常显示,用 zypper 安装 KDE6 X11 session 并重启,SDDM 就有 X11 session 的选项了,成功进入桌面环境,又一次完美的操作! 另外,如果滚挂可以尝试 grub 中的 advanced options,选择用旧的内核 boot。

    install-plasma6-session-x11-using-zypper
    I don’t know why the FUCK KDE6 uses Wayland as default, it’s a BREAKING FREAKING change!
  • 2024-08-26: 从 5 月开始将近 4 个月没有滚,这次内核升级到 6.10.5,滚挂了。同上操作,安装最新的驱动 550.107.02,救活了。