
# 记一次装显卡
省流: 年轻人的第一块显卡 ── 小时候看这集看哭了
## 安装 RTX 4060 ¶
我购买的显卡是 微星 RTX 4060 NV Edition 8G,这款限量版显卡外壳装饰有核弹厂绿色,个人觉得很好看,但是价格要比普通版贵 100。

笔者之前用 N 卡都是连服务器,自己的 PC 一直用的是 Intel 集显,没有独立显卡。这次安装显卡、驱动和相关软件包整个过程花费了 3 个小时左右,自己一边摸索一边踩了一点坑,这里记录一下,以后再折腾时可以参考,如果有朋友安装显卡时遇到问题,希望这些内容恰好能帮到你。
我第一次安装时,没有先把机箱背面的软板拆下来,而是插上显卡、插上电源、安装固定螺丝后直接开机,显卡是亮的,但显示器始终黑屏。我天真地以为,显卡正常安装 + 显示器 HDMI 连接到主板,就可以使用独显显示。实际上,显卡是有独立的 HDMI 接口用于连接显示器,插上显卡后,主板会屏蔽掉核显,显示器必须连接显卡才能正常显示。
折腾了一会,突然想起来,显卡一侧有几个接口 (?),于是重新给显卡卸下来看到了 HDMI 的接口,但机箱背面会挡住这些接口,捣鼓了几下原来这些背板可以拆!拍断大腿,我还以为机箱规格有问题,和显卡不适配!

另外在安装时需要注意的几点是:
-
插拔显卡时需要摁住主板显卡插槽的卡扣,否则可能损伤到金手指。
特别注意在安装和拆卸显卡时,要摁住卡扣,垂直拔出,不要大力出奇迹 -
显卡插上后机箱背面有固定螺丝需要安装,否则显卡会晃动,非常危险。
显卡插到主板上后,机箱背面要安装固定螺丝 -
显卡供电使用电源的 PCI-E 接口。
显卡电源插口一般是 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 设备,看是否正常识别到了显卡。如果发现有集显和独显两个设备,那么就是正常的,否则检查前面的步骤。

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

你可能在装系统时安装了 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 重新设置一下。

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

我在后面使用中发现每次开机后都会有闪屏的问题,导致机器根本无法使用,我的窗口和桌面系统是 X11+KDE,在 nvidia-xconfig
生成的 /etc/X11/xorg.conf
配置文件的 Section "Device"
中加一行 Option "NoFlip" "true"
,然后重启即可彻底解决。这个配置选项将禁用 OpenGL Flipping (类似于某种交换 buffer 的操作?)。
Section "Device"
Identifier "Device0"
Driver "nvidia"
VendorName "NVIDIA Corporation"
+ Option "NoFlip" "true"
EndSection
如果你使用的不是 X 窗口系统 (比如 Wayland) 但出现了类似的问题,这个方法肯定是不会奏效的,你已经是一个成熟的 Linux 用户了,相信你一定有能力自己解决 :D
玩 Minecraft 从未感到如此流畅,一口气尝试了各种小时候垂涎三尺的光影材质包,2k 帧率基本上都稳定在 100 FPS (虽然我显示器只有 60Hz),画质十分美丽,感觉超过了原神。

## 安装 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 到链接器默认库查找路径
$ 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。
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,救活了。