概述
本章,您将学习 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 进行操作。
基本步骤如下:
- 查阅当前 LV 所在的 VG 是否有剩余可分配的空间(例如
vgdisplay vg01
) - 若有剩余空间且满足分配容量的条件,直接操作;若无剩余空间,则需要对 LV 所在的 VG 进行在线扩容
- 因为需要对 LV 所在的 VG 进行在线扩容,因此需要再添加满足分配容量条件的新硬盘
- 对新硬盘分区 —> 初始化为 PV —> 添加到相应的 VG 中即可对 VG 在线扩容(需使用
vgextend
命令) - 执行
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
版权声明:「自由转载-保持署名-非商业性使用-禁止演绎 3.0 国际」(CC BY-NC-ND 3.0)

用一杯咖啡支持我们,我们的每一篇[文档]都经过实际操作和精心打磨,而不是简单地从网上复制粘贴。期间投入了大量心血,只为能够真正帮助到您。
暂无评论