前段时间想尝试在ubuntu上安装steam,但是没有安装成功。过了一个星期重启电脑后,发现开机黑屏,无法进入桌面。记录这次排查的过程,以供下次手贱的时候快速恢复。

一、切换低版本的内核

在黑屏界面,通过alt + ctrl + f2进入tty,查看显卡驱动是否正常

nvidia-smi

提示zsh: command not found: nvidia-smi

这个报错大概是说明本机的显卡驱动掉了。

首先尝试切换内核,看看低版本的内核是否可以进入。

首先,查看本机安装的内核

sudo dpkg --get-selections |grep linux-image

可以通过开机时显示grub菜单,来切换内核版本。

sudo vim /etc/default/grub

  • 注释GRUB_TIMEOUT_STYLE
  • GRUB_CMDLINE_LINUX_DEFAULT设置为text格式的菜单
  • GRUB_TIMEOUT设置为20

在开机时,我选择更低的5.19.0-32-generic版本,发现此时可以正常开机进入桌面,但仍然找不到显卡驱动。

二、查看操作日志

由于在安装steam时可能动过显卡,因此显卡驱动丢失很可能是apt操作导致的。

虽然安装命令是一个星期前执行的,但仍然可以通过apt日志查看显卡驱动是否被修改了。

注:日志记录可以保留多久,取决于系统的日志轮转设置。可以查看/etc/logrotate.conf文件及/etc/logrotate.d/目录下相关的配置文件。本机的rotat设置为4weeks,因此可以查看半个月前的操作日志。

cat /var/log/apt/history.log

通过日志可以直接看出,我尝试安装steam时,自动安装了最新版本的显卡驱动。但是由于依赖失败,部分包无法安装。

随后,由于安装失败,我尝试使用autoremove命令卸载上次安装失败后安装的包,这导致了525驱动和515驱动也被删除。

可以通过下面的命令,查看驱动被删除的具体时间

cat  /var/log/dpkg.log | grep remove       

通过匹配操作时间,发现就是autoremove导致的驱动丢失。

三、删除残留驱动

因此,问题便简化了,重装显卡驱动即可。在重装前,删除残留驱动。

输入以下命令以移除当前安装的Nvidia驱动:

sudo apt-get remove --purge '^nvidia-.*'

Nouveau是Nvidia显卡的开源驱动。要安装官方驱动,先禁用nouveau

编辑/etc/modprobe.d/blacklist.conf文件,并添加以下内容:

blacklist nouveau
options nouveau modeset=0

更新屏蔽设置

sudo update-initramfs -u

四、安装驱动

查看当前显卡内核

 cat /proc/driver/nvidia/version

虽然当前显卡的驱动掉了,但仍然可以查询到先前的显卡驱动版本为525。

如果使用apt直接安装显卡驱动,可能会导致开机后黑屏。

一种推荐的方案是,直接在ubuntu桌面的Software & Updates中直接安装所需要的版本。

但之前我使用了手动安装的方式,因此无法选择要下载的版本。

因此,使用命令行的方式,用ubuntu-drivers安装驱动。

首先,列出可支持的所有驱动以及推荐驱动。

ubuntu-drivers devices

我们安装525版本,但是server版和普通版有什么区别呢?

可以通过apt show命令查看驱动的描述

apt show nvidia-driver-525-server
apt show nvidia-driver-525

Description: NVIDIA Server Driver metapackage This metapackage depends on the NVIDIA binary driver and on all of its libraries, to provide hardware acceleration for OpenGL/GLX/EGL/GLES/Vulkan applications on either X11 or on Wayland.

Description: NVIDIA driver metapackage This metapackage depends on the NVIDIA binary driver and on all of its libraries, to provide hardware acceleration for OpenGL/GLX/EGL/GLES/Vulkan applications on either X11 or on Wayland.

可以得知,server版提供了必要的驱动加速。虽然稳定,但可能缺少一些额外的驱动。作为工作站电脑的驱动,使用普通版显然更合适。

直接指定要安装的版本

sudo ubuntu-drivers install nvidia-driver-525

直接运行,发现提示之前已经安装过。 尝试更换等价的安装方法,可以正常安装。

sudo ubuntu-drivers install nvidia:525

然而,观察安装命令,发现安装了6.5.0-14-generic内核,并使用dkms将显卡驱动更新到了这个新内核。

因此,如果使用6.5.0-14-generic内核,大概率是可以正常加载显卡驱动。

但是,由于我的无线wifi驱动在新的内核中不能正常加载,因此我仍然需要切换到旧的内核版本。

然而,如果想尝试在当前的5.19.0-32-generic内核使用显卡,会发现显卡驱动仍然不能正常加载。

执行nvidia-smi,会提示

查看dkms status,发现没有输出。

dkms status

查看当前内核

uname -r

查看当前显卡的驱动版本

尝试使用dkms,为当前的内核安装显卡模块,但安装失败。

sudo dkms install -m nvidia -v 525.147.05

尝试直接安装该驱动版本对应的dkms

sudo apt install nvidia-dkms-525

在安装过程中,可以看到dkms为当前的旧版内核安装了显卡模块。

检查显卡状态,恢复正常。

五、删除最新安装的内核,配置GRUB

再次检查本机的内核。

发现6.5.0-14-generic是新安装的。尝试卸载该内核,并更新grub

sudo apt-get purge linux-image-6.5.0-14-generic
sudo update-grub

再次检查本机的内核,发现6.5.0-14-generic的状态变为deinstall,但是出现了linux-image-unsigned-6.5.0-14-generic。

注意,一定要彻底删除内核,包括unsigned版本。原因见文章最后一节。

再次尝试删除该内核,同时删除unsigned的内核。

sudo apt-get purge linux-image-6.5.0-14-generic linux-image-unsigned-6.5.0-14-generic

卸载完成后,手动删除没有删除成功的文件夹。并执行grub-update

sudo rm -r /lib/modules/6.5.0-14-generic
sudo update-grub

此时,卸载成功。

卸载成功后,还需要配置grub,在每次开机时,选择当前的旧版内核。

此前,在开机时,首先选择第2个“Advanced options for Ubuntu”选项,随后在第2个页面选择第3个内核。

根据这个顺序,修改/etc/default/grub。主要修改GRUB_DEFAULT

sudo vim /etc/default/grub

  • GRUB_DEFAULT="1> 2",即第1层菜单的第2个选择,再选择第2层菜单的第3个选项

  • GRUB_TIMEOUT_STYLE=“hidden”,不显示GRUB菜单

  • GRUB_CMDLINE_LINUX_DEFAULT="quiet splash",简化提示信息,并使用图形化的进度条

其中,GRUB_CMDLINE_LINUX_DEFAULT的参数选项为:

  • quiet:内核启动时候简化提示信息
  • splash:启动的时候使用图形化的进度条代替init的字符输出过程
  • text:启动后进入命令行界面,没有设置此参数默认进入图像界面

最后,更新grub设置。

sudo update-grub

重启后,默认自动进入设置的内核。

六、为什么要彻底删除残留内核?

需要注意的是,删除了新版内核后,可能还会有unsigned版本的内核残留。

如下图所示,如果没有彻底卸载内核,

这将会导致在/boot/grub/grub.cfg的配置文件中仍然存在新版内核的选项,但是在开机时不显示新版内核的选项。

所以,如果按照开机时的引导项来设置GRUB_DEFAULT='1> 2',则会选择错误的内核,导致可能黑屏。

所以,须要彻底删除内核,删除内核完成后检查/boot/grub/grub.cfg,此时配置项与开机时的grub选项一致。