LVM 逻辑卷管理¶
本文你会学到:
- LVM 的核心组件(PV、VG、LV、PE)及其层次关系
- 从零开始创建 LVM 的完整流程
- 在线扩容 LV 与文件系统的方法
- 利用快照(Snapshot)备份和恢复数据
- 精简配置(Thin Provisioning)的原理与用法
- 删除 LVM 的正确顺序
为什么需要 LVM¶
当初规划服务器时,把 /home 分了 50 GB,用着用着用户越来越多,分区撑满了。你只能新加硬盘、重新分区、格式化,然后把数据完整地复制过去,再重新挂载——费时费力。等下次又给多了,一大块空间白白浪费,想缩小又得再来一遍。
有没有一种方法,可以**在系统运行时**自由地调整分区大小,而不影响任何数据?
有,这就是 LVM(Logical Volume Manager,逻辑卷管理器)。
LVM 在物理磁盘和文件系统之间加了一层抽象。它的核心价值不是性能,而是**弹性**——可以随时在线扩大或缩小文件系统容量,跨多块物理磁盘整合存储空间,还能创建快照用于备份。
核心概念¶
LVM 的四个组件¶
graph TD
PV1["PV\n/dev/sdb1"] --> VG
PV2["PV\n/dev/sdc1"] --> VG
VG["VG vg_data\n(存储池)"] --> LV1["LV lv_home\n10 GB"]
VG --> LV2["LV lv_data\n20 GB"]
LV1 --> FS1["xfs 文件系统\n挂载到 /home"]
LV2 --> FS2["xfs 文件系统\n挂载到 /data"]
classDef pv fill:transparent,stroke:#f57c00,color:#adbac7,stroke-width:2px
classDef vg fill:transparent,stroke:#0288d1,color:#adbac7,stroke-width:2px
classDef lv fill:transparent,stroke:#388e3c,color:#adbac7,stroke-width:2px
classDef fs fill:transparent,stroke:#768390,color:#adbac7,stroke-width:1px
class PV1,PV2 pv
class VG vg
class LV1,LV2 lv
class FS1,FS2 fs
PV(Physical Volume,物理卷):将物理磁盘或分区通过 pvcreate 初始化,使其成为 LVM 可以管理的底层单元。GPT 分区类型代码建议设为 8e00(Linux LVM)。
VG(Volume Group,卷组):由一个或多个 PV 组成的存储池,是 LVM 的"大磁盘"。可以随时向 VG 中添加新 PV 来扩容。
LV(Logical Volume,逻辑卷):从 VG 中划出的逻辑块设备,路径为 /dev/VG名/LV名,像普通磁盘分区一样格式化和挂载。
PE(Physical Extent,物理区块):VG 的最小分配单元,默认 4 MB(vgcreate -s 可自定义)。LV 的大小必须是 PE 的整数倍,LV 的大小实际上就是它所占用的 PE 总数乘以 PE 大小。对应的 LE(Logical Extent)是 LV 视角下的叫法,大小与 PE 相同。
LVM 的核心优势¶
- 🔧 在线扩展:无需卸载文件系统,直接扩大 LV 并同步扩展文件系统
- 📸 快照(Snapshot):瞬间创建一个"时间点副本",用于备份或测试
- 📦 跨磁盘整合:多块物理磁盘统一进入同一个 VG,像一块大磁盘一样使用
- 💡 精简配置(Thin Provisioning):分配超过实际物理空间的逻辑容量,按实际写入占用
创建 LVM¶
整个流程按照 PV → VG → LV → 文件系统的顺序依次进行。
准备物理卷(PV)¶
分区类型代码
使用 gdisk 时,建议将用于 LVM 的分区类型代码改为 8e00(Linux LVM)。虽然不改也能工作,但这样管理员一眼就能看出该分区的用途,且部分自动侦测工具依赖此标识。
创建卷组(VG)¶
PE 大小的影响
PE 越大,VG 能表示的最大容量越大,但分配的最小粒度也越粗。在 64 位系统上(lvm2 格式),默认 4 MB PE 已经够用,无需调整。
创建逻辑卷(LV)¶
格式化并挂载¶
永久挂载写入 /etc/fstab,建议用 UUID(不受设备名变化影响):
| /etc/fstab 示例 | |
|---|---|
LV 扩容¶
LVM 最常用的功能就是在线扩容,无需停机。
ext4 扩容¶
XFS 扩容¶
XFS 扩容**必须在挂载状态下**进行(xfs_growfs 作用于挂载点,不是设备):
XFS 不支持缩容
XFS 文件系统**只能扩大,不能缩小**。如果你的 LV 需要缩容,请使用 ext4 文件系统。如果已经是 XFS,只能用快照+备份的方式迁移数据到新 LV。
VG 扩容(添加新磁盘)¶
当 VG 的剩余空间不足以继续扩大 LV 时,需要先向 VG 添加新的 PV:
之后再按正常流程扩大 LV 即可。
LV 缩容(仅限 ext4)¶
高风险操作
缩容前必须先卸载文件系统,且必须先缩文件系统再缩 LV,顺序**绝对不能颠倒**!如果先缩 LV,文件系统末尾的数据会丢失,导致文件系统损坏。操作前务必备份数据。
LVM 快照¶
快照的工作原理¶
快照创建时,LVM 在同一个 VG 内划出一块空间作为"变化日志区"。初始状态下快照与原 LV 共享所有数据(不复制)。之后每当原 LV 的某块数据被修改,**旧数据**会先被移入快照区保存,新数据写入原 LV。
graph LR
A["原始 LV\n(当前状态)"] -->|"数据变更前\n旧数据迁入"| B["快照区\n(记录变化)"]
A -->|"新数据写入"| A
B -->|"挂载快照"| C["只读视图\n(快照时间点)"]
classDef lv fill:transparent,stroke:#0288d1,color:#adbac7,stroke-width:2px
classDef snap fill:transparent,stroke:#f57c00,color:#adbac7,stroke-width:2px
classDef view fill:transparent,stroke:#388e3c,color:#adbac7,stroke-width:1px
class A lv
class B snap
class C view
这意味着快照极其节省空间:没有发生变化的数据不占用快照区,只有被修改过的数据块才会占用。
创建与使用快照¶
挂载快照查看数据(XFS 需加 nouuid,因快照与原 LV 的 UUID 相同):
利用快照备份¶
快照挂载后,可以对其进行完整备份,此时原 LV 仍正常运行,互不影响:
删除快照¶
快照区空间满了会失效
如果原 LV 数据变化量超过了快照区的容量,快照会自动失效(lvdisplay 中 Allocated to snapshot 达到 100%)。创建快照时应根据预期变化量分配足够大的快照区。
精简配置(Thin Provisioning)¶
什么是精简配置¶
传统 LV 在创建时就固定占用 VG 的空间。如果你想给 3 个测试环境各分 10 GB,但实际 VG 只剩 15 GB,就没法创建。
精简配置解决这个问题:先创建一个**精简池(Thin Pool),再从池中创建**精简卷。精简卷在创建时只是"宣告"一个大小,实际存储空间按写入量动态分配。
精简配置的风险
精简池一旦实际写入量超过其物理容量,整个 thin pool 会崩溃,所有精简卷的数据都会损坏。使用精简配置时**必须**监控 thin pool 的实际使用率(lvs 中的 Data% 列),并在接近满额之前扩容或清理。
删除 LVM¶
删除顺序**严格从上到下**:先 LV,再 VG,最后 PV。
常用命令速查¶
| 操作 | PV 命令 | VG 命令 | LV 命令 |
|---|---|---|---|
| 创建 | pvcreate |
vgcreate |
lvcreate |
| 搜索 | pvscan |
vgscan |
lvscan |
| 详细查看 | pvdisplay |
vgdisplay |
lvdisplay |
| 简洁查看 | pvs |
vgs |
lvs |
| 扩展 | — | vgextend |
lvextend / lvresize |
| 缩减 | — | vgreduce |
lvreduce / lvresize |
| 删除 | pvremove |
vgremove |
lvremove |
发行版差异¶
默认**不安装** lvm2,需要手动安装:
安装后 lvm2 服务会自动扫描并激活已有 LVM 卷。配置文件位于 /etc/lvm/lvm.conf。
Ubuntu 安装器(Ubiquity / Subiquity)在"高级分区"选项中支持创建 LVM 布局,但默认不启用。
lvm2 默认已安装,无需额外操作。
RHEL 8+ 的 Anaconda 安装器在选择自动分区时会默认使用 LVM 布局(ESP + /boot 使用标准分区,/、/home、swap 等划入 LVM)。
LVM 卷通过 systemd-udev 在启动时自动激活。也可以手动激活: