linux 逻辑卷管理(lvm,logical volume manager)是一种灵活的存储管理技术,通过在物理存储设备与文件系统之间增加抽象层,实现对磁盘空间的动态管理(如动态扩容 / 缩容、跨设备合并等)。相比传统分区,lvm 更适合需要灵活调整存储空间的场景(如服务器、动态扩容需求的系统)。
一、lvm 核心原理
1. 核心组件及关系
lvm 通过三层结构实现存储抽象,从底层到上层依次为:
- 物理卷(pv,physical volume)
底层物理存储设备的抽象,可是硬盘分区(如/dev/sdb1
)、整个硬盘(如/dev/sdc
)或 raid 设备。
pv 被划分为多个物理扩展(pe,physical extent),pe 是 lvm 中最小的存储单元(默认大小 4mb,可自定义),所有 pv 的 pe 大小需一致才能加入同一卷组。
- 卷组(vg,volume group)
由一个或多个 pv 组成的 “存储池”,将多个物理设备的空间合并为一个整体。vg 中的 pe 被统一管理,逻辑卷从 vg 中分配 pe。
- 逻辑卷(lv,logical volume)
从 vg 中 “切割” 出的逻辑空间,可直接格式化并挂载使用(类似传统分区)。lv 的大小由分配的 pe 数量决定,且可动态调整(增加 / 减少 pe 数量)。
2. lvm 的核心优势
- +-动态调整空间:lv 可在线扩容或缩容(无需卸载,部分文件系统支持),无需重新分区。
- 跨设备合并:将多个物理磁盘的空间合并为一个 vg,lv 可使用所有设备的空间(如将 3 块 100gb 硬盘合并为 300gb 的 vg,创建 250gb 的 lv)。
- 灵活管理:支持快照(snapshot)、镜像(mirror)等高级功能,便于数据备份和容灾。
二、lvm 配置步骤(基础流程)
需先创建扩展分区和逻辑分区
步骤 1:准备逻辑分区
选择要加入 lvm 的物理设备(如逻辑分区/dev/sda5
、/dev/sda6
,),确保设备未被挂载且无重要数据(操作会清空数据)。
查看可用设备:
lsblk # 列出所有磁盘及分区,确认目标设备(如sdb、sdc)
现在我们有两个500m的磁盘分区,但是需要放下一个7000m的文件,我们英应该怎么做?
步骤 2:创建物理卷(pv)
用pvcreate
命令将物理设备初始化为 pv:
# 将/dev/sda5和/dev/sda6初始化为pv pvcreate /dev/sda5 /dev/sda6 # 验证pv:查看已创建的pv及pe信息 pvs # 简洁显示 pvdisplay /dev/sda5 # 详细显示指定pv的信息(包括pe大小)
步骤 3:创建卷组(vg)
用vgcreate
命令将 pv 加入 vg(自定义 vg 名称,如myvg
):
# 创建名为myvg的vg,包含/dev/sdb和/dev/sdc vgcreate vg0 /dev/sda5 /dev/sda6 # 验证vg:查看vg的总空间、剩余空间等 vgs # 简洁显示 vgdisplay vg0 # 详细显示(total pe、free pe等)
可选:创建 vg 时指定 pe 大小(默认 4mb,最大 65536pe,故默认最大 vg 大小为 4mb×65536=256gb;若需更大 vg,可增大 pe,如-s 16m
):
vgcreate -s 16m myvg /dev/sda5 /dev/sda6 # pe大小设为16mb
步骤 4:创建逻辑卷(lv)
用lvcreate
命令从 vg 中分配空间创建 lv(自定义 lv 名称,如mylv
):
# 方法1:指定大小(如创建100gb的lv) lvcreate -l 100g -n lv0 vg0 # 方法2:指定使用vg的百分比(如使用80%的空闲空间) lvcreate -l 80%free -n lv0 vg0 # 方法3:指定pe数量(如使用1000个pe,每个pe 4mb则为4gb) lvcreate -l 1000 -n lv0 vg0 # 验证lv:查看lv的路径、大小等 lvs # 简洁显示(lv路径通常为/dev/[vg名]/[lv名],如/dev/myvg/mylv) lvdisplay /dev/lv0/vg0 # 详细显示
步骤 5:格式化 lv 并挂载
lv 创建后需格式化(如 ext4、xfs),再挂载使用:
# 格式化lv为ext4(xfs用mkfs.xfs) mkfs.ext4 /dev/lv0/vg0 # 创建挂载点目录 mkdir /lv0 # 临时挂载(重启失效) mount /dev/vg0/lv0 /lv0 # 永久挂载:编辑/etc/fstab,添加一行(用lv的uuid更可靠) # 1. 获取lv的uuid blkid /dev/vg0/lv0 # 输出类似:uuid="xxx" type="ext4" # 2. 编辑fstab echo 'uuid=xxx /lv0 ext4 defaults 0 0' >> /etc/fstab # 3. 验证fstab mount -a # 无报错则配置正确
三、lvm 常用管理操作
1. 扩展逻辑卷(lv 扩容)
当 lv 空间不足时,可从 vg 的空闲空间中分配更多 pe 扩展 lv(需 vg 有足够空闲空间)。
可以向扩展分区扩容然后给物理卷,逻辑组。逻辑卷就可以从逻辑组扩容
假设现在有一个1700m的文件,前面卷组只有1000m 所以不够,还需要扩展vg
- 步骤一:现在增加2000m逻辑分区
- 步骤二:创建物理卷
- 步骤三:扩展卷组
- 步骤四:扩展逻辑卷
# 1. 检查vg剩余空间(确认有足够free pe) vgs vg0 # 2. 扩展lv(如增加2000m) lvextend -l +2000m /dev/vg0/lv0 # 或使用全部剩余空间 lvextend -l +100%free /dev/vg0/lv0 # 3. 扩展文件系统(关键:让文件系统识别新增空间) # 若为ext4/xfs: # ext4用resize2fs(支持在线扩容) resize2fs /dev/vg0/lv0 # xfs用xfs_growfs(需先挂载,指定挂载点) xfs_growfs /mnt/lv0
2. 缩减逻辑卷(lv 缩容)
注意:缩容有数据丢失风险,需先卸载 lv 并检查文件系统完整性(仅 ext4 支持缩容,xfs 不支持!)。
- 现在创建了/vg1 2000m 和lv1 800m
# 1. 卸载lv umount /lv1 # 2. 检查文件系统错误(必须执行) e2fsck -f /dev/vg1/lv1 # 3. 缩减文件系统(先于lv缩容,指定目标大小,如200m) resize2fs /dev/vg1/lv1 200m # 4. 缩减lv(目标大小需≥文件系统大小,如200m) lvreduce -l 200m /dev/vg1/lv1 # 5. 重新挂载 mount -a
1.先卸载
2. 检查是否可以缩容
3.缩容
4.重新挂载
3. 新增物理设备到卷组(vg 扩容)
当 vg 空间不足时,可添加新的 pv 扩展 vg:
# 1. 将新设备(如/dev/sdd)初始化为pv pvcreate /dev/sdd # 2. 将pv加入已有vg(myvg) vgextend vg0 /dev/sdd # 验证:查看vg空间是否增加 vgs myvg
4. 删除 lvm(谨慎操作)
如需删除 lvm,需按 “lv→vg→pv” 的反向顺序操作:
# 1. 卸载lv umount /mnt/mylv # 2. 从fstab中删除挂载配置(避免开机报错) vim /etc/fstab # 删除对应行 # 3. 删除lv lvremove /dev/myvg/mylv # 4. 删除vg vgremove myvg # 5. 删除pv(清空设备的lvm信息) pvremove /dev/sdb /dev/sdc
四、总结
lvm 通过 “pv→vg→lv” 的三层结构,将物理存储抽象为灵活的逻辑空间,核心价值是动态调整和跨设备管理。掌握基础配置(创建 pv/vg/lv)和扩展操作,可满足大多数动态存储需求。实际使用中,需注意文件系统对扩容 / 缩容的支持(如 xfs 不支持缩容),并谨慎操作避免数据丢失。
说明:lvcreat(创建) lvdisplay(查看) lvextent(扩容) lvreduce(缩小)
- xfs的文件系统的逻辑卷,只能扩容不能缩容
- ext4的文件系统可以缩容也可以扩容
逻辑卷的大小必须与逻辑卷所在文件大小一致(逻辑卷扩容后,需要挂载此时逻辑卷的大小发生改变,这个时候f所在的分区也需要扩展文件系统重新识别。)
以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。
发表评论