文章初发于简书,转载请注明来源。
@earth_xmx @ 简书
linux下安装NVIDIA驱动两年半,时而成功,时而失败。晕晕乎乎的,这次准备一下把原理搞清楚。
本文章分为三个部分
- 基础知识。
-
- 定位过程。
- 2.1 首先先让系统正常启动起来
- 2.2 查看xorg启动
- 2.3 查看xorg能否正常使用NVIDIA的驱动
-
- 总结安装驱动步骤。
- 3.1 安装驱动
- 3.2 检查 nouveau 是否被禁用了
1. 基础知识
本节参考鸟哥的私房菜 基础学习篇 第四版,第二十三章:Xwindow设置介绍。
在linux中的显示服务中,分为 server 和 client
- server: 控制键盘、鼠标、显示器等硬件。
- client:为一系列的应用程序,比如LibreOffice,chrome,等。
client通过本地通讯UNIX-domain socket
或者TCP/IP与server 通讯,具体说明可以通过命令man Xorg
查看。
借用书上的图
所以,我们的显示服务是Xorg来控制的。
这里关于Xorg只是简单的介绍。具体内容请阅读鸟哥的私房菜或者其他资料。
2. 定位过程
参考 https://zhuanlan.zhihu.com/p/433920079安装好archlinux系统后。
参考 archwiki https://wiki.archlinux.org/title/Xorg 安装NVIDIA驱动
sudo pacman -S nvidia nvidia-utils lib32-nvidia-utils nvidia-settings
安装完后,使用 nvidia-xconfig
创建xorg的配置文件。
[vicking@archlinux ~]$ sudo nvidia-xconfig
[sudo] vicking 的密码:
WARNING: Unable to locate/open X configuration file.
New X configuration file written to '/etc/X11/xorg.conf'
使用命令systemctl reboot
重启。重启后发现,系统启动不起来了。
至此。NVIDIA私有驱动安装失败。
定位原因:
2.1 首先先让系统正常启动起来。
这一步先别管为什么要这样做,后面会有说明。
alt+ctrl+f3
切换到tty3,然后登录
- 修改下列文件,不让NVIDIA模块把 nouveau 模块拉黑。
/usr/lib/modprobe.d/nvidia-utils.conf
------------------
#blacklist nouveau
如果没有上面的文件,那么请检查如下文件
/etc/modprobe.d/nouveau_blacklist.conf
, /usr/lib/modprobe.d/nvidia.conf
, or /usr/lib/modprobe.d/nvidia-dkms.conf
- 删除 刚刚使用
nvidia-xconfig
生成的/etc/X11/xorg.conf
重启,这样应该系统能正常启动了。
2.2 查看xorg启动
通过2.1 我们的系统现在又能正常启动了。
查看系统的进程树
[root@archlinux vicking]# pstree
systemd─┬─NetworkManager───2*[{NetworkManager}]
├─4*[agetty]
├─bluetoothd
├─dbus-daemon
├─kwalletd5───3*[{kwalletd5}]
├─login───bash
├─polkitd───2*[{polkitd}]
├─rtkit-daemon───2*[{rtkit-daemon}]
├─sddm─┬─Xorg───2*[{Xorg}]
│ ├─sddm-helper───startplasma-x11───{startplasma-x11}
│ └─{sddm}
├─systemd─┬─(sd-pam)
│ ├─DiscoverNotifie───4*[{DiscoverNotifie}]
│ ├─aria2c
│ ├─at-spi-bus-laun─┬─dbus-daemon
...
我们可以观察到xorg的服务通过sddm启动的。(我这里使用的是sddm+plasmakde桌面环境,其他的桌面环境比如gdm+gnome可能是不一样的。这个知识可以查看鸟哥的私房菜)
进一步验证sddm和xorg的关系
[vicking@archlinux ~]$ systemctl status sddm.service
● sddm.service - Simple Desktop Display Manager
Loaded: loaded (/usr/lib/systemd/system/sddm.service; enabled; preset: disabled)
Active: active (running) since Sat 2022-10-15 13:49:41 CST; 1h 5min ago
Docs: man:sddm(1)
man:sddm.conf(5)
Main PID: 471 (sddm)
Tasks: 4 (limit: 9464)
Memory: 106.7M
CPU: 1min 42.564s
CGroup: /system.slice/sddm.service
├─471 /usr/bin/sddm
└─485 /usr/lib/Xorg -nolisten tcp -background none -seat seat0 vt1 -auth /var/run/sddm/{c1fd0e95-be49->
10月 15 13:49:47 archlinux sddm-helper[534]: [PAM] returning.
10月 15 13:49:47 archlinux sddm[471]: Authenticated successfully
10月 15 13:49:47 archlinux sddm-helper[534]: pam_kwallet5(sddm:setcred): pam_kwallet5: pam_sm_setcred
10月 15 13:49:47 archlinux sddm-helper[534]: pam_unix(sddm:session): session opened for user vicking(uid=1000) by (>
10月 15 13:49:47 archlinux sddm[471]: Auth: sddm-helper exited successfully
10月 15 13:49:47 archlinux sddm[471]: Greeter stopped.
10月 15 13:49:47 archlinux sddm-helper[534]: pam_env(sddm:session): deprecated reading of user environment enabled
10月 15 13:49:47 archlinux sddm-helper[534]: pam_kwallet5(sddm:session): pam_kwallet5: pam_sm_open_session
10月 15 13:49:47 archlinux sddm-helper[534]: Starting: "/usr/share/sddm/scripts/Xsession \"/usr/bin/startplasma-x11>
10月 15 13:49:47 archlinux sddm[471]: Session started
可以看到xorg服务是由sddm启动。那么Xorg服务能不能正常启动是系统能不能进入到桌面的关键。
2.3 查看xorg能否正常使用NVIDIA的驱动。
我们使用命令sudo pacman -S nvidia nvidia-utils lib32-nvidia-utils nvidia-settings
和sudo nvidia-xconfig
安装完NVIDIA驱动并配置xorg所需的配置文件后。
查看/usr/lib/modprobe.d/nvidia-utils.conf
文件,发现其中确实把 nouveau 驱动给拉黑了。这样系统只能加载 nvidia的驱动。
但是我们执行 lsmod | grep nv
后发现nvidia的驱动并没有加载。
正常情况下,应该是按照如下显示。
[vicking@archlinux ~]$ lsmod | grep nv
nvidia_drm 73728 19
nvidia_uvm 2850816 0
nvidia_modeset 1466368 43 nvidia_drm
nvidia 60055552 2405 nvidia_uvm,nvidia_modeset
另外我们执行 nvidia-smi
命令也会失败。
[vicking@archlinux ~]$ nvidia-smi
NVIDIA-SMI has failed because it couldn't communicate with the NVIDIA driver. Make sure that the latest NVIDIA driver is installed and running.
可见NVIDIA驱动在系统启动的时候,并没有正确加载。
参考文章: https://bbs.archlinux.org/viewtopic.php?id=263618
发现在安装NVIDIA驱动的时候,blablalba, 没有看懂。反正意思就是NVIDIA驱动没有正常加载。
所以这里安装下nvidia-dkms
包
sudo pacman -S nvidia-dkms # 会提示删除nvidia的包。选择 y 删除即可。
3. 总结安装驱动步骤
通过以上的分析,我们应该知道如下。
- NVIDIA显卡的驱动要么是开源驱动 nouveau, 要么是闭源的NVIDIA驱动。我们这里选择使用闭源的显卡驱动。
- Xorg 服务启动的时候,如果显卡驱动没有安装正确,则Xorg不能正常启动,导致无法显示桌面。
3.1 安装驱动
sudo pacman -S nvidia-utils lib32-nvidia-utils nvidia-settings
# 配置xorg, 会生成 /etc/X11/xorg.conf
sudo nvidia-xconfig
# 安装驱动,此步会让kernel正确加载nvidia驱动
sudo pacman -S nvidia-dkms
3.2 检查 nouveau 是否被禁用了。
/usr/lib/modprobe.d/nvidia-utils.conf
,/etc/modprobe.d/nouveau_blacklist.conf
, /usr/lib/modprobe.d/nvidia.conf
, or /usr/lib/modprobe.d/nvidia-dkms.conf
检查以上文件中是否有 blacklist nouveau
这句话(只要一个文件中包含这句话就行。)
另外关于使用intel集显还是使用NVIDIA独显的问题,本文不涉及(应该是使用optimus,以后再研究)。