本文系统地分析和讲解 Linux 的逻辑卷管理器 (LVM),并提供一个清晰的实战教程。
目标
本文分为三个核心部分:
- LVM 介绍:解释 LVM 是什么,它的工作原理以及使用它的好处。
- 常用命令总结:提供一个清晰、分类的 LVM 常用命令列表,作为快速参考手册。
- 实战扩容教程:给出一个具体场景——将一块全新的物理硬盘加入到系统中,并用它来扩展一个已有的逻辑卷(LV)的容量。
Part 1: LVM 介绍 (Introduction)
1.1 什么是 LVM?
LVM (Logical Volume Manager) 是 Linux 系统下的一种功能强大的磁盘管理工具。它在传统的物理磁盘和分区之上建立了一个逻辑层,使得管理员可以更加灵活地管理磁盘存储空间。
想象一下传统的磁盘分区就像用水泥墙砌成的房间,一旦建好,想要调整大小就非常困难,需要砸墙重建。而 LVM 就像是用乐高积木搭建的存储池,你可以随时轻松地增加积木(新硬盘)来扩大整个池子,然后从池子里划分出任意大小的空间(逻辑卷)来使用,甚至可以动态调整这些空间的大小,而不会影响里面存放的数据。
1.2 LVM 的核心组件与工作原理
LVM 主要由三个核心概念组成:
-
物理卷 (Physical Volume - PV)
- 是什么:LVM 的基本存储单元,通常是整个硬盘(如
/dev/sdb)或一个标准分区(如/dev/sdb1)。它是 LVM 的原材料。 - 作用:将物理设备转换为 LVM 可识别的格式。
- 是什么:LVM 的基本存储单元,通常是整个硬盘(如
-
卷组 (Volume Group - VG)
- 是什么:一个或多个物理卷组成的存储池。
- 作用:将多个 PV 整合在一起,形成一个统一的、巨大的存储资源池。你可以把 VG 看作是 LVM 的
存储仓库。
-
逻辑卷 (Logical Volume - LV)
- 是什么:从卷组 (VG) 中划分出来的一块逻辑空间,这块空间对于操作系统来说,就像一个普通的分区。
- 作用:我们最终创建文件系统、挂载并使用的就是逻辑卷。你可以根据需要从 VG 中
切割出任意大小的 LV。
它们之间的关系可以这样理解:
+-----------------------------------------------------------------+
| 操作系统层面 (OS Level) |
| |
| +-----------------+ +-----------------+ |
| | 文件系统 (ext4) | | 文件系统 (xfs) | <-- 在 LV 上创建文件系统 |
| | (挂载于 /data) | | (挂载于 /home) | |
| +-------+---------+ +--------+--------+ |
| ^ ^ |
| | | |
| +-------+---------+ +--------+--------+ +----------+ |
| | 逻辑卷 LV 1 | | 逻辑卷 LV 2 | | 空闲空间 | | <-- 从 VG 中划分 LV
| | (/dev/my_vg/data_lv)| | (/dev/my_vg/home_lv)| | | |
| +-----------------------------------------------------------+ |
| 卷组 VG (my_vg) |
+--------------------------------+--------------------------------+
| ^ | |
| | | |
| +-------+---------+ +-----v-----------+ |
| | 物理卷 PV 1 | | 物理卷 PV 2 | <-- 将 PV 加入到 VG 中 |
| | (/dev/sdb1) | | (/dev/sdc) | |
| +-----------------+ +-----------------+ |
| |
| 物理设备层面 (Physical Level) |
+-----------------------------------------------------------------+1.3 为什么使用 LVM?
- 弹性容量:可以轻松地扩大或缩小逻辑卷的大小,无需重新分区。
- 跨盘符存储:可以将多个物理硬盘合并成一个大的卷组,创建一个跨越多个硬盘的逻辑卷。
- 快照功能 (Snapshot):可以对逻辑卷创建即时快照,用于数据备份和恢复,非常方便。
- 在线操作:大部分 LVM 的调整操作(如扩容)都可以在系统运行时在线完成,无需停机。
Part 2: 常用 LVM 命令总结
以下命令按管理对象(PV, VG, LV)进行分类,方便查阅。
# 安装相关命令
sudo apt install lvm22.1 物理卷 (PV) 管理命令
| 命令 | 用途说明 | 示例 |
|---|---|---|
pvcreate |
将一个物理硬盘或分区初始化为物理卷。 | pvcreate /dev/sdb1 |
pvscan |
扫描系统中所有可识别的物理卷。 | pvscan |
pvdisplay |
显示物理卷的详细信息。 | pvdisplay /dev/sdb1 |
pvremove |
移除一个物理卷的 LVM 属性。 | pvremove /dev/sdb1 |
pvs |
以简洁的列表形式显示物理卷信息。 | pvs |
2.2 卷组 (VG) 管理命令
| 命令 | 用途说明 | 示例 |
|---|---|---|
vgcreate |
从一个或多个 PV 创建一个新的卷组。 | vgcreate my_vg /dev/sdb1 /dev/sdc1 |
vgscan |
扫描并列出系统中的所有卷组。 | vgscan |
vgdisplay |
显示卷组的详细信息。 | vgdisplay my_vg |
vgextend |
向现有卷组中添加新的物理卷以扩容。 | vgextend my_vg /dev/sdd1 |
vgreduce |
从卷组中移除一个物理卷。 | vgreduce my_vg /dev/sdd1 |
vgremove |
删除一个卷组。 | vgremove my_vg |
vgs |
以简洁的列表形式显示卷组信息。 | vgs |
2.3 逻辑卷 (LV) 管理命令
| 命令 | 用途说明 | 示例 |
|---|---|---|
lvcreate |
从卷组中创建一个新的逻辑卷。 | lvcreate -L 10G -n data_lv my_vg (创建 10G) |
lvscan |
扫描并列出系统中的所有逻辑卷。 | lvscan |
lvdisplay |
显示逻辑卷的详细信息。 | lvdisplay /dev/my_vg/data_lv |
lvextend |
扩展一个逻辑卷的容量。 | lvextend -l +100%FREE /dev/my_vg/data_lv |
lvreduce |
缩减一个逻辑卷的容量 (危险操作)。 | lvreduce -L -2G /dev/my_vg/data_lv |
lvremove |
删除一个逻辑卷。 | lvremove /dev/my_vg/data_lv |
lvs |
以简洁的列表形式显示逻辑卷信息。 | lvs |
lvrename |
重命名逻辑卷。 | lvrename my_vg old_name new_name |
2.4 文件系统相关命令 (扩容/缩容后必须执行)
| 命令 | 适用文件系统 | 用途 | 示例 |
|---|---|---|---|
resize2fs |
ext2, ext3, ext4 | 调整文件系统大小以匹配逻辑卷。 | resize2fs /dev/my_vg/data_lv |
xfs_growfs |
XFS | 扩展 XFS 文件系统大小(不支持缩容)。 | xfs_growfs /data (注意:这里是挂载点) |
其他
- lv 位于 /dev/vgname/lvname
- device mapper(dm)是 kernel 寻找 storage device 的统一入口,被 LVM、RAID 等使用了。所以/dev/vgname/lvname 仅仅是个 link
Part 3: 实战教程:为现有 LV 添加新磁盘并扩容
本教程将引导你完成一个非常常见的场景:系统 /data 目录空间不足,你添加了一块新的硬盘,并希望用这块新硬盘来扩展 /data 目录的容量。
场景设定
- 现有卷组:
datavg - 现有逻辑卷:
datalv,设备路径为/dev/datavg/datalv - 挂载点:
/data - 文件系统类型:ext4
- 新增物理硬盘:
/dev/sdc(一块全新的、未分区的硬盘) - 目标:将
/dev/sdc的全部空间加入datavg卷组,并扩展datalv,最终使/data目录的可用空间增加。
⚠️ 重要提示:开始任何磁盘操作前,请务必备份重要数据!
操作步骤
准备工作:检查当前状态
在开始之前,先检查一下系统当前的状态,以便操作后进行对比。
# 1. 查看块设备信息,确认新硬盘 /dev/sdc 已被识别
lsblk
# 2. 查看当前文件系统的使用情况,记录 /data 的大小
df -hT
# 3. 查看卷组信息,记录 datavg 的总大小 (VSize) 和剩余空间 (VFree)
vgs
# 4. 查看逻辑卷信息,记录 datalv 的大小 (LSize)
lvs第一步:创建物理卷 (PV)
将新硬盘 /dev/sdc 初始化为 LVM 的物理卷。
sudo pvcreate /dev/sdc成功后会显示 “Physical volume “/dev/sdc” successfully created”。你可以使用 pvs 或 pvdisplay /dev/sdc 来验证。
第二步:将新的 PV 添加到卷组 (VG)
使用 vgextend 命令,将刚刚创建的物理卷 /dev/sdc 添加到现有的 datavg 卷组中。
sudo vgextend datavg /dev/sdc成功后会显示 “Volume group “datavg” successfully extended”。此时再用 vgs 查看,你会发现 datavg 的 VSize 和 VFree 都增加了 /dev/sdc 的容量。
第三步:扩展逻辑卷 (LV)
现在卷组 datavg 有了更多的可用空间,我们可以用这些空间来扩展逻辑卷 datalv。
我们使用 -l +100%FREE 参数,意思是将 datavg 中所有剩余的空闲空间都分配给 datalv。
sudo lvextend -l +100%FREE /dev/datavg/datalv备选方案:如果你只想增加固定大小,比如 200GB,可以使用
-L参数:sudo lvextend -L +200G /dev/datavg/datalv
成功后会显示 “Size of logical volume … changed from … to …"。此时用 lvs 命令查看,可以看到 datalv 的 LSize 已经变大了。
第四步:调整文件系统大小(至关重要!)
这是最容易被遗忘但又最关键的一步! 上一步只是扩大了逻辑卷这个容器的边界,但容器内部的文件系统并不知道空间变大了。我们需要执行一条命令来通知文件系统去使用这些新增的空间。
由于我们的文件系统是 ext4,所以使用 resize2fs 命令。
sudo resize2fs /dev/datavg/datalv如果你的文件系统是 XFS,则应使用 xfs_growfs,并且参数是挂载点:
# 假如是 XFS 文件系统
# sudo xfs_growfs /data这条命令会在线扩展文件系统,将新空间纳入管理。
第五步:最终确认
最后,再次检查文件系统的使用情况,确认扩容已成功。
df -hT现在,你应该能看到 /data 目录的总大小已经显著增加,扩容操作圆满完成!