二、传统分区的痛点:你永远不知道未来需要多大空间
早期我习惯用fdisk直接分区,比如:
fdisk /dev/sdb
# 依次输入 n, p, 1, +100G, w
mkfs.ext4 /dev/sdb1
mount /dev/sdb1 /data
这种方式简单直接,但问题很明显:
-
- 分区大小固定:一旦业务增长,/data不够用了,只能停机、备份、重建分区、恢复数据——过程痛苦且容易出错。
-
- 无法在线调整:ext4文件系统虽然支持resize2fs扩容,但前提是底层分区本身得先变大——而传统分区一旦创建,大小就焊死了。
-
- 空间碎片化:多块磁盘、多个分区,很容易出现“A分区爆满,B分区大量空闲”的尴尬局面。
-
三、LVM:给磁盘空间装上“热插拔”能力
LVM(Logical Volume Manager)的核心思想,就是把物理磁盘的“硬分区”抽象成“逻辑卷”,让空间管理变得像搭积木一样灵活。我的标准做法如下:
1. 创建物理卷(PV)
假设有两块新磁盘:/dev/sdb(500GB)和/dev/sdc(500GB)。
# 初始化物理卷
pvcreate /dev/sdb /dev/sdc
# 查看物理卷信息
pvs
# 输出示例:
# PV VG Fmt Attr PSize PFree
# /dev/sdb lvm2 a-- 500.00g 500.00g
# /dev/sdc lvm2 a-- 500.00g 500.00g
2. 创建卷组(VG)
把这两块盘加入同一个卷组,实现空间池化:
# 创建卷组 vg_data
vgcreate vg_data /dev/sdb /dev/sdc
# 查看卷组
vgs
# VG #PV #LV #SN Attr VSize VFree
# vg_data 2 0 0 wz--n- 1000.00g 1000.00g
3. 创建逻辑卷(LV)并格式化
从卷组中划出逻辑卷,类似“软分区”:
# 创建200GB的逻辑卷 lv_logs
lvcreate -L 200G -n lv_logs vg_data
# 格式化
mkfs.ext4 /dev/vg_data/lv_logs
# 挂载
mkdir /logs
mount /dev/vg_data/lv_logs /logs
# 查看逻辑卷
lvs
# LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
# lv_logs vg_data -wi-ao---- 200.00g
4. 在线扩容:从100GB到300GB,只需一条命令
回到文章开头的场景:如果/lv_logs空间不够了,而卷组里还有空闲空间(比如还剩800GB),只需:
# 逻辑卷扩容到300GB
lvextend -L 300G /dev/vg_data/lv_logs
# 或者增加100GB(推荐写法)
lvextend -L +100G /dev/vg_data/lv_logs
# 文件系统扩容(ext4用resize2fs,xfs用xfs_growfs)
resize2fs /dev/vg_data/lv_logs
# 验证
df -h /logs
# Filesystem Size Used Avail Use% Mounted on
# /dev/mapper/vg_data-lv_logs 295G 60G 235G 21% /logs
整个过程无需卸载、无需重启、零停机。这就是LVM最核心的价值。
四、实际排坑经验:那些年我踩过的LVM的坑
坑1:误用xfs文件系统,resize2fs报错
某次给一台CentOS 7服务器扩容,执行resize2fs时报错:
resize2fs: Bad magic number in super-block while trying to open /dev/vg_data/lv_data
检查发现,该逻辑卷当初格式化为xfs(CentOS 7默认)。xfs扩容命令是xfs_growfs,且只能扩容,不能缩容。
正确操作:
xfs_growfs /mount_point
# 注意:xfs_growfs需要挂载点,而非设备路径
教训:初始化时,如果业务对缩容无需求,xfs是很好的选择;如果未来可能需要缩容(比如临时分配空间),请用ext4。
坑2:物理磁盘故障导致卷组降级
某次一块磁盘出现坏道,pvdisplay显示PV Status: not available。此时卷组中的逻辑卷虽然还能读,但写入会报I/O错误。
处理流程:
-
-
- 将该物理卷从卷组中移除:
vgreduce vg_data /dev/sdb
-
- 更换新磁盘,重新加入卷组:
pvcreate /dev/sdd
vgextend vg_data /dev/sdd
-
- 如果卷组中还有数据需要迁移,使用
pvmove:pvmove /dev/sdb /dev/sdd
-
关键点:生产环境务必对重要逻辑卷做快照或备份。LVM本身提供快照功能:
lvcreate -L 10G -s -n lv_logs_snap /dev/vg_data/lv_logs
坑3:分区对齐导致性能下降
早期我直接用fdisk创建LVM物理卷,结果发现4K磁盘(如SSD)性能只有预期的60%。排查发现是分区起始扇区未对齐。
正确做法:使用parted或gdisk创建分区时,指定对齐参数:
parted /dev/sdb mklabel gpt
parted /dev/sdb mkpart primary 0% 100%
parted /dev/sdb align-check optimal 1
# 若显示“1 aligned”,说明对齐成功
或者直接用pvcreate的--dataalignment参数:
pvcreate --dataalignment 1024K /dev/sdb
五、生产环境的最佳实践
基于多年经验,我总结了一套LVM管理“黄金法则”:
-
初始化阶段:服务器到手后,立即将剩余磁盘空间全部加入一个卷组(如vg_root),然后按需划出逻辑卷。即使当前只需要100GB,也保留剩余空间在卷组中,方便未来扩容。
-
命名规范:卷组名建议用vg_<用途>(如vg_data),逻辑卷名用lv_<挂载点>(如lv_logs)。避免使用默认的VolGroup00,否则多台服务器容易混淆。
-
监控指标:不仅监控文件系统使用率(df -h),还要监控卷组空闲空间(vgs)。当卷组空闲空间低于20%时,提前规划加盘。
-
快照策略:对数据库、设置目录等关键数据,定期创建LVM快照(注意快照会占用空间,且不能作为长期备份)。
-
缩容操作:如果必须缩容(如从500GB缩到300GB),先卸载文件系统,用e2fsck检查,再用resize2fs缩小文件系统,最后用lvreduce缩小逻辑卷。顺序不能错,且操作前必须备份。
-
六、总结
LVM不是银弹,但它解决了传统分区90%的痛点。从那次深夜故障之后,我坚持在所有新服务器上使用LVM——哪怕只是单块磁盘,也先做成PV+VG+LV的架构。因为没人能预测业务三个月后需要多少空间,而LVM给了我们“随时调整”的底气。
最后分享一句我常对团队说的话:“用LVM,你只需要担心磁盘够不够用,而不用操心分区够不够用。” 这大概就是运维工具带给我们的自由。
👨💻 运维经验:根据实际生产环境,以上步骤建议先在测试环境验证,并做好备份。参数值需根据服务器设置调整,不要盲目照搬。