高级磁盘管理08 — LVM 的扩容与缩容

概述

本章,您将学习 LVM 的在线扩容与缩容。在线指的是处于挂载情况下的相应操作。需要注意这里针对的是 VG 和 LV。

Shell > pvscan
  PV /dev/sdb1   VG vg01            lvm2 [<10.00 GiB / 0    free]
  PV /dev/sdc1   VG vg01            lvm2 [<10.00 GiB / 0    free]
  Total: 2 [19.99 GiB] / in use: 2 [19.99 GiB] / in no VG: 0 [0   ]

Shell > vgscan
  Found volume group "vg01" using metadata type lvm2

Shell > lvscan
  ACTIVE            '/dev/vg01/lv01' [1.00 GiB] inherit
  ACTIVE            '/dev/vg01/lv02' [18.99 GiB] inherit

Shell > vgdisplay vg01
  --- Volume group ---
  VG Name               vg01
  System ID
  Format                lvm2
  Metadata Areas        2
  Metadata Sequence No  3
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                2
  Open LV               0
  Max PV                0
  Cur PV                2
  Act PV                2
  VG Size               19.99 GiB
  PE Size               4.00 MiB
  Total PE              5118
  Alloc PE / Size       5118 / 19.99 GiB
  Free  PE / Size       0 / 0
  VG UUID               jFqzMt-lCMo-eLC1-0oJa-uqzf-M66U-KpuXMA

# 临时挂载
Shell > mount -t ext4 /dev/vg01/lv01 /lv01/
Shell > mount -t ext4 /dev/vg01/lv02 /lv02/

Shell > df -hT
Filesystem            Type      Size  Used Avail Use% Mounted on
...
/dev/mapper/vg01-lv01 ext4      974M   24K  907M   1% /lv01
/dev/mapper/vg01-lv02 ext4       19G   24K   18G   1% /lv02

