当前位置:首页>Linux>Linux LVM逻辑卷管理实战:从物理盘到弹性存储的完整指南

Linux LVM逻辑卷管理实战:从物理盘到弹性存储的完整指南

  • 2026-09-10 13:32:24
Linux LVM逻辑卷管理实战:从物理盘到弹性存储的完整指南

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 保姆级教程》——既然存储架构搭好了,我们来测测它到底能跑多快。

──────────────────────────────────────────────────

如果这篇文章对你有帮助,欢迎点赞、在看、转发三连。          你的支持是我持续输出硬核技术干货的最大动力。

最新文章

随机文章