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

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

闫志聪
2024-03-30 / 0 评论 / 40 阅读 / 正在检测是否收录...
温馨提示:
本文最后更新于2024年08月12日,已超过283天没有更新,若内容或图片失效,请留言反馈。

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

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

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

(1)准备工作

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

# 创建大小约为 25G 的卷组(VG)
$ vgcreate vg0 /dev/sdb
  Physical volume "/dev/sdb" successfully created.
  Volume group "vg0" successfully created

# 查看创建的 VG 的详细信息
$ vgdisplay vg0
  --- Volume group ---
  VG Name               vg0
  System ID
  Format                lvm2
  Metadata Areas        1
  Metadata Sequence No  1
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                0
  Open LV               0
  Max PV                0
  Cur PV                1
  Act PV                1
  VG Size               <25.00 GiB
  PE Size               4.00 MiB
  Total PE              6399
  Alloc PE / Size       0 / 0
  Free  PE / Size       6399 / <25.00 GiB
  VG UUID               PhStrz-y8do-kZAl-a9hq-dkdj-mqZl-TTqDMX

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

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

# 创建大小为 10G 的逻辑卷 lv_xfs
$ lvcreate -L +10G -n lv_xfs vg0
  Logical volume "lv_xfs" created.

# 查看创建的逻辑卷的详细信息
$ lvdisplay /dev/vg0/lv_xfs
  --- Logical volume ---
  LV Path                /dev/vg0/lv_xfs
  LV Name                lv_xfs
  VG Name                vg0
  LV UUID                W5YEDp-9kx3-JChe-MxLJ-1P06-yfF3-KTtlzD
  LV Write Access        read/write
  LV Creation host, time localhost.localdomain, 2024-03-13 09:20:51 +0800
  LV Status              available
  # open                 0
  LV Size                10.00 GiB
  Current LE             2560
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     8192
  Block device           253:3

# 将此逻辑卷格式化为 xfs 文件系统
$ mkfs.xfs /dev/vg0/lv_xfs
meta-data=/dev/vg0/lv_xfs        isize=512    agcount=4, agsize=655360 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=1, sparse=1, rmapbt=0
         =                       reflink=1    bigtime=1 inobtcount=1
data     =                       bsize=4096   blocks=2621440, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0, ftype=1
log      =internal log           bsize=4096   blocks=2560, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0 

# 挂载此逻辑卷,并查看挂载情况
$ mkdir /lv_xfs
$ mount /dev/vg0/lv_xfs /lv_xfs/
$ df -Th /dev/vg0/lv_xfs
Filesystem             Type  Size  Used Avail Use% Mounted on
/dev/mapper/vg0-lv_xfs xfs    10G  104M  9.9G   2% /lv_xfs

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

# 卸载分区挂载
$ umount /dev/vg0/lv_xfs

# 将逻辑卷缩容 5G
$ lvreduce -L 5G /dev/vg0/lv_xfs
  WARNING: Reducing active logical volume to 5.00 GiB.
  THIS MAY DESTROY YOUR DATA (filesystem etc.)
Do you really want to reduce vg0/lv_xfs? [y/n]: y
  Size of logical volume vg0/lv_xfs changed from 10.00 GiB (2560 extents) to 5.00 GiB (1280 extents).
  Logical volume vg0/lv_xfs successfully resized.
  
# 重新格式化,出现报错
$ xfs_growfs /dev/vg0/lv_xfs
xfs_growfs: /dev/vg0/lv_xfs is not a mounted XFS filesystem

# 强制挂载,出现报错
$ mount /dev/vg0/lv_xfs /lv_xfs/
mount: /lv_xfs: can't read superblock on /dev/mapper/vg0-lv_xfs.

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

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

# 使用 mkfs.xfs -f 命令进行强制格式化
$ mkfs.xfs -f /dev/vg0/lv_xfs
meta-data=/dev/vg0/lv_xfs        isize=512    agcount=4, agsize=327680 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=1, sparse=1, rmapbt=0
         =                       reflink=1    bigtime=1 inobtcount=1
data     =                       bsize=4096   blocks=1310720, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0, ftype=1
log      =internal log           bsize=4096   blocks=2560, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0

