archlinux安装NVIDIA驱动

文章初发于简书,转载请注明来源。
@earth_xmx @ 简书
linux下安装NVIDIA驱动两年半,时而成功,时而失败。晕晕乎乎的,这次准备一下把原理搞清楚。
本文章分为三个部分

    1. 基础知识。
    1. 定位过程。
    • 2.1 首先先让系统正常启动起来
    • 2.2 查看xorg启动
    • 2.3 查看xorg能否正常使用NVIDIA的驱动
    1. 总结安装驱动步骤。
    • 3.1 安装驱动
    • 3.2 检查 nouveau 是否被禁用了

1. 基础知识

本节参考鸟哥的私房菜 基础学习篇 第四版,第二十三章:Xwindow设置介绍。
在linux中的显示服务中,分为 server 和 client

  • server: 控制键盘、鼠标、显示器等硬件。
  • client:为一系列的应用程序,比如LibreOffice,chrome,等。
    client通过本地通讯UNIX-domain socket或者TCP/IP与server 通讯,具体说明可以通过命令man Xorg查看。

借用书上的图


Screenshot_20221015_141912.png

所以,我们的显示服务是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,然后登录

  1. 修改下列文件,不让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

  1. 删除 刚刚使用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-settingssudo 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,以后再研究)。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容