Linux LVM (Logical Volume Manager) 的详细讲解,内容涵盖了核心概念、架构、实战操作、高级功能以及常用命令,旨在帮助你全面理解和掌握 LVM。
第一部分:LVM 是什么?为什么需要它?
1. LVM 是什么?
LVM,即逻辑卷管理器 (Logical Volume Manager),是 Linux 系统下一种功能强大的存储管理工具。它并非一个文件系统(如 ext4 或 XFS),而是一个位于物理存储设备(如硬盘、SSD)和文件系统之间的抽象层。
你可以把它想象成一个"存储虚拟化"技术。它让你不再直接与 /dev/sda1
、/dev/sdb1
这样的物理分区打交道,而是将它们组合成一个大的"存储池",然后根据需要从这个池子里"切割"出任意大小的逻辑分区来使用。
2. 为什么需要 LVM?(LVM 的核心优势)
传统的磁盘分区方式非常僵化。一旦分区大小确定,想要调整(特别是扩大)会非常困难,往往需要备份数据、删除分区、重建分区、恢复数据,过程繁琐且风险高。LVM 的出现正是为了解决这些问题。
- 动态调整大小: 这是 LVM 最核心的优势。你可以轻松地在线扩大逻辑卷(LV)的大小,甚至在某些情况下可以缩小它,而无需停机或重新格式化。
- 跨物理磁盘: 一个 LVM 卷组(VG)可以包含多个物理硬盘或分区。这意味着你可以创建一个跨越多个硬盘的巨大逻辑卷,从而突破单个硬盘的容量限制。
- 快照功能 (Snapshots): LVM 允许你对一个逻辑卷创建"即时"快照。这个快照是一个逻辑上独立的、在创建瞬间与原卷内容完全相同的副本。这对于进行无风险的系统升级、测试或进行一致性备份非常有用。
- 精简配置 (Thin Provisioning): 你可以创建一个比实际可用物理空间更大的逻辑卷。系统只在数据被实际写入时才分配物理空间。这对于虚拟化和云环境非常有用,可以有效提高存储利用率。
- 数据迁移: LVM 可以在不中断服务的情况下,将数据从一个物理磁盘迁移到另一个(例如,从旧硬盘迁移到新硬盘)。
第二部分:LVM 的核心架构
要理解 LVM,必须掌握它的三个核心组件,它们构成了 LVM 的层级结构。

