LVM(Logical Volume Manager,逻辑卷管理器)是 Linux 下对磁盘进行弹性管理的方案。传统分区一旦划分就固定了,而 LVM 允许你动态调整文件系统大小、跨多个物理磁盘、在线扩容,无需重新格式化或重新分区。
核心概念三件套:
PV(Physical Volume,物理卷):LVM 的基础单元,通常是整个磁盘或磁盘分区,初始化后可添加到卷组
VG(Volume Group,卷组):由一个或多个物理卷组成的存储池,大小是所有物理卷大小的总和
LV(Logical Volume,逻辑卷):从卷组中分配空间创建的虚拟磁盘,可格式化为任何文件系统并挂载使用
简单理解:PV 是砖,VG 是墙,LV 是房间。
下面以一块新磁盘 /dev/vdb 为例,完整走一遍 LVM 创建到挂载的流程。
首先确认目标磁盘存在且未被占用:
# 查看磁盘状态[root@wc-ckg-99-2 data]# lsblk | grep vdbvdb 253:16 0 300G 0 disk└─vdb1 253:17 0 300G 0 part
如果磁盘已有分区(如
vdb1),需要清除分区上的残留数据再创建物理卷:
[root@wc-ckg-99-2 data]# sudo wipefs -a /dev/vdb1/dev/vdb1: 2 bytes were erased at offset 0x00000438 (ext4): 53 ef
将磁盘或分区转化为物理卷,如下则创建成功:
[root@wc-ckg-99-2 data]# pvcreate /dev/vdb1 Physical volume "/dev/vdb1" successfully created.
验证pvs或者 pvdisplay:
[root@wc-ckg-99-2 ~]# pvs PV VG Fmt Attr PSize PFree /dev/vdb1 data_vg lvm2 a-- <300.00g <300.00g
把物理卷加入到卷组中,卷组名 data_vg:
[root@wc-ckg-99-2 ~]# vgcreate data_vg /dev/vdb1 Volume group "data_vg" successfully created.
验证 vgs或者vgdisplay:
[root@wc-ckg-99-2 ~]# vgs VG #PV #LV #SN Attr VSize VFree data_vg 100 wz--n- <300.00g <300.00g
如果是已有卷组想扩容,可以用
vgextend把新的物理卷加到现有卷组里:vgextend data_vg /dev/vdb1
从卷组中分配空间创建逻辑卷。两种方式:
全部可用空间:
[root@wc-ckg-99-2 ~]# lvcreate -l 100%FREE -n data_lv data_vg Logical volume "data_lv" created.
指定大小(如 10G):
lvcreate -L 10G -n data_lv data_vg验证 lvs 或者 lvdisplay:
[root@wc-ckg-99-2 ~]# lvs LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert data_lv data_vg -wi-a----- <300.00g
先通过 lvdisplay 确认逻辑卷路径,再格式化:
# 查看逻辑卷路径[root@ansible-111 worker]# lvdisplay--- Logical volume --- LV Path /dev/data_vg/data_lv LV Name data_lv VG Name data_vg ...
格式化(XFS 或 ext4 均可):
# XFS(推荐,支持在线扩容)mkfs.xfs /dev/data_vg/data_lv# ext4[root@wc-ckg-99-2 ~]# mkfs.ext4 /dev/data_vg/data_lvmke2fs 1.45.6 (20-Mar-2020)Creating filesystem with 78642176 4k blocks and 19660800 inodesFilesystem UUID: d7d4960c-555d-42ef-96db-e11056b29f75...Writing superblocks and filesystem accounting information: done.
生产环境推荐 XFS(支持在线扩容,CentOS 7+ 默认文件系统),ext4 也可用(支持扩缩容,但缩容风险较高)。
# 创建挂载点并临时挂载mkdir /datamount /dev/data_vg/data_lv /data# 验证df -h /data
推荐使用 UUID 而非设备路径,避免磁盘顺序变化导致挂载错乱:
# 查看逻辑卷 UUID[root@wc-ckg-99-2 ~]# blkid/dev/mapper/data_vg-data_lv: UUID="d7d4960c-555d-42ef-96db-e11056b29f75"BLOCK_SIZE="4096"TYPE="ext4"# 写入 fstabecho"UUID=d7d4960c-555d-42ef-96db-e11056b29f75 /data ext4 defaults 0 0" >> /etc/fstab# 测试 fstab 配置是否正确(无报错即为成功)mount -a
也可以用
/dev/mapper/data_vg-data_lv路径写入 fstab,但 UUID 方式更稳妥。
# 1. 创建物理卷pvcreate /dev/vdb# 2. 创建卷组vgcreate data_vg /dev/vdb# 3. 创建逻辑卷lvcreate -l100%FREE -n data_lv data_vg# 4. 格式化mkfs.ext4 /dev/data_vg/data_lv# 5. 挂载mkdir /datamount /dev/data_vg/data_lv /data# 6. 配置开机自动挂载blkid /dev/data_vg/data_lv # 获取 UUIDecho"UUID=xxxx-xxxx /data ext4 defaults 0 0" >> /etc/fstabmount -a# 测试
LVM 最大的好处就是在线扩容,不用停机。假设空间不够了,新加了一块 /dev/vdc:
# 1. 新磁盘创建 PVpvcreate /dev/vdc# 2. 扩展卷组vgextend data_vg /dev/vdc# 3. 扩展逻辑卷(增加 50G)lvextend -L+50G /dev/data_vg/data_lv# 4. 刷新文件系统(XFS 用 xfs_growfs,ext4 用 resize2fs)xfs_growfs /data
四条命令,全程在线,不停服务。
优点:
灵活性:动态调整逻辑卷大小,无需停机或重新分区
可扩展性:轻松添加新物理卷到卷组,增加存储容量
快照支持:可创建逻辑卷快照,方便备份和恢复
条带化:可在多个物理卷之间条带化数据,提高读写性能
故障隔离:逻辑卷跨多个物理卷,单盘故障不影响其他卷
缺点:
复杂性:比传统分区管理更复杂,需要理解 PV/VG/LV 概念
性能开销:额外的抽象层可能引入轻微性能损耗
学习曲线:初学者需要时间熟悉 LVM 的概念和命令
| 命令 | 作用 |
|---|---|
pvs / pvdisplay | 查看物理卷信息 |
vgs / vgdisplay | 查看卷组信息 |
lvs / lvdisplay | 查看逻辑卷信息 |
vgextend | 扩展卷组 |
vgremove | 删除卷组 |
lvextend | 扩展逻辑卷 |
lvremove | 删除逻辑卷 |
xfs_growfs | 刷新 XFS 文件系统(扩容后) |
resize2fs | 刷新 ext4 文件系统(扩容后) |
wipefs -a | 清除磁盘分区残留数据 |
写 fstab 优先用 UUID,避免磁盘顺序变化导致挂载混乱
XFS 只支持扩容不支持缩容,ext4 支持扩缩容但缩容需先卸载,生产环境慎用
操作前建议先 vgs 确认卷组剩余空间(VFree)够不够
新磁盘创建 PV 前先 lsblk 确认磁盘未被占用,必要时用 wipefs -a 清除残留