前言
做 IDC 运维的都知道,服务器磁盘空间告警是最常见的故障之一。前面我们聊过怎么排查和清理磁盘空间,但清理总有极限,真正解决问题还得靠扩容。今天这篇就专门讲 Linux LVM(逻辑卷管理器)的实战操作,包括在线扩容、缩容和快照,全程命令可直接复制使用。
一、为什么用 LVM?
传统分区有个致命问题:一旦分完就不能改。比如你给 /data 分了 100G,半年后满了,要么加硬盘挂新目录,要么停机重分区——都挺折腾。
LVM 解决了这个问题:
- 在线扩容:不停机,直接加空间
- 跨磁盘聚合:多块物理盘拼成一个逻辑卷
- 快照功能:秒级创建数据快照,备份神器
- 灵活缩容:用不完的空间可以回收
二、LVM 核心概念(一张图看懂)
三个层次,从下往上:
┌─────────────────────────────────┐
│ 文件系统 (ext4/xfs) │ ← 你用的 /data /home
├─────────────────────────────────┤
│ 逻辑卷 LV (Logical Volume) │ ← 从 VG 分配空间
├─────────────────────────────────┤
│ 卷组 VG (Volume Group) │ ← 多个 PV 的池子
├─────────────────────────────────┤
│ 物理卷 PV (Physical Volume) │ ← 实际磁盘 /dev/sdb /dev/sdc
└─────────────────────────────────┘记住一句话:PV 是砖,VG 是仓库,LV 是分给你的房间。
三、环境准备:创建 LVM
假设服务器新加了一块 /dev/sdb 磁盘(云服务器挂载数据盘也是这个流程)。
3.1 创建物理卷 PV
# 查看磁盘
lsblk
fdisk -l /dev/sdb
# 创建 PV(不需要分区,直接整盘用)
pvcreate /dev/sdb
# 查看 PV
pvdisplay
pvs3.2 创建卷组 VG
# 创建名为 vg_data 的卷组
vgcreate vg_data /dev/sdb
# 查看卷组
vgdisplay vg_data
vgs3.3 创建逻辑卷 LV
# 从 vg_data 分配 100G 创建名为 lv_data 的逻辑卷
lvcreate -L 100G -n lv_data vg_data
# 查看逻辑卷
lvdisplay /dev/vg_data/lv_data
lvs3.4 格式化并挂载
# 格式化为 ext4(推荐 xfs 用于大文件场景)
mkfs.ext4 /dev/vg_data/lv_data
# 或者 mkfs.xfs /dev/vg_data/lv_data
# 创建挂载点并挂载
mkdir -p /data
mount /dev/vg_data/lv_data /data
# 查看挂载结果
df -h /data3.5 写入 fstab 实现开机自动挂载
# 获取 UUID
blkid /dev/vg_data/lv_data
# 编辑 /etc/fstab,添加:
echo "UUID=xxxx-xxxx /data ext4 defaults 0 2" >> /etc/fstab
# 验证 fstab 是否正确(非常重要!)
mount -a四、核心实战:在线扩容(重点!)
这是 LVM 最常用的场景——磁盘满了,在线加空间,全程不需要卸载文件系统。
场景一:VG 还有剩余空间
# 1. 查看 VG 剩余空间
vgs
# 输出:VFree 列显示剩余空间
# 2. 扩展 LV(加 50G)
lvextend -L +50G /dev/vg_data/lv_data
# 或者直接扩展到指定大小
lvextend -L 200G /dev/vg_data/lv_data
# 3. 扩展文件系统(关键步骤!)
# ext4 文件系统:
resize2fs /dev/vg_data/lv_data
# xfs 文件系统:
xfs_growfs /data
# 4. 验证
df -h /data场景二:VG 空间也不够了——先加盘再扩容
# 1. 新盘 /dev/sdc 加入
pvcreate /dev/sdc
# 2. 扩展到已有 VG
vgextend vg_data /dev/sdc
# 3. 确认 VG 空间变大
vgs
# 4. 扩展 LV
lvextend -L +500G /dev/vg_data/lv_data
# 5. 扩展文件系统
resize2fs /dev/vg_data/lv_data # ext4
# 或 xfs_growfs /data # xfs整个过程零停机,线上服务完全不受影响。这就是 LVM 最大的价值。
五、LVM 快照——备份利器
快照是 LVM 的另一个杀手级功能。原理是写时复制(COW),创建瞬间完成,不中断服务。
# 创建快照(分配 10G 用于存储差异数据)
lvcreate -L 10G -s -n lv_data_snap /dev/vg_data/lv_data
# 挂载快照查看数据
mkdir /mnt/snap
mount /dev/vg_data/lv_data_snap /mnt/snap
ls /mnt/snap # 快照中的数据是创建瞬间的完整副本
# 备份快照中的数据
tar -czf /backup/data_$(date +%Y%m%d).tar.gz -C /mnt/snap .
# 用完删除快照
umount /mnt/snap
lvremove /dev/vg_data/lv_data_snap注意:快照空间写满后快照会失效,建议监控快照使用率或分配足够空间。
六、LVM 缩容(谨慎操作!)
缩容比扩容危险,尤其是 ext4 必须先卸载。建议在维护窗口操作。
# ext4 缩容流程(必须先卸载!)
umount /data
e2fsck -f /dev/vg_data/lv_data # 检查文件系统
resize2fs /dev/vg_data/lv_data 50G # 先缩文件系统
lvreduce -L 50G /dev/vg_data/lv_data # 再缩 LV
mount /data
# xfs 不支持缩容!这是 xfs 的硬伤。生产环境建议:如果不是特别需要缩容,用 xfs 就够了,性能更好。需要灵活调整空间就用 ext4。
七、故障排查与常见问题
问题一:扩容后 df -h 没变化
90% 的情况是忘了扩展文件系统。LV 扩展了但文件系统没跟上:
resize2fs /dev/vg_data/lv_data # ext4
xfs_growfs /data # xfs问题二:PV 状态显示 unknown
通常是磁盘被移除或故障:
pvscan
# 如果磁盘已不可用,从 VG 移除
vgreduce --removemissing vg_data问题三:LV 无法激活
# 手动激活
lvchange -ay /dev/vg_data/lv_data
# 查看详细错误
dmesg | tail -50问题四:删除 LVM 的正确顺序
# 先卸载 → 删 LV → 删 VG → 删 PV
umount /data
lvremove /dev/vg_data/lv_data
vgremove vg_data
pvremove /dev/sdb八、生产环境最佳实践
- 建 VG 时预留空间:不要把 VG 全部分配完,留 20%-30% 用于快照和紧急扩容
- 用 xfs 做大文件存储:数据库、日志、视频等大文件场景,xfs 性能优于 ext4
- 用 ext4 做灵活分区:可能需要缩容的场景选 ext4
- 快照不是备份:快照依赖原 LV,原 LV 损坏快照也没用。真正备份还得 rsync/tar + 异地
- 监控 VG 空间:在 Zabbix/Prometheus 中加一条 VG Free 的监控,提前预警
- 扩容前做快照:操作前先打快照,万一出问题还能回滚
总结
LVM 是 Linux 运维的必修课,核心就三招:
- pvcreate → vgcreate → lvcreate:搭积木
- vgextend → lvextend → resize2fs/xfs_growfs:扩容三步走
- lvcreate -s:快照保平安
掌握这些,磁盘空间问题基本告别加班。
<hr/>
标签:Linux运维、LVM、磁盘扩容、逻辑卷管理、IDC运维实战
评论