升级软件不小心填满根文件系统导致系统崩溃的恢复
故障形成过程
在根文件系统/dev/jc-vg/root还剩不到10个G的情况下对软件包进行全面升级sudo apt update && sudo apt full-upgrade && sudo apt autoclean导致文件系统全满,此时多数应用已经无法运行。在慌乱下准备将挂载在/home下的/dev/jc-vg/home移过去一些空间给/dev/jc-vg/root
1 | lvresize --size -49G /dev/jc-vg/home |
直接导致该逻辑卷里的文件系统损坏。更为合适的做法为先缩减文件系统再缩减逻辑卷,增加空间时则调换次序
1 | resize2fs /dev/jc-vg/home -50G |
但由于此时/dev/jc-vg/root已满resize2fs不一定能够正常运行,可以先把一些应用给移到其他文件系统,比如
1 | mv /opt/android-studio /home/jc/ |
硬盘结构
- /dev/nvme0n1p1: UEFI 引导程序
- /dev/nvme0n1p2: BIOS 引导程序
- /dev/nvme0n1p3: LVM管理的加密盘,被分割成
/dev/jc-vg/root和/dev/jc-vg/home两个LVM逻辑卷分别挂载在/和/home,都为ext4格式,此时前者被塞满,后者已损坏 - 可以使用
lvdisplay,df -h,vgs等指令查看逻辑卷和文件系统的状态
解决过程
- 进入修复模式,如果root账户的密码登录被锁则先去解锁
- 解锁root的密码登录 - 启动菜单按e修改grub,根目录文件系统的挂载访问权限改成
rw,后面加上init=/bin/zsh。进入shell后passwd; passwd -u root,恢复完成后重新锁上passwd -l root。重新启动进入修复模式。 - 获取读写权限,尝试修复家目录文件系统
fsck /dev/jc-vg/home报错物理空间小于文件系统大小,增加逻辑卷大小后继续修复修复时1
2
3mount -o remount,rw /dev/jc-vg/root /
lvresize -L +50G /dev/jc-vg/home
fsck $_fsck开始崩溃并用意义不明的数字刷屏,等待30分钟没有改变后强行关机。 - 猜测是因为根文件系统满了导致
fsck行为异常,在修复模式下挂载家文件系统然后将一部分文件移进去如果1
2
3mount /dev/jc-vg/home /home
mv /opt/android-studio /home/jc/
umount /homemount失败可以考虑直接删掉一部分文件。
腾出空间后fsck成功修复/dev/jc-vg/home。此时顺便从/home向/挪一些空间然后把之前移走的大文件移回来此时重新启动进入正常模式,已经可以进入1
2
3
4
5
6
7
8resize2fs /dev/jc-vg/home -50G
lvresize --size -50G /dev/jc-vg/home
lvresize --size +50G /dev/jc-vg/root
resize2fs /dev/jc-vg/root +50G
mount /dev/jc-vg/home /home
mv /home/jc/android-studio /opt/gnome的用户登录界面了,但成功登录后屏幕显示“系统出错请联系管理员“等字样,无法进行任何互动,再次重启进入修复模式。 - 最终发现是之前
apt full-upgrade被中途打断导致仓库里的软件包损毁无法支持正常启动,进行修复然后继续未完的更新重新启动,好了。1
2apt-get --fix-broken
apt full-upgrade && apt autoclean