背景
- 安装某个工具等时候,过于相信第三方脚本,没有检查安装了dpkg安装了一堆无关的ubuntu18的deb(我的机器则是ubuntu20),其中有坑爹的deb则是
libstdc++6_8.3.0-6ubuntu1~18.04.1_amd64.deb
,一开始没检查dpkg安装失败的完整日志,以为失败了会自动回退= _ = - 而其中apt等系统相关的工具,不少都是依赖libstdc的,所以系统关机之后就打不开了。
- 由于apt依赖的版本较高无法工作,故无法自动修复,具体报错如下,变成了先有鸡还是先有蛋问题( ̄_ ̄;)
apt: /lib/x86_64-linux-gnu/libstdc++.so.6: version `GLIBCXX_3.4.26' not found (required by /lib/x86_64-linux-gnu/libapt-pkg.so.6.0)
进入liveCD环境
准备ISO镜像
- 我是虚拟机故只需要ISO镜像就行,在虚拟机设置中,记得钩上启动时链接,保证在bios中也能检测到
- 实机请自备u盘制作启动盘,推荐用rufus制作,兼容性强。
进入bios/UEFI
- 如下图设置即可直接启动到bios/UEFI
- bios设置下,从CD-ROM启动,保存启动
在liveCD用chroot进入原系统环境修复
1、进入liveCD
- 直接使用try ubuntu,不要安装系统,进入系统后打开终端
- 用
sudo fdisk -l
查看原来的系统在哪个硬盘,找到Device关键字,看到写着Linux的就是原来的文件系统分区了。如下图sudo fdisk -l | grep -C 10 Device
2、挂载原系统目录
根据步骤1.2知道系统分区在/dev/nvme0n1p5
sudo mount /dev/nvme0n1p5 /mnt |
3、使用chroot修复原系统
- 使用chroot进入原系统环境
sudo chroot /mnt
- dpkg无视依赖卸载错误版本的库,直接卸载这个libstdc++6是很多程序的依赖无法卸载,故得用
--force-depends
参数备注: 具体的包名可以用sudo dpkg -r --force-depends libstdc++6
sudo dpkg -S [关键字]
来查找 - wget下载deb,
wget http://security.ubuntu.com/ubuntu/pool/main/g/gcc-10/libstdc++6_10.5.0-1ubuntu1~20.04_amd64.deb
- dpkg安装正确的deb
sudo dpkg -i libstdc++6_10.5.0-1ubuntu1~20.04_amd64.deb
- 至此apt已经恢复正常了,交给
apt install -f
来修复依赖问题,如果无法访问域名,建议步骤2 挂载下dns配置即可。 - 退出chroot ,umount系统,关机,还原虚拟机设置,重启后正常进入系统。
退出chroot
exit
卸载已经挂载的目录和文件
sudo umount /mnt/etc/resolv.conf
sudo umount /mnt/dev
sudo umount /mnt/proc
sudo umount /mnt/sys
sudo umount /mnt
关机
sudo shutdown -h now
备选参考
- 不修了!我就要数据,直接liveCD挂载分区,执行
sudo mount /dev/nvme0n1p5 /mnt
拷贝出来 - 直接覆盖安装下系统,但不格式化硬盘,我这边用ubuntu-20.04.6-desktop-amd64.iso,安装的时候可以检测到已存在的系统,直接双系统共存,不用担心硬盘被格式化,然后参考上一步拷出来2333,好像引入了个新问题ε=ε=ε=┌(; ̄◇ ̄)┘
- 一般情况参考
- 更严重的情况,连命令都无法使用的参考