本文系统地分析和讲解 Linux 的逻辑卷管理器 (LVM),并提供一个清晰的实战教程。
目标
本文分为三个核心部分:
- LVM 介绍:解释 LVM 是什么,它的工作原理以及使用它的好处。
- 常用命令总结:提供一个清晰、分类的 LVM 常用命令列表,作为快速参考手册。
- 实战扩容教程:给出一个具体场景——将一块全新的物理硬盘加入到系统中,并用它来扩展一个已有的逻辑卷(LV)的容量。
Part 1: LVM 介绍 (Introduction)
1.1 什么是 LVM?
LVM (Logical Volume Manager) 是 Linux 系统下的一种功能强大的磁盘管理工具。它在传统的物理磁盘和分区之上建立了一个逻辑层,使得管理员可以更加灵活地管理磁盘存储空间。
想象一下传统的磁盘分区就像用水泥墙砌成的房间,一旦建好,想要调整大小就非常困难,需要砸墙重建。而 LVM 就像是用乐高积木搭建的存储池,你可以随时轻松地增加积木(新硬盘)来扩大整个池子,然后从池子里划分出任意大小的空间(逻辑卷)来使用,甚至可以动态调整这些空间的大小,而不会影响里面存放的数据。
1.2 LVM 的核心组件与工作原理
LVM 主要由三个核心概念组成:
它们之间的关系可以这样理解:
+-----------------------------------------------------------------+
| 操作系统层面 (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)进行分类,方便查阅。
2.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 的物理卷。
成功后会显示 “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
这条命令会在线扩展文件系统,将新空间纳入管理。
第五步:最终确认
最后,再次检查文件系统的使用情况,确认扩容已成功。
现在,你应该能看到 /data
目录的总大小已经显著增加,扩容操作圆满完成!