xfs、ext4 文件系统都支持 LVM 逻辑卷缩容吗?如何对根分区缩容?

1 问题背景

遇到对根分区进行 LVM 逻辑卷缩容(该分区为 xfs 文件系统)后,系统不能正常使用的问题。因此详细分析进行 LVM 逻辑卷缩容对文件系统有无要求,以及能否对根分区进行缩容操作

2 LVM 逻辑卷的缩容实验

2.1 文件系统对缩容有无限制

此节主要验证当前主流的 xfs 文件系统和 ext4 文件系统是否都支持 LVM 逻辑卷的缩容:

  • 验证按照目前众所周知的操作规范,缩容前先要卸载对应分区
  • 基于 openEuler 22.03 LTS SP1 操作系统进行验证

(1)准备工作

创建大小约为 25G 的卷组,后续基于此卷组创建逻辑卷

2.1.1 xfs 文件系统 LVM 逻辑卷缩容

(1)创建大小约为 10G 的逻辑卷,并格式化为 xfs 文件系统,进行挂载测试


(2)将以上逻辑卷缩容至 5G,查看分区是否正常

出现报错,不能重新格式化,不能强制挂载,说明 xfs 文件系统的缩容存在问题

如果使用 mkfs.xfs -f 命令进行强制格式化,则可以正常缩容,但是分区上的所有数据也会丢失,这种操作显然是不行的

(3)结论

xfs 文件系统不能进行 LVM 逻辑卷的缩容操作

2.1.2 ext4 文件系统 LVM 逻辑卷缩容

(1)创建大小约为 10G 的逻辑卷,并格式化为 ext4 文件系统,进行挂载测试


(2)将以上逻辑卷缩容至 5G,查看分区是否正常

(3)结论

ext4 文件系统可以进行 LVM 逻辑卷的缩容操作

2.1.3 本节结论

经过以上测试,得出结论:xfs 文件系统不能进行 LVM 逻辑卷的缩容操作,ext4 文件系统可以进行 LVM 逻辑卷的缩容操作

另外,也可以通过另外一种缩容方式明确得出这一结论。即使用 lvreduce 命令的 -r 参数,此参数表示在缩容时同时使用 fsadm 调整底层文件系统的大小:

(1)xfs 文件系统 LVM 逻辑卷缩容

输出内容如下图所示:

报错显示:Xfs filesystem shrinking is unsuppored(Xfs 文件系统收缩不被支持)

(2)ext4 文件系统 LVM 逻辑卷缩容

# 执行以下命令对 ext4 文件系统的 LVM 逻辑卷缩容
$ lvreduce -r -L 5G /dev/vg0/lv_ext4

输出内容如下图所示:

信息显示逻辑卷缩容成功

2.2 能否挂载状态缩容

现有处于挂载状态的文件系统为 ext4 的逻辑卷:

直接对其进行缩容操作,命令执行过程中会询问是否卸载分区:

缩容后,会自动挂载分区:

综上,不能对处于挂载状态的逻辑卷分区进行缩容操作,工具会自动卸载、挂载

2.3 如何对根分区进行缩容操做

由 2.2 得出结论,在对逻辑卷缩容时必须要先卸载分区。正常系统中,根分区显然是不能卸载的,那么想对根分区进行缩容该如何操作呢?

进单用户模式进行操作,发现单用户模式并没有 lvm 相关命令

正确的根分区缩容操作如下:

(1)使用光盘进入救援模式,选择 “ 3) Skip to shell ”,这样可以不去挂载 /mnt/sysroot/mnt/sysimage

(2)执行 lsblk 命令查看逻辑卷是否处于激活状态,即是否有 /dev/mapper/... 相关路径,若没有则需要先激活逻辑卷

(3)执行 vgchange -ay 命令激活所有卷组及其逻辑卷,之后再次执行 lsblk 命令查看逻辑卷路径

(4)执行 lvreduce -r -L -20G /dev/mapper/openeuler-root 命令进行缩容操作,并验证缩容结果

(5)退出救援模式,进入系统,验证缩容结果及系统有无异常

至此,根分区成功缩容!

3 Likes

遇好贴必赞!

这里的卸载失败是子目录下还有其他的挂载吧,要先卸载这些子目录,而且你这里是重复挂载了两次

实测子目录没有挂载之后,还是无法卸载,另外 /mnt/sysroot/mnt/sysimage 是一样的,只卸载其中一个,另一个也会卸载

1 Like

那换种方式呢?进救援模式时不要选择挂载/mnt/sysroot目录

1 Like

受教,这样果然可以成功缩容,稍后更新文章