bug

使用lvreduce扩容玩崩了

Posted by t298 on May 11, 2023

前提

lvreduce命令用于减少LVM逻辑卷占用的空间大小,-L 指定逻辑卷的大小, 单位为“kKmMgGtT”字节

当时的情况是服务器上的home空间不够用了,但是root目录下还有挺多的空间,我就想把root目录的200G分配给home目录,但是教程看错了,直接在centos7.9执行了lvreduce –L 200G dev/centos/root之后服务器崩了。

操作

重启服务器后发现已经进不去系统了,只能进去Initramfs(临时文件系统)了,在群里有位大佬指导我:

  1. blkid

    • 用于显示块设备信息。blkid命令能够查看Linux系统中全部的块设备信息,也就是我们俗称的硬盘或光盘设备,并可以依据块设备名称、文件系统类型、LABEL、UUID等项目进行信息检索。
  2. lvextend

    • 用于扩展逻辑卷设备。LVM逻辑卷管理器技术具有灵活调整卷组与逻辑卷的特点,逻辑卷设备容量可以在创建时规定,亦可以后期根据业务需求进行动态扩展或缩小。
  3. ls /dev/mapper

    contorl live-base live-rw

  4. ls /dev/centos/root

    没有对应文件

  5. lsblk

    • 系统的磁盘使用情况
  6. lvs

    • 报告有关逻辑卷的信息
  7. lvscan

    • 用于扫描当前系统中存在的所有的LVM逻辑卷。使用lvscan指令可以发现系统中的所有逻辑卷,及其对应的设备文件。
    1
    2
    3
    
      ACTIVE            '/dev/centos/root' [<423.75 GiB] inherit
      ACTIVE            '/dev/centos/home' [50.00 GiB] inherit
      ACTIVE            '/dev/centos/swap' [<2.00 GiB] inherit
    
  8. 执行pvscanvgscan在看ls /dev/mapper/

    • pvscan:扫描系统中连接的所有硬盘,列出找到的物理卷列表
    • vgscan:查找系统中存在的LVM卷组,并显示找到的卷组列表
  9. lvchange -a y root

    • 用于更改逻辑卷属性,-a 设置逻辑卷的可用性,将逻辑卷root设置为不可用
    1
    2
    
    Volume group "root" not found
    Cannot process volume group root
    
  10. vgchange -ay centos

    • 用于修改卷组的属性,将centos设置为活动状态
    1
    
    3 logical volume(s) in volume group "centos" now active
    
  11. 再次执行lvchange -a y root

    1
    2
    
    Volume group "root" not found
    Cannot process volume group root
    
  12. lvchange -a y centos/root

  13. lsblk -o name,size

  14. lvextend -l 100%FREE /dev/centos/root

    • 用于扩展逻辑卷设备
    • -l:设置逻辑卷的大小(PE个数)
  15. 重启。

  16. dmesg | curl -F "c=@-" "http://fars.ee/"

结束

初次安装系统时,安装程序用 /dev/nvme0n1p3 创建一个 pv(physical volume), 每个逻辑块是4M。又创建了一个名字叫 centos 的 vgroup(volums group) 包含这个 pv. 一个 vgroup 可以包含多个 pv,你的机器上只有一个。又创建了三个 lv(logic volume): centos/root, centos/home, centos/swap. 在 dev 里路径是 /dev/centos/root ,/dev/centos/home, /dev/centos/swap. 可认认为它们是三块磁盘。

用 lvextend -l +100%FREE /dev/centos/root 把你去掉的空间加回来。 中间那些操作是要把这个 lv 给激活。由于你是在 intramfs里执行这些操作,所以要执行 vgchange -a y centos, lvchange -a y centos/root 这些命令。包括 pvscan, vgscan, lvscan 这些也是。 如果你是用一个安装 iso 引导起来,但是不安装,而是进入到命令行界面,就可以直接执行 lvextend 的,因为它会用一些systemd service把lv自动激活。

之所以用 lvextend -l +100%FREE ,主要也是巧合了,你的系统当时分配了除去 centos/home, centos/swap 剩下的空间给了 centos/root. 再一个就是不用再费心算要给它多少空间或逻辑块了。

centos/root 之前是400G+, 占用了 400G+/4M 个逻辑块。初次安装系统时,创建好 xfs 文件系统,写入了很多文件。这些系统文件分散不同逻辑块里,说不定哪个文件存在最后一个逻辑块里呢。 你执行了 lvreduce -L 200G /dev/centos/root ,这个操作会减少 root 这个 lv 占用的逻辑块。这相当于你把一个光盘掰成了两瓣。当系统启动时,它找到不了某个文件了,所以就进不了系统喽。我看你还用了 docker 启动业务,你这个样操作,就算能进系统,那个docker也可能启动不了,因为它的文件也找不到了。

lvextend -l +100%FREE /dev/centos/root 还有一个优点,你不记得之前是多大的空间,也不好算它的MB, GB 或者逻辑块,就把剩余的都分给它,就算比之前的大10G,20G 也没关系。因为多出来的这些,文件系统本来就没过。