深度好文:解决Ubuntu 18.04安装nvidia显卡驱动,导致内核不匹配:无需重装系统修复内核
目录
- 一、问题描述
- 二、尝试修复
- 三、安装Nvidia驱动和CUDA并配置cuDNN
- 四、总结
一、问题描述
昨天打算更新一下Ubuntu 18.04的显卡驱动,以支持更新版本的cuda和Pytorch。结果在安装新版本驱动的时候,显卡驱动和系统内核版本不一致,导致进不去系统了。后来参考解决Ubuntu 显卡驱动升级导致的 显卡驱动和内核版本不匹配的问题,非但没有解决问题,反而把系统里面原本的内核损坏了。(这个博客中的写得巨烂,首先排版就很烂,其次注意事项也不写清楚。事实上,对于Linux内核,最好别去动它。一个内核文件也不大,几百兆,就留着也不占什么空间,没有必要卸载旧的内核。装新的内核之后,配置启动方式就行了。)这下完蛋了,重启之后彻底进不去系统了。
二、尝试修复
进入终端模式(ctrl+alt+F1),尝试使用sudo apt install
按照我以前的教程安装指定版本(5.11.0-34)的内核,结果一直失败。并且由于系统语言设置的中文,在终端模式下报错信息一直是乱码**,完全没办法定位错误。(事后复盘,我发现5.11.0-34的内核版本是针对Ubuntu 20.04LTS的,所以Ubuntu 18.04用apt install就会找不到匹配的软件包,如下图所示。)
既然是内核的问题,还有一种方法是离线安装内核,下载指定版本内核相关文件到本地,然后安装。但是由于此前内核损坏,进系统的时候出现了bus error,导致无法识别插入的U盘。这个方法也行不通。
所以这个时候,我们需要正常显示报错信息和提示,这样我们才方便定位排查错误。具体做法可以参考:Ubuntu系统误删内核后修复方法。流程总结如下:
- 准备一个空的U盘,下载Ubuntu镜像制作启动盘。这里推荐使用国产开源软件ventoy。ventoy超级好用,有了它就无需反复格式化U盘,可以同时保存多个不同类型的镜像文件,并且正常使用U盘。
- 更改bios启动方式,进入时选择”try Ubuntu without installing“。
- 在进入的Ubuntu系统内挂载原系统根目录,boot目录和必要的系统目录。这一步需要用到
fdisk -l
和mount
命令。 - 使用
chroot
命令更改根目录到挂载的原系统根目录,这样就可以进入原系统了。 - 在原系统内使用
apt
(在线安装)或者dpkg
(离线安装)命令安装新的内核。 - 安装完成之后,使用
sudo update-grub
来更新一下引导。 - 重启,进入Ubuntu高级选项,选择安装的新内核,即可进入系统。
- 进入系统后,别忘了更改默认启动内核。具体方法可以参考我之前的教程,提供了三种方法修改启动内核。
在这个过程中,我遇到的坑如下:
-
在挂载原系统目录时,根目录在一个分区上,
/usr
目录在另一个分区上。一开始我只挂载了根目录所在分区,没有挂载/usr
目录的分区。导致我使用chroot
命令之后,一直使用不了apt
和dpkg
命令。后来,询问GPT-4才发现问题所在。(GPT is all you need!!!) -
使用
apt-get install linux-image-generic
时,下载安装的内核版本时4.15.0,这个版本也比较老了。我通过这个内核进入系统之后发现无法上网,没有深究。后来通过离线方式安装了5.15.0的内核版本,离线安装的方式可以参考Linux系统-Ubuntu安装指定版本的内核。需要注意的是,下载的文件应该是不带low-latency的四个文件,而不是参考教程里面说的3个,可参考下图中GPT给出的建议。具体安装流程总结如下: -
选择内核版本的时候,不能太高也不能太低,亲测5.8.0可用。如果版本太高,例如:5.15.0版本,可能因为依赖问题(5.15.0的内核头文件需要libc6>= 2.34,但是Ubuntu18.04里面libc6版本为 2.27)无法安装headers文件,导致后续安装显卡驱动的时候报错。ERROR: Unable to find the kernel source tree for the currently running kernel. 出现这个错误就是说明没有安装成功headers文件。关于这一点,有个博客写得蛮好的。不过,他的解决方式在我的环境里面没有work。我是直接手动安装了5.8.0的headers才成功。
三、安装Nvidia驱动和CUDA并配置cuDNN
这一部分安装我之前的教程来就可以了,没什么可说的。安装驱动的时候,记得加上--no-x-check --no-nouveau-check --no-opengl-files
。
这里需要注意一下,修改/etc/profile
文件来添加cuda的环境变量时,一定要仔细检查,不然出啥问题了,在进系统时会出现输入密码循环登录的情况。解决方案也很简单,进入终端模式,输入用户名,密码,把/etc/profile
修改回去,再重启即可。如果是个人用户使用,在~/.bashrc这种个人级别的配置文件添加cuda路径是最好的。
四、总结
折腾上面这些东西,花了我一个下午+一个晚上。中途一度想放弃重装系统,但是数据丢失的代价太大了,还是坚持下来了。以后可以多问问GPT,把情况描述清楚,GPT-4给出的答案都很靠谱,基本和自己上网搜的解决方案差不多,可以显著提升效率。