升级软件不小心填满根文件系统导致系统崩溃的恢复
0x88dfac8bedc5 Lv3

故障形成过程

在根文件系统/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
2
3
4
5
resize2fs /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

但由于此时/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 -hvgs等指令查看逻辑卷和文件系统的状态

解决过程

  1. 进入修复模式,如果root账户的密码登录被锁则先去解锁
  2. 解锁root的密码登录 - 启动菜单按e修改grub,根目录文件系统的挂载访问权限改成rw,后面加上init=/bin/zsh。进入shell后passwd; passwd -u root,恢复完成后重新锁上passwd -l root。重新启动进入修复模式。
  3. 获取读写权限,尝试修复家目录文件系统fsck /dev/jc-vg/home报错物理空间小于文件系统大小,增加逻辑卷大小后继续修复
    1
    2
    3
    mount -o remount,rw /dev/jc-vg/root /
    lvresize -L +50G /dev/jc-vg/home
    fsck $_
    修复时fsck开始崩溃并用意义不明的数字刷屏,等待30分钟没有改变后强行关机。
  4. 猜测是因为根文件系统满了导致fsck行为异常,在修复模式下挂载家文件系统然后将一部分文件移进去
    1
    2
    3
    mount /dev/jc-vg/home /home
    mv /opt/android-studio /home/jc/
    umount /home
    如果mount失败可以考虑直接删掉一部分文件。
    腾出空间后fsck成功修复/dev/jc-vg/home。此时顺便从/home/挪一些空间然后把之前移走的大文件移回来
    1
    2
    3
    4
    5
    6
    7
    8
    resize2fs /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的用户登录界面了,但成功登录后屏幕显示“系统出错请联系管理员“等字样,无法进行任何互动,再次重启进入修复模式。
  5. 最终发现是之前apt full-upgrade被中途打断导致仓库里的软件包损毁无法支持正常启动,进行修复然后继续未完的更新
    1
    2
    apt-get --fix-broken
    apt full-upgrade && apt autoclean
    重新启动,好了。