传统分区一旦划好,想扩就得备份、删分区、重划、再恢复,全程要停机。LVM(Logical Volume Manager)在物理硬盘和文件系统之间加了一层抽象:把多块盘拼成一个大池,再从池里按需切逻辑卷。扩容缩容不用动物理盘,快照做备份也方便。这一篇从创建、在线扩容、缩容到快照完整走一遍,顺带把最容易搞反的缩容顺序讲清楚。
一、先理清三层结构
| PV | Physical Volume 物理卷 | 一块盘或一个分区,pvcreate 之后的状态 |
| VG | Volume Group 卷组 | 把多个 PV 捆在一起的存储池 |
| LV | Logical Volume 逻辑卷 | 从 VG 里切出来、给文件系统用的"虚拟分区" |
| PE | Physical Extent | VG 的最小分配单元,默认 4MB |
理解方式很简单:VG 是一块大画布,LV 是从画布上剪下来的画纸,文件系统就画在画纸上。新盘加进来就是往画布上添料,扩 LV 就是把画纸拉大——只要画布上还有空余,文件系统跟着长就行。
二、安装与准备
Ubuntu/Debian 上先装:
sudo apt install lvm2
CentOS/Rocky 最小化安装通常自带,缺了就 sudo dnf install lvm2。
假设新插了两块空盘 /dev/sdb、/dev/sdc,先 lsblk 确认没挂着数据,再建 PV:
sudo pvcreate /dev/sdb /dev/sdc
预期输出:
Physical volume "/dev/sdb" successfully created.
Physical volume "/dev/sdc" successfully created.
pvcreate 会抹掉盘上原有分区表和数据,只对确认不要了的盘执行。查看 PV:
sudo pvs
预期输出:
PV VG Fmt Attr PSize PFree
/dev/sdb lvm2 — 200.00g 200.00g
/dev/sdc lvm2 — 200.00g 200.00g
三、创建 VG 和 LV
建卷组
sudo vgcreate vg_data /dev/sdb /dev/sdc
预期输出:
Volume group "vg_data" successfully created
vg_data 是自己起的名字。两块盘现在合成一个 400G 的池子:
sudo vgs
预期输出:
VG #PV #LV #SN Attr VSize VFree
vg_data 2 0 0 wz–n- 400.99g 400.99g
VFree 就是池子里还剩多少没用。
建逻辑卷并格式化
切一个 100G 的 LV:
sudo lvcreate -n lv_data -L 100G vg_data
预期输出:
Logical volume "lv_data" created.
也可以用占比方式,把整个池子一次切完:
sudo lvcreate -n lv_all -l 100%FREE vg_data
-L 按大小给(10G),-l 按 PE 数量或百分比给(100%FREE),别搞混。
格式化并挂载:
sudo mkfs.ext4 /dev/vg_data/lv_data
sudo mkdir -p /data
sudo mount /dev/vg_data/lv_data /data
LV 的设备节点有两个等价路径:/dev/vg_data/lv_data 和 /dev/mapper/vg_data-lv_data,fstab 里写哪个都行,推荐前者,可读性好。
四、在线扩容:最常用的操作
业务涨了,/data 不够用了。流程是:先加盘进 VG,再扩 LV,最后扩文件系统。
第一步:新盘加入 VG
假设又插了一块 /dev/sdd:
sudo pvcreate /dev/sdd
sudo vgextend vg_data /dev/sdd
vgs 里 VFree 会多出这 200G。
第二步:扩 LV 和文件系统
ext4 可以在线扩(挂载状态下直接长),一条命令连 LV 带文件系统一起扩:
sudo lvextend -L +50G -r /dev/vg_data/lv_data
预期输出(节选):
Size of logical volume vg_data/lv_data changed from 100.00 GiB to 150.00 GiB.
Logical volume vg_data/lv_data successfully resized.
resize2fs 1.46.5 (30-Dec-2021)
Filesystem at /dev/mapper/vg_data-lv_data is mounted on /data; on-line resizing required
…
-r 是关键:它让 lvextend 自动调用 resize2fs(ext4)或 xfs_growfs(XFS),不用自己再跑一遍。
如果不加 -r,得手动分两步:
sudo lvextend -L +50G /dev/vg_data/lv_data
sudo resize2fs /dev/vg_data/lv_data # ext4
XFS 注意:XFS 只能扩不能缩,而且 xfs_growfs 后面跟的是挂载点,不是设备:
sudo lvextend -L +50G -r /dev/vg_data/lv_data # -r 会自动调 xfs_growfs
# 手动写法:
sudo xfs_growfs /data
五、缩容:顺序错了会丢数据
缩容比扩容危险得多,而且 XFS 根本不支持缩,下面只讲 ext4。顺序必须是:先缩文件系统,再缩 LV。反过来——先把 LV 切小,文件系统还以为自己占着更大的地盘,直接损坏。
完整步骤:
sudo umount /data
sudo e2fsck -f /dev/vg_data/lv_data # 必须先检查
sudo resize2fs /dev/vg_data/lv_data 80G # 文件系统缩到 80G
sudo lvreduce -L 80G /dev/vg_data/lv_data # LV 再缩到 80G
sudo mount /data
预期输出(resize2fs,节选):
Resizing the filesystem on /dev/mapper/vg_data-lv_data to 20971520 (4k) blocks.
The filesystem on /dev/mapper/vg_data-lv_data is now 20971520 (4k) blocks long.
几个硬规矩:
- 必须先 umount,挂载状态下缩 ext4 会出问题。
- 必须先 e2fsck -f,文件系统不干净时 resize2fs 拒绝干活。
- 新大小要给文件系统留余量:resize2fs 写 80G,lvreduce 也写 80G,别让 LV 比文件系统还小。
- 缩容前把 /data 里的重要数据备份一份。这是少数"操作前必须备份"的场景。
六、快照:给 LV 拍个照
LVM 快照在某一瞬间冻结 LV 的视图,适合备份前先打个快照,在快照上跑备份,不影响业务盘。
sudo lvcreate -s -n lv_data_snap -L 2G /dev/vg_data/lv_data
预期输出:
Logical volume "lv_data_snap" created.
预期输出里 -L 2G 是快照本身的容量,存"原 LV 在快照期间被改动的数据块"。原盘写得越多,快照占用越大,撑满了快照就作废。数据库类场景快照大小按预期变更量估。
快照挂上来看看:
sudo mkdir -p /mnt/snap
sudo mount -o ro /dev/vg_data/lv_data_snap /mnt/snap
ls /mnt/snap
备份完,删掉快照:
sudo umount /mnt/snap
sudo lvremove /dev/vg_data/lv_data_snap
七、⚠️ 常见错误
八、知识扩展:PE 大小选错的代价
建 VG 时可以用 -s 指定 PE(物理块)大小,默认 4MB:
sudo vgcreate -s 16M vg_data /dev/sdb /dev/sdc
PE 是 VG 分配的最小颗粒。一个 VG 最多支持 65534 个 PE,所以 PE 大小直接决定 VG 总容量上限:4MB × 65534 ≈ 256GB,16MB ≈ 1TB,对现代动不动几十 T 的存储池就不够看了。大容量池子一般建 VG 时就把 PE 设成 32MB 或 64MB。
建 VG 时没指定,之后想改 PE 大小只能重建 VG,所以规划阶段就算好。这也是为什么 LVM 适合"长期规划"的存储池,而不是临时玩玩。
另一个省事命令:vgs、pvs、lvs 是简表,写脚本用;vgdisplay、pvdisplay、lvdisplay 是详情,排障时看完整信息用。日常记 pvs / vgs / lvs 三条就够。
网硕互联帮助中心





评论前必须登录!
注册