📖 知识点简介
运维日常中,"磁盘满了"是最常见的报警之一。面对分区空间不足、扩容困难的问题,LVM(Logical Volume Manager,逻辑卷管理器) 提供了灵活的解决方案------它打破了传统分区"固定大小"的限制,支持在线扩容、缩容、快照和跨磁盘聚合。掌握 LVM 是现代 Linux 运维的必修课。
🛠 核心命令整理
1. 物理卷(PV)管理
| 命令 | 说明 |
|---|---|
pvcreate /dev/sdb1 |
将分区初始化为物理卷 |
pvs |
简要查看所有物理卷 |
pvdisplay |
查看物理卷详细信息 |
pvremove /dev/sdb1 |
移除物理卷(清空 LVM 元数据) |
2. 卷组(VG)管理
| 命令 | 说明 |
|---|---|
vgcreate vg_data /dev/sdb1 /dev/sdc1 |
创建卷组,可包含多个 PV |
vgs |
简要查看所有卷组 |
vgdisplay vg_data |
查看卷组详情(PE 大小、总量、剩余空间) |
vgextend vg_data /dev/sdd1 |
向卷组添加新物理卷(扩容!) |
vgreduce vg_data /dev/sdb1 |
从卷组移除物理卷 |
3. 逻辑卷(LV)管理
| 命令 | 说明 |
|---|---|
lvcreate -L 100G -n lv_data vg_data |
创建 100GB 逻辑卷 |
lvcreate -l 100%FREE -n lv_data vg_data |
用全部剩余空间创建 |
lvs |
简要列出所有逻辑卷 |
lvdisplay vg_data/lv_data |
查看逻辑卷详情 |
lvextend -L +50G /dev/vg_data/lv_data |
在线扩容 50GB(不用卸载!) |
lvextend -l +100%FREE /dev/vg_data/lv_data |
用尽 VG 所有剩余空间 |
lvreduce -L 50G /dev/vg_data/lv_data |
缩容(⚠️ 需先缩文件系统) |
lvremove /dev/vg_data/lv_data |
删除逻辑卷 |
4. 文件系统感知(重要!)
bash
# 扩容后必须同步文件系统!
# ext4 文件系统
resize2fs /dev/vg_data/lv_data
# xfs 文件系统
xfs_growfs /dev/vg_data/lv_data
# 也可以一步到位(内核 3.6+ 支持)
lvextend -L +50G /dev/vg_data/lv_data --resizefs
📝 实操示例
示例 1:从零搭建 LVM 存储
bash
# 查看可用磁盘
lsblk | grep -E "sd[b-z]|nvme[0-9]n[0-9]"
# 输出: sdb 8:16 0 500G 0 disk
# sdc 8:32 0 500G 0 disk
# 创建分区并标记为 LVM(使用 parted 或 fdisk)
parted /dev/sdb mklabel gpt
parted /dev/sdb mkpart primary 0% 100%
parted /dev/sdb set 1 lvm on
# 同样操作 /dev/sdc
# 1. 创建 PV
pvcreate /dev/sdb1 /dev/sdc1
# 2. 创建 VG(将两块 500G 盘聚合为 1T 池)
vgcreate vg_data /dev/sdb1 /dev/sdc1
# 3. 创建 LV
lvcreate -L 800G -n lv_app vg_data
lvcreate -L 150G -n lv_log vg_data
# 4. 格式化并挂载
mkfs.ext4 /dev/vg_data/lv_app
mkfs.ext4 /dev/vg_data/lv_log
mkdir /data /logs
mount /dev/vg_data/lv_app /data
mount /dev/vg_data/lv_log /logs
# 5. 写入 fstab 开机自动挂载
echo "/dev/vg_data/lv_app /data ext4 defaults 0 2" >> /etc/fstab
echo "/dev/vg_data/lv_log /logs ext4 defaults 0 2" >> /etc/fstab
示例 2:磁盘快满了?在线扩容!
bash
# 场景:/data 目录告警,使用率已达 92%
# 第一步:查看剩余空间
vgs vg_data
# 输出: VG #PV #LV #SN Attr VSize VFree
# vg_data 2 2 0 wz--n- 1000G 50G
# 剩余 50G,但不够?加一块新盘
pvcreate /dev/sdd1
vgextend vg_data /dev/sdd1 # 再追加 500G
# 第二步:扩容 LV + 同步文件系统(一步到位)
lvextend -L +200G /dev/vg_data/lv_app --resizefs
# 第三步:验证
df -h /data
# /dev/mapper/vg_data-lv_app 1000G 740G 260G 74% /data
# ✅ 在线扩容成功,无需重启、无需卸载!
示例 3:LVM 快照做临时备份
bash
# 给正在运行的数据库 LV 打快照(只读,做备份前一致性检查)
lvcreate -L 10G -s -n lv_db_snap /dev/vg_data/lv_db
# 挂载快照检查数据一致性
mkdir /snap_mount
mount /dev/vg_data/lv_db_snap /snap_mount
# 检查完成后清理
umount /snap_mount
lvremove /dev/vg_data/lv_db_snap
⚠️ 常见坑点/注意事项
- XFS 不支持缩容! RedHat/CentOS 7+ 默认用 XFS,一旦扩容就不能缩。需要缩容只能用 ext4,且必须按顺序:先缩文件系统 → 再缩 LV。
lvextend后一定要resize2fs/xfs_growfs,否则内核仍然认旧大小,df -h看不到变化。- PV 去除前必须确认 LV 不在其上 :
pvmove /dev/sdb1将数据迁移到同 VG 的其他 PV 上,再vgreduce vg_data /dev/sdb1才能安全移除。 - 快照卷会随着源卷变化而增长:源卷写入越多,快照占用越大。快照满了会自动失效(变成"invalid"),定期清理。
- PE 大小影响容量上限:默认 PE=4MiB,单 LV 最大 4PB,一般够用。超大规模存储可酌情调整。
/boot不能放 LVM 上:GRUB(Legacy)不支持 LVM 分区。/boot 必须是标准分区。