Linux LVM逻辑卷管理实战:从物理盘到弹性存储的完整指南
承接上篇RAID阵列管理,这次我们把存储玩到极致——RAID负责“硬”,LVM负责“软”,二者联手才是企业级存储的标准答案。
📅 阅读时间:约15分钟🖥️ 环境:CentOS 7/8、Ubuntu 20.04+⚠️ 建议:先在测试机实操,再上生产
──────────────────────────────────────────────────
01|为什么RAID还不够?
上篇我们搞定了RAID阵列,把多块物理盘拧成一股绳。但很快你会发现一个致命问题:
• 分区大小固定,/home 满了,/var 却空着,磁盘利用率极低
• 想扩容?先备份、再卸载、重新分区、格式化、恢复数据——一套下来半天没了
• 业务增长快,今天100G够用,明天需要500G,传统分区让你想砸键盘
• 快照?在线扩容?动态迁移?传统分区统统不支持
这就是LVM(Logical Volume Manager,逻辑卷管理器)存在的意义。
RAID解决的是“磁盘可靠性”问题,LVM解决的是“存储灵活性”问题。二者叠加,才是企业级Linux服务器的标准存储架构。
02|核心概念:LVM的“四层楼”结构
理解LVM,只需要记住四个英文缩写,我把它比喻成一栋四层大楼:
层级 | 概念 | 比喻 |
第1层 | Physical Volume (PV) | 地基 —— 物理磁盘或RAID阵列 |
第2层 | Volume Group (VG) | 楼盘 —— 把多块PV合并成一个资源池 |
第3层 | Logical Volume (LV) | 房间 —— 从VG中划分出来的实际使用空间 |
第4层 | Physical Extent (PE) | 砖块 —— LV的最小分配单元,默认4MB |
📌 一句话总结:
多块物理盘/RAID阵列 → 组成PV → 汇入VG资源池 → 按需切分出LV → 格式化挂载使用
03|环境准备与前置检查
本文假设你已经完成了RAID阵列配置(上篇内容),现在手上有以下“原材料”:
• 系统:CentOS 7.9(其他发行版命令几乎一致)
• 磁盘:/dev/sdb(100GB,单盘演示)或 /dev/md0(RAID阵列,推荐)
• 目标:创建一个可在线扩容的 /data 目录,用于存放业务数据
Step 1:查看现有磁盘和分区
# 查看所有块设备 lsblk # 查看磁盘详细信息 fdisk -l | grep Disk
NAMEMAJ:MIN RMSIZE RO TYPE MOUNTPOINT sda8:0050G0 disk ├─sda18:101G0 part /boot └─sda28:2049G0 part / sdb8:160100G0 disk← 这是我们的目标盘 md09:00200G0 raid10← 或者这是你的RAID阵列
04|实战操作:从0到1搭建LVM
以下每一步都附带命令和输出解读,建议直接复制到终端跟着做。
4.1 创建物理卷(PV)
将物理磁盘或RAID设备标记为LVM可用的物理卷。
# 创建PV(使用整块磁盘) pvcreate /dev/sdb # 或者使用RAID阵列 pvcreate /dev/md0 # 查看PV详情 pvs pvdisplay
PVVGFmtAttrPSizePFree /dev/sdblvm2 ---100.00g 100.00g --- Physical volume --- PV Name/dev/sdb VG NamePV Size100.00 GiB AllocatableNO PE Size0 Total PE0 Free PE0 Allocated PE0
✅ 关键字段解读:
• PSize:物理卷总大小(100G)
• VG Name:为空,说明还没加入卷组
• PE Size:物理扩展单元大小,创建VG后才会分配
4.2 创建卷组(VG)
把PV汇入一个“资源池”,并指定PE大小(默认4MB,生产环境建议保持默认)。
# 创建卷组,命名为 vg_data vgcreate vg_data /dev/sdb # 查看VG vgs vgdisplay
VG#PV#LV #SN AttrVSizeVFree vg_data100 wz--n- 100.00g 100.00g --- Volume group --- VG Namevg_data System IDFormatlvm2 Metadata Areas1 Metadata Sequence No1 VG Accessread/write VG Statusresizable MAX LV0 Cur LV0 Open LV0 Max PV0 Cur PV1 Act PV1 VG Size100.00 GiB PE Size4.00 MiB Total PE25599 Alloc PE / Size0 / 0 FreePE / Size25599 / 100.00 GiB
✅ 关键字段解读:
• VG Size:卷组总容量(100G)
• PE Size:4MB,这是LVM的最小分配单位
• Total PE:25599个PE = 25599 × 4MB ≈ 100G
• Free PE:全部未分配,等待创建LV
4.3 创建逻辑卷(LV)
从VG中“切”出一块空间,作为实际使用的逻辑卷。
# 创建50G的逻辑卷,命名为 lv_data lvcreate -L 50G -n lv_data vg_data # 或者按PE数量创建(更精确) # lvcreate -l 12800 -n lv_data vg_data# 12800×4MB=50G # 查看LV lvs lvdisplay
LVVGAttrLSizePoolOrigin Data%Meta% lv_data vg_data -wi-a----- 50.00g --- Logical volume --- LV Path/dev/vg_data/lv_data LV Namelv_data VG Namevg_data LV UUIDxxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx LV Write Accessread/write LV Creation host, time localhost, 2024-01-15 10:23:45 +0800 LV Statusavailable # open0 LV Size50.00 GiB Current LE12800 Segments1 Allocationinherit Read ahead sectorsauto - currently set to256 Block device253:0
✅ 关键字段解读:
• LV Path:逻辑卷的完整路径,/dev/vg_data/lv_data,这是你最常用的路径
• LV Size:50G,我们分配的大小
• Block device:253:0,这是内核映射的设备号
4.4 格式化文件系统并挂载
# 格式化为ext4(推荐,稳定兼容性好) mkfs.ext4 /dev/vg_data/lv_data # 创建挂载点 mkdir -p /data # 临时挂载 mount /dev/vg_data/lv_data /data # 验证 df -hT | grep data
/dev/mapper/vg_data-lv_data ext450G53M47G1% /data
📌 注意:系统显示的是 /dev/mapper/vg_data-lv_data,这是LVM的dm(device mapper)映射路径,和 /dev/vg_data/lv_data 指向同一个设备,用哪个都行。
4.5 配置开机自动挂载(/etc/fstab)
⚠️ 这一步极其重要!漏了重启后挂载失效,业务直接挂。
# 获取UUID(最稳妥的方式) blkid /dev/vg_data/lv_data # 输出示例: # /dev/vg_data/lv_data: UUID="a1b2c3d4-e5f6-7890-abcd-ef1234567890" TYPE="ext4" # 编辑fstab vim /etc/fstab # 添加一行(用UUID,不要用设备名!): UUID=a1b2c3d4-e5f6-7890-abcd-ef1234567890 /data ext4 defaults 0 0 # 验证配置是否正确(不重启测试) mount -a # 如果没报错,说明配置正确 df -h | grep data
💡 为什么用UUID不用/dev/vg_data/lv_data?
因为设备名可能在某些场景下变化(比如热插拔、多路径存储),UUID是文件系统的唯一标识,永远不会变。
这是生产环境的铁律,记住它。
05|进阶操作:LVM的核心价值所在
LVM的真正威力不在创建,而在“动态调整”。以下三个场景是生产环境最常见的需求。
5.1 在线扩容(LV空间不够了)
场景:/data 已经用了48G/50G,告警了,需要扩容到80G。
传统方案:备份 → 卸载 → 重新分区 → 格式化 → 恢复 → 祈祷别出错。
LVM方案:三条命令,业务不中断。
# Step 1:确认VG还有剩余空间 vgs #VSizeVFree # 100.00g 50.00g← 还有50G可用,够扩 # Step 2:扩展逻辑卷(直接加30G) lvextend -L +30G /dev/vg_data/lv_data # 或者扩展到指定大小 # lvextend -L 80G /dev/vg_data/lv_data # Step 3:扩展文件系统(ext4用resize2fs,xfs用xfs_growfs) resize2fs /dev/vg_data/lv_data # 验证 df -h | grep data # /dev/mapper/vg_data-lv_data80G48G29G63% /data
🎯 全程无需卸载 /data,业务零中断。这就是LVM的价值。
5.2 VG空间不足了怎么办?
如果VG的Free空间也耗尽了,就加一块新盘(或扩容RAID阵列),然后:
# 新加了一块 /dev/sdc pvcreate /dev/sdc # 扩展到现有VG vgextend vg_data /dev/sdc # 查看,VG容量已经变大 vgs # 然后继续扩容LV lvextend -L +100G /dev/vg_data/lv_data resize2fs /dev/vg_data/lv_data
💡 这就是LVM的“弹性”:存储资源像水一样,哪里需要流到哪里。
5.3 快照(Snapshot):给数据拍个“照片”
场景:升级数据库前,先做个快照,升级失败秒级回滚。
# 创建快照(从lv_data创建,命名为lv_data_snap,大小10G) # 注意:快照大小不需要和原LV一样,只要够记录“变化量” lvcreate -L 10G -s -n lv_data_snap /dev/vg_data/lv_data # 查看快照 lvs #lv_datavg_data owi-aos--80.00g #lv_data_snap vg_data swi-a-s--10.00glv_data0.01 # 如果升级失败,恢复快照(注意:会丢失快照后写入的数据) lvconvert --merge /dev/vg_data/lv_data_snap # 恢复后快照会自动删除,LV回到快照时刻的状态
⚠️ 快照不是备份!它只是“时间点的一致性视图”,如果原LV损坏,快照也失效。重要数据还是要用rsync/backup工具做异地备份。
06|故障排查:常见问题速查表
现象 | 原因 | 解决方案 |
pvcreate 报错:Device /dev/sdb not found | 磁盘未识别或已被分区 | 用lsblk确认,若已分区先清除: wipefs -a /dev/sdb |
vgcreate 报错:Physical volume /dev/sdb not usable | 磁盘已有文件系统或RAID签名 | 同样用wipefs -a清除,或加-f强制 |
lvextend 后 df 没变化 | 只扩了LV,没扩文件系统 | ext4执行 resize2fs,xfs执行 xfs_growfs |
mount -a 报错:can't find UUID | fstab里UUID写错了 | 用blkid重新获取UUID,复制粘贴 |
快照100%满了,状态变成INVALID | 快照空间不足,无法记录变化 | 扩容快照:lvextend -L +5G /dev/vg_data/lv_data_snap |
07|完整架构图:从物理盘到业务目录
最后,用一张图帮你建立完整认知:
┌─────────────────────────────────────────────────────────────┐ │业务层(应用视角)│ │/data← 你的业务目录│ ├─────────────────────────────────────────────────────────────┤ │文件系统层│ │ext4 / xfs(mkfs格式化)│ ├─────────────────────────────────────────────────────────────┤ │逻辑卷层(LVM)│ │┌─────────────┐┌─────────────┐┌─────────────┐│ ││lv_data││lv_backup││ lv_data_snap││ ││(50G→80G) ││(20G)││(10G)││ │└─────────────┘└─────────────┘└─────────────┘│ │↑ 从VG中切分,可动态调整大小│ ├─────────────────────────────────────────────────────────────┤ │卷组层(VG)│ │vg_data = 100G + 100G = 200G│ │↑ 资源池,汇总所有PV容量│ ├─────────────────────────────────────────────────────────────┤ │物理卷层(PV)│ │┌─────────────┐┌─────────────┐│ ││/dev/sdb││/dev/sdc││ ││(100G)││(100G)││ │└─────────────┘└─────────────┘│ │↑ 单盘或RAID阵列(如/dev/md0)│ ├─────────────────────────────────────────────────────────────┤ │物理层│ │物理磁盘 / RAID控制器 / 云硬盘│ └─────────────────────────────────────────────────────────────┘
08|总结:记住这7条铁律
1. RAID负责“硬”(磁盘可靠性),LVM负责“软”(存储灵活性),二者不是替代关系,是互补关系。
2. 生产环境一律用UUID挂载/etc/fstab,拒绝设备名。
3. 扩容时先扩LV(lvextend),再扩文件系统(resize2fs/xfs_growfs),两步缺一不可。
4. 快照不是备份,只是“后悔药”,重要数据必须做异地备份。
5. 给VG留余量,不要一次性把所有空间都分给LV,预留20%应对突发扩容。
6. 操作前用 pvs/vgs/lvs 查看现状,操作后再次验证,养成习惯。
7. 所有操作在测试环境跑通后再上生产,这是运维人的底线。
下篇预告:《服务器磁盘性能压测:fio + iostat 保姆级教程》——既然存储架构搭好了,我们来测测它到底能跑多快。
──────────────────────────────────────────────────
如果这篇文章对你有帮助,欢迎点赞、在看、转发三连。 你的支持是我持续输出硬核技术干货的最大动力。