# 挂载,并查看分区大小
$ mount /dev/vg0/lv_xfs /lv_xfs/
$ df -Th /dev/vg0/lv_xfs
Filesystem             Type  Size  Used Avail Use% Mounted on
/dev/mapper/vg0-lv_xfs xfs   5.0G   68M  5.0G   2% /lv_xfs

(3)结论

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

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

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

# 创建大小为 10G 的逻辑卷 lv_xfs
$ lvcreate -L +10G -n lv_ext4 vg0
  Logical volume "lv_ext4" created.

# 查看创建的逻辑卷的详细信息
$ lvdisplay /dev/vg0/lv_ext4
  --- Logical volume ---
  LV Path                /dev/vg0/lv_ext4
  LV Name                lv_ext4
  VG Name                vg0
  LV UUID                0yVn8J-OiP7-M0SB-GWZG-qHTa-YOC4-k8JVEK
  LV Write Access        read/write
  LV Creation host, time localhost.localdomain, 2024-03-13 10:36:01 +0800
  LV Status              available
  # open                 0
  LV Size                10.00 GiB
  Current LE             2560
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     8192
  Block device           253:4

# 将此逻辑卷格式化为 xfs 文件系统
$ mkfs.ext4 /dev/vg0/lv_ext4
mke2fs 1.46.4 (18-Aug-2021)
Creating filesystem with 2621440 4k blocks and 655360 inodes
Filesystem UUID: 3794e4d4-4cbf-4aaa-921c-1e7159edef07
Superblock backups stored on blocks:
        32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632

Allocating group tables: done
Writing inode tables: done
Creating journal (16384 blocks): done
Writing superblocks and filesystem accounting information: done

# 挂载此逻辑卷,并查看挂载情况
$ mkdir /lv_ext4
$ mount /dev/vg0/lv_ext4 /lv_ext4/
$ df -Th /dev/vg0/lv_ext4
Filesystem              Type  Size  Used Avail Use% Mounted on
/dev/mapper/vg0-lv_ext4 ext4  9.8G   24K  9.3G   1% /lv_ext4

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

# 卸载分区挂载
$ umount /dev/vg0/lv_ext4

# 进行磁盘检查(必须步骤)
$ e2fsck -f /dev/vg0/lv_ext4
e2fsck 1.46.4 (18-Aug-2021)
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
/dev/vg0/lv_ext4: 11/655360 files (0.0% non-contiguous), 66753/2621440 blocks

# 缩容文件系统
$ resize2fs /dev/vg0/lv_ext4 5G
resize2fs 1.46.4 (18-Aug-2021)
Resizing the filesystem on /dev/vg0/lv_ext4 to 1310720 (4k) blocks.
The filesystem on /dev/vg0/lv_ext4 is now 1310720 (4k) blocks long.

# 回收逻辑卷空闲空间
$ lvreduce -L 5G /dev/vg0/lv_ext4
  WARNING: Reducing active logical volume to 5.00 GiB.
  THIS MAY DESTROY YOUR DATA (filesystem etc.)
Do you really want to reduce vg0/lv_ext4? [y/n]: y
  Size of logical volume vg0/lv_ext4 changed from 10.00 GiB (2560 extents) to 5.00 GiB (1280 extents).
  Logical volume vg0/lv_ext4 successfully resized.
  
# 重新挂载,并查看挂载情况
$ mount /dev/vg0/lv_ext4 /lv_ext4/
$ df -Th /dev/vg0/lv_ext4
Filesystem              Type  Size  Used Avail Use% Mounted on
/dev/mapper/vg0-lv_ext4 ext4  4.9G   24K  4.6G   1% /lv_ext4

(3)结论

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

1.3 结论

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

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

$ man lvreduce
......
-r|--resizefs
        Resize underlying filesystem together with the LV using fsadm(8).
......

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

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

输出内容如下图所示:

test

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

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

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

输出内容如下图所示:

test

信息显示逻辑卷缩容成功


2 能否挂载状态缩容

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

test

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

test

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

test

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


3 如何对根分区进行缩容

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

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

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

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

test

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

test

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

test

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

test

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

test

至此,根分区成功缩容!

0

评论

博主关闭了当前页面的评论