-
物理卷 (Physical Volume, PV)
- 定义: LVM 的最底层,是 LVM 的基本存储单元。通常是一个完整的硬盘(如
/dev/sdb
)或一个硬盘分区(如/dev/sdc1
)。 - 作用: 在使用 LVM 之前,你必须先将一个物理设备"初始化"或"标记"为 PV,这样 LVM 才能识别和使用它。
- 命令:
pvcreate
,pvdisplay
,pvs
- 定义: LVM 的最底层,是 LVM 的基本存储单元。通常是一个完整的硬盘(如
-
卷组 (Volume Group, VG)
- 定义: LVM 的中间层,可以看作一个大的"存储池"。一个卷组由一个或多个物理卷组成。
- 作用: 它将底层的多个 PV 整合在一起,向上层提供统一的、连续的存储空间。你可以动态地向 VG 中添加新的 PV 来扩大存储池的总容量。
- 命令:
vgcreate
,vgdisplay
,vgs
,vgextend
-
逻辑卷 (Logical Volume, LV)
- 定义: LVM 的最顶层,这是最终用户可以格式化并使用的"设备"。逻辑卷是从卷组这个大存储池中"划分"或"切割"出来的。
- 作用: 对于操作系统和应用程序来说,一个 LV 看起来就像一个普通的物理分区(例如
/dev/my_vg/my_lv
)。你可以在它上面创建文件系统(如 ext4, XFS),然后挂载使用。 - 命令:
lvcreate
,lvdisplay
,lvs
,lvextend
,lvreduce
一个形象的比喻:
- 物理卷 (PVs) :像是一块块独立的乐高积木。
- 卷组 (VG) :像是你把所有乐高积木都倒进去的一个大盒子,形成了一个积木池。
- 逻辑卷 (LVs) :像是你从这个大盒子里拿出一些积木,拼成你想要的模型(比如一辆车或一座房子)。你可以随时从盒子里拿更多积木来把模型造得更大。
第三部分:LVM 实战:从零创建并管理逻辑卷
假设我们有两块新的空硬盘 /dev/sdb
和 /dev/sdc
,每块 100GB。
步骤 1: 准备物理设备
首先,确认设备存在。
Bash
lsblk
步骤 2: 创建物理卷 (PV)
将这两块硬盘初始化为 LVM 的物理卷。
Bash
shell
sudo pvcreate /dev/sdb /dev/sdc
# 输出会提示 "Physical volume "/dev/sdb" successfully created" 等信息
验证一下:
Bash
bash
sudo pvs
# 或者 sudo pvdisplay
步骤 3: 创建卷组 (VG)
将刚刚创建的两个 PV 添加到一个名为 data_vg
的卷组中。
Bash
bash
sudo vgcreate data_vg /dev/sdb /dev/sdc
# 输出会提示 "Volume group "data_vg" successfully created"
现在我们有了一个总容量约为 200GB 的存储池。
验证一下:
Bash
bash
sudo vgs
# 或者 sudo vgdisplay data_vg
步骤 4: 创建逻辑卷 (LV)
从 data_vg
卷组中创建一个大小为 50GB,名为 web_data_lv
的逻辑卷。
Bash
bash
sudo lvcreate -L 50G -n web_data_lv data_vg
# -L: 指定大小 (G, M, T)
# -n: 指定名称
# 最后一个参数是 VG 的名称
验证一下:
Bash
shell
sudo lvs
# 或者 sudo lvdisplay /dev/data_vg/web_data_lv
现在,系统里多了一个设备:/dev/data_vg/web_data_lv
。
步骤 5: 格式化与挂载
像普通分区一样,格式化这个逻辑卷并挂载它。
Bash
bash
# 格式化为 ext4 文件系统
sudo mkfs.ext4 /dev/data_vg/web_data_lv
# 创建挂载点
sudo mkdir /data/web
# 挂载
sudo mount /dev/data_vg/web_data_lv /data/web
# (可选) 设置开机自动挂载,编辑 /etc/fstab 文件
# 添加一行:
# /dev/data_vg/web_data_lv /data/web ext4 defaults 0 0
现在你就可以在 /data/web
目录下使用这个 50GB 的空间了。
步骤 6: 动态扩容 (LVM 的魅力所在)
假设 50GB 的空间不够用了,我们需要增加 20GB。
第一步:扩展逻辑卷 (LV)
Bash
bash
# 将 web_data_lv 的容量增加 20GB
sudo lvextend -L +20G /dev/data_vg/web_data_lv
# 或者扩展到总共 70GB: sudo lvextend -L 70G ...
第二步:扩展文件系统 (至关重要!)
仅仅扩大 LV 是不够的,文件系统并不知道底层的空间变大了。你必须通知文件系统去使用这部分新增的空间。
-
对于 ext4 文件系统:
Bash
bashsudo resize2fs /dev/data_vg/web_data_lv
-
对于 XFS 文件系统:
Bash
bashsudo xfs_growfs /data/web # 注意,xfs_growfs 使用挂载点
现在,使用 df -h
查看,你会发现 /data/web
的容量已经变成了 70GB。整个过程在线完成,无需卸载。
第四部分:LVM 高级功能简介
1. LVM 快照 (Snapshot)
在对 /data/web
进行重要更新前,创建一个快照以防万一。
Bash
bash
# 创建一个名为 web_backup 的快照,大小为 5GB (快照大小只需能容纳变更的数据即可)
sudo lvcreate -s -L 5G -n web_backup /dev/data_vg/web_data_lv
# -s: 表示创建快照
现在你可以挂载这个快照,它包含了创建瞬间 /data/web
的所有数据。
Bash
bash
sudo mkdir /mnt/backup
sudo mount /dev/data_vg/web_backup /mnt/backup
如果更新搞砸了,你可以用这个快照来恢复数据,或者直接回滚。
2. 精简配置 (Thin Provisioning)
创建一个 1TB 的 Thin Pool,即使你的 VG 总共只有 200GB。
Bash
bash
# 1. 创建一个名为 thin_pool 的 Thin Pool
sudo lvcreate -L 190G -T data_vg/thin_pool
# 2. 从 Thin Pool 中创建一个 500GB 的 Thin LV
sudo lvcreate -V 500G -T data_vg/thin_pool -n thin_lv_1
这个 thin_lv_1
对外声称有 500GB,但它只有在写入数据时才会真正从 thin_pool
中消耗空间。
第五部分:常用命令速查
用途 | PV 相关命令 | VG 相关命令 | LV 相关命令 |
---|---|---|---|
创建 | pvcreate /dev/sdX |
vgcreate <vg_name> /dev/sdX |
lvcreate -L <size> -n <lv_name> <vg_name> |
显示(简) | pvs |
vgs |
lvs |
显示(详) | pvdisplay |
vgdisplay |
lvdisplay |
扩展 | (无,直接加到VG) | vgextend <vg_name> /dev/sdY |
lvextend -L +<size> /dev/vg/lv |
缩减 | pvmove /dev/sdX |
vgreduce <vg_name> /dev/sdX |
lvreduce -L -<size> /dev/vg/lv |
移除 | pvremove /dev/sdX |
vgremove <vg_name> |
lvremove /dev/vg/lv |
扫描 | pvscan |
vgscan |
lvscan |
总结
LVM 是一个非常强大和灵活的存储管理工具,是现代 Linux 服务器和虚拟化环境中的标配。虽然它增加了一个管理层,初看起来比传统分区复杂,但它带来的动态调整、快照等能力,极大地提升了系统运维的灵活性和安全性,是每一个 Linux 系统管理员都应该熟练掌握的技能。