前段时间想尝试在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个选项GRUBTIMEOUTSTYLE="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选项一致。