问题背景
我在按照 Kali Linux 官方 Doc 安装 Nvidia 显卡驱动的时候, 到 OpenCL Loaders 那一步, 发现新装的 Loader 并没有被加载, 于是我做了一个错误的决定: 我把本机中的官方文档中并没有列出来的 Loader 都删掉了, 希望通过这个操作可以强制系统使用新装的 Loader, 然而当我 reboot 之后, 发现自己无法登录了
出现了 "系统出错并无法恢复, 请尝试注销并重新登录" 的错误
解决思路
注: 我使用的操作系统为 Kali Rolling, 但该解决办法对 Debian/Ubuntu 系统也是适用的
1. 进入 recovery mode
Windows 系统遇到这种情况可能就需要用 Ghost 来重装系统了, 但对于 Linux 系统来说, 由于我们可以直接通过 shell 与 kernel 进行交互, 所以并不需要重装
重启系统, 进入 grub 界面( 就是启动时, 让你选择进入哪个系统的界面 )
我们选择第二个 Advanced Options 就可以进入 recovery mode
然后会提示我们输入 root 密码, 由于我们通常是使用 sudo user 来登录的, 所以可能会出现忘记 root 密码的情况, 这就需要第二步, 如果你记得 root 密码, 则直接前往第三步
2. 重置 root 密码
参考这里: 链接
在 grub 界面按 e 可以进入编辑模式, 在这里, 按这张图片进行修改
简单解释一下这一步:
我们在引导区增加了一段init=/bin/bash
这样, 进入系统后, 我们就可以直接获得一个 bash shell
然后我们把 ro (read only) 改成了 rw (read + write), 这样就可以保存我们通过这个 shell 对系统进行的修改(修改密码)
按 F10 保存并重启, 选择 recovery mode, 在返回的 shell 里, 通过
passwd root
就可以重置 root 用户的密码
完成后, reboot 进入 recovery mode, 用新密码登录就好
3. 恢复 apt-get
我们可以通过查看 apt-get 的 log 来查看我们 remove 了哪些包, 再把它们 install 回来就好
但这里要注意的一个问题就是: recovery mode 默认并不开启网络, 我们需要手动启动网络服务
启动网络服务:
systemctl start network-manager
执行
vim /var/log/apt/history.log
这样, 我们就可以获得 apt-get 的 log, 可以按键盘上的 Page Up / Page Down 键进行翻页, 记下我们之前误删的包名, 然后退出 :q
- 可能有人会想到用 history 命令, 获取自己之前执行的所有命令的记录, 但 history 命令在 recovery mode 下并不支持
- 如果这里不用 vim 而是用cat, 则会有无法翻页的问题
通过 apt-get install [package-name]
的方式, 我们就重新装回了该包
reboot 后应该就可以登录了
4. reboot 后仍无法登录
可能的原因是: 系统仍在使用那个有问题的 Loader
重启进入 recovery mode, 然后卸载掉这几个包
apt remove ocl-icd-libopencl1 nvidia-driver nvidia-cuda-toolkit
这样, 再次 reboot 后就可以登录了