基本信息:

  • 使用了两块 10GiB 的机械硬盘,并给每个机械硬盘划分出了一个容量全给的主分区
  • 将各个硬盘的分区初始化为 PV
  • 将两个 PV 加入到 vg01 这个 VG 中
  • 从 vg01 中划分出了两个 LV,分别是 /dev/vg01/lv01(1GiB) 和 /dev/vg01/lv02(18.99GiB)
  • vg01 这个 VG 已经没有可分配的 PE 数量(Free PE / Size 0 / 0
  • 两个 LV 使用的文件系统为 ext4

LV 在线扩容

需求:在已有 1GiB 的基础上将 lv01 再增加 500MiB,即 lv01 的总容量大小为 1.5GiB

请注意!LV 的在线扩容不可跨 VG 进行操作。

基本步骤如下:

  1. 查阅当前 LV 所在的 VG 是否有剩余可分配的空间(例如 vgdisplay vg01
  2. 若有剩余空间且满足分配容量的条件,直接操作;若无剩余空间,则需要对 LV 所在的 VG 进行在线扩容
  3. 因为需要对 LV 所在的 VG 进行在线扩容,因此需要再添加满足分配容量条件的新硬盘
  4. 对新硬盘分区 —> 初始化为 PV —> 添加到相应的 VG 中即可对 VG 在线扩容(需使用 vgextend 命令)
  5. 执行 lvextend 命令的相关选项完成 LV 的在线扩容

在我的当前环境中,因为 vg01 的剩余容量已经使用完毕,因此需要我们再添加新的硬盘:

# 我这里在 Vmware Workstation 中添加了一块 10GiB 的新硬盘,其被 udev 识别为 sdd

Shell > lsblk
NAME          MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda             8:0    0   50G  0 disk
├─sda1          8:1    0    1G  0 part /boot
├─sda2          8:2    0   47G  0 part /
└─sda3          8:3    0    2G  0 part [SWAP]
sdb             8:16   0   10G  0 disk
└─sdb1          8:17   0   10G  0 part
  ├─vg01-lv01 253:0    0    1G  0 lvm  /lv01
  └─vg01-lv02 253:1    0   19G  0 lvm  /lv02
sdc             8:32   0   10G  0 disk
└─sdc1          8:33   0   10G  0 part
  └─vg01-lv02 253:1    0   19G  0 lvm  /lv02
sdd             8:48   0   10G  0 disk
sr0            11:0    1 13.2G  0 rom

具体的操作:

Shell > parted /dev/sdd
GNU Parted 3.2
Using /dev/sdd
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) mklabel gpt
(parted) mkpart primary 0% 100%
(parted) print
Model: ATA VMware Virtual S (scsi)
Disk /dev/sdd: 10.7GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:

Number  Start   End     Size    File system  Name     Flags
 1      1049kB  10.7GB  10.7GB               primary

(parted) quit
Information: You may need to update /etc/fstab.

# 初始化为 PV
Shell > pvcreate /dev/sdd1
  Physical volume "/dev/sdd1" successfully created.

# 将该 PV 加入到 vg01 中
Shell > vgextend vg01 /dev/sdd1
  Volume group "vg01" successfully extended

Shell > vgs
  VG   #PV #LV #SN Attr   VSize   VFree
  vg01   3   2   0 wz--n- <29.99g <10.00g

# 如输出信息所示,我们能操作的 PE 数量为 2559(10GiB)
Shell > vgdisplay vg01
  --- Volume group ---
  VG Name               vg01
  System ID
  Format                lvm2
  Metadata Areas        3
  Metadata Sequence No  4
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                2
  Open LV               2
  Max PV                0
  Cur PV                3
  Act PV                3
  VG Size               <29.99 GiB
  PE Size               4.00 MiB
  Total PE              7677
  Alloc PE / Size       5118 / 19.99 GiB
  Free  PE / Size       2559 / <10.00 GiB
  VG UUID               jFqzMt-lCMo-eLC1-0oJa-uqzf-M66U-KpuXMA

# 使用 lvextend 命令对 lv01 进行扩容
## -L 选项的值中,"+" 前缀表示在已有容量的基础上增加容量,若无 "+" 前缀,表示扩容到指定的大小,单位后缀不区分大小,如 m 或 M 后缀表示 MiB;g 或 G 单位后缀表示 GiB
Shell > lvextend -L +500M /dev/vg01/lv01
Size of logical volume vg01/lv01 changed from 1.00 GiB (256 extents) to <1.49 GiB (381 extents).
  Logical volume vg01/lv01 successfully resized.

# 再次查阅信息
Shell > lvs
  LV   VG   Attr       LSize  Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  lv01 vg01 -wi-ao---- <1.49g
  lv02 vg01 -wi-ao---- 18.99g

此时文件系统显示的容量却没有变化,还是原先的 1GiB:

Shell > df -hT
Filesystem            Type      Size  Used Avail Use% Mounted on
...
/dev/mapper/vg01-lv01 ext4      974M   24K  907M   1% /lv01
/dev/mapper/vg01-lv02 ext4       19G   24K   18G   1% /lv02

Q:正常情况下,对 LV 进行在线扩容时,lvextend 命令除了 -L SIZE 选项外,还需要添加 -r 选项,表示将 LVM 的容量信息和文件系统的信息一起进行调整,但是我在线扩容时并没有添加 -r 选项,应该怎么办呢?

  • 对于 ext4 文件系统,执行 resize2fs -p -F /dev/vg01/lv01
  • 对于 xfs 文件系统,执行 xfs_growfs -p -F /dev/vg01/lv01
Shell > resize2fs -p -F /dev/vg01/lv01
resize2fs 1.45.6 (20-Mar-2020)
Filesystem at /dev/vg01/lv01 is mounted on /lv01; on-line resizing required
old_desc_blocks = 1, new_desc_blocks = 1
The filesystem on /dev/vg01/lv01 is now 390144 (4k) blocks long.

Shell > df -hT
Filesystem            Type      Size  Used Avail Use% Mounted on
...
/dev/mapper/vg01-lv01 ext4      1.5G   24K  1.4G   1% /lv01
/dev/mapper/vg01-lv02 ext4       19G   24K   18G   1% /lv02

VG 在线扩容

上面已经演示(vgextend vg01 /dev/sdd1),略过。

LV 缩容

极少数情况下会使用到缩容。请注意!任何缩容操作均有风险,操作前务必备份关键数据。

# 先备份数据到其他目录
Shell > mkdir /lv01-backup/
Shell > mv /lv01/* /lv01-backup/

# 需要处于非挂载状态
Shell > umount /lv01/

# 不要忘记 -r 选项
# -L SIZE 表示缩容到指定大小
Shell > lvreduce -r -L 1G /dev/vg01/lv01

# 临时挂载
Shell > mount -t ext4 /dev/vg01/lv01 /lv01/

# lv01 的容量大小是正确的
Shell > df -hT
Filesystem            Type      Size  Used Avail Use% Mounted on
...
/dev/mapper/vg01-lv02 ext4       19G   24K   18G   1% /lv02
/dev/mapper/vg01-lv01 ext4      974M   24K  910M   1% /lv01

# 将原先的数据移动过来
Shell > mv /lv01-backup/* /lv01/

对于 ext4 文件系统,若使用 lvreduce 命令时忘记添加了 -r 选项,则会导致后续挂载不上的情况:

# 假设 lv01 处于未挂载的状态
Shell > umount /lv01

Shell > lvreduce -L 1G /dev/vg01/lv01
  WARNING: Reducing active logical volume to 1.00 GiB.
  THIS MAY DESTROY YOUR DATA (filesystem etc.)
Do you really want to reduce vg01/lv01? [y/n]: y
  Size of logical volume vg01/lv01 changed from <1.49 GiB (381 extents) to 1.00 GiB (256 extents).
  Logical volume vg01/lv01 successfully resized.

Shell > mount -t ext4 /dev/vg01/lv01 /lv01/
mount: /lv01: wrong fs type, bad option, bad superblock on /dev/mapper/vg01-lv01, missing codepage or helper program, or other error.

# 解决办法如下:
## 重新格式化
Shell > mkfs -t ext4 /dev/vg01/lv01
mke2fs 1.45.6 (20-Mar-2020)
/dev/vg01/lv01 contains a ext4 file system
        last mounted on Wed Jun 25 14:42:43 2025
Proceed anyway? (y,N) y
Creating filesystem with 262144 4k blocks and 65536 inodes
Filesystem UUID: 6b2ea0da-2ead-4914-88d1-68be4d0ea8de
Superblock backups stored on blocks:
        32768, 98304, 163840, 229376

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

## 挂载后文件系统系统的容量正确
Shell > mount -t ext4 /dev/vg01/lv01 /lv01/
Shell > df -hT
Filesystem            Type      Size  Used Avail Use% Mounted on
...
/dev/mapper/vg01-lv02 ext4       19G   24K   18G   1% /lv02
/dev/mapper/vg01-lv01 ext4      974M   24K  907M   1% /lv01

# 把备份数据移动过来
Shell > mv /lv01-backup/* /lv01/

VG 在线缩容

要对 VG 在线缩容,其实就是将 VG 中相应的 PV 移除,使用的命令为 vgreduce

需要注意的是,若 VG 当中的 PV 正在被使用,则 VG 的在线缩容会失败,比如:

Shell > vgreduce vg01 /dev/sdb1
  Physical volume "/dev/sdb1" still in use

出现这种情况时可进行下面的操作:

# 使用 pvmove 命令将相应 PV 里的数据迁移到其他 PV ,需要注意目标 PV 的实际可用容量需要大于源 PV
Shell > pvmove /dev/sdb1 /dev/sdd1
  /dev/sdb1: Moved: 2.19%
  /dev/sdb1: Moved: 10.00%
  /dev/sdb1: Moved: 100.00%

Shell > vgreduce vg01 /dev/sdb1
  Removed "/dev/sdb1" from volume group "vg01"

Shell > pvs
  PV         VG   Fmt  Attr PSize   PFree
  /dev/sdb1       lvm2 ---  <10.00g <10.00g
  /dev/sdc1  vg01 lvm2 a--  <10.00g      0
  /dev/sdd1  vg01 lvm2 a--  <10.00g      0

Shell > vgs
  VG   #PV #LV #SN Attr   VSize  VFree
  vg01   2   2   0 wz--n- 19.99g    0

Shell > lvs
  LV   VG   Attr       LSize  Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  lv01 vg01 -wi-ao----  1.00g
  lv02 vg01 -wi-ao---- 18.99g
Avatar photo

关于 陸風睿

GNU/Linux 从业者、开源爱好者、技术钻研者,撰写文档既是兴趣也是工作内容之一。Q - "281957576";WeChat - "jiulongxiaotianci",Github - https://github.com/jimcat8
用一杯咖啡支持我们,我们的每一篇[文档]都经过实际操作和精心打磨,而不是简单地从网上复制粘贴。期间投入了大量心血,只为能够真正帮助到您。
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