跳转至

LVM 逻辑卷管理

LVM(Logical Volume Manager)是 Linux 的逻辑卷管理工具,可以把多块硬盘组合成一个大"池子",然后灵活分配空间。白话说就是"把硬盘像橡皮泥一样随意拉伸缩放"。

核心知识点

概念说明
PV(Physical Volume)物理卷,实际的硬盘或分区
VG(Volume Group)卷组,由多个 PV 组合成的"大池子"
LV(Logical Volume)逻辑卷,从 VG 中划出来的"虚拟分区"
PE(Physical Extent)物理块,PV 中的最小存储单元(默认 4MB)
LE(Logical Extent)逻辑块,LV 中的最小存储单元,与 PE 一一对应
硬盘/分区 → PV(物理卷) → VG(卷组/大池子) → LV(逻辑卷/虚拟分区) → 挂载使用

安装配置

# Ubuntu/Debian 安装
sudo apt install lvm2  # 安装 LVM 工具包

# CentOS/RHEL 安装
sudo yum install lvm2  # 安装 LVM 工具包

# 确认安装
pvs  # 查看物理卷(如果命令存在就说明装好了)

基本使用

创建 LVM(完整流程)

# 第一步:查看可用硬盘
lsblk  # 列出所有块设备(硬盘、分区)
# 假设有 /dev/sdb 和 /dev/sdc 两块新硬盘

# 第二步:创建物理卷(PV)
sudo pvcreate /dev/sdb  # 把 sdb 初始化为物理卷
sudo pvcreate /dev/sdc  # 把 sdc 初始化为物理卷

# 查看物理卷
sudo pvs  # 简洁显示所有物理卷
sudo pvdisplay  # 详细显示物理卷信息

# 第三步:创建卷组(VG),把多个 PV 合并
sudo vgcreate mydata_vg /dev/sdb /dev/sdc  # 用两块盘创建卷组 mydata_vg

# 查看卷组
sudo vgs  # 简洁显示所有卷组
sudo vgdisplay  # 详细显示卷组信息

# 第四步:创建逻辑卷(LV)
sudo lvcreate -L 100G -n data_lv mydata_vg  # 从卷组中划出 100GB 的逻辑卷
# -L 100G 表示大小 100GB
# -n data_lv 表示逻辑卷名称
# mydata_vg 是从哪个卷组划

# 用百分比方式创建
sudo lvcreate -l 100%FREE -n data_lv mydata_vg  # 用完卷组所有剩余空间

# 查看逻辑卷
sudo lvs  # 简洁显示所有逻辑卷
sudo lvdisplay  # 详细显示逻辑卷信息

# 第五步:格式化逻辑卷
sudo mkfs.ext4 /dev/mydata_vg/data_lv  # 格式化为 ext4 文件系统
# 或者
sudo mkfs.xfs /dev/mydata_vg/data_lv  # 格式化为 xfs 文件系统

# 第六步:挂载使用
sudo mkdir -p /data  # 创建挂载点
sudo mount /dev/mydata_vg/data_lv /data  # 挂载到 /data

# 第七步:设置开机自动挂载
echo '/dev/mydata_vg/data_lv /data ext4 defaults 0 2' | sudo tee -a /etc/fstab
# 写入 fstab 文件,开机自动挂载

高级用法

扩容逻辑卷(最实用的功能)

# 场景:/data 空间不够了,需要扩容

# 方法1:卷组还有剩余空间
sudo lvextend -L +50G /dev/mydata_vg/data_lv  # 增加 50GB
# 或者
sudo lvextend -l +100%FREE /dev/mydata_vg/data_lv  # 用完卷组所有剩余空间

# 扩容后必须扩展文件系统!
sudo resize2fs /dev/mydata_vg/data_lv  # ext4 文件系统扩展
# 或者
sudo xfs_growfs /data  # xfs 文件系统扩展(xfs 只能扩不能缩)

# 一步完成扩容(推荐)
sudo lvextend -L +50G -r /dev/mydata_vg/data_lv  # -r 自动扩展文件系统

# 方法2:卷组空间不够了,先加新硬盘
sudo pvcreate /dev/sdd  # 把新硬盘初始化为 PV
sudo vgextend mydata_vg /dev/sdd  # 把新 PV 加入卷组
sudo lvextend -L +100G -r /dev/mydata_vg/data_lv  # 再扩容逻辑卷

缩容逻辑卷(危险操作,先备份)

# 注意:xfs 文件系统不支持缩容!只有 ext4 可以

# 第一步:卸载
sudo umount /data  # 先卸载

# 第二步:检查文件系统
sudo e2fsck -f /dev/mydata_vg/data_lv  # 强制检查文件系统完整性

# 第三步:缩小文件系统
sudo resize2fs /dev/mydata_vg/data_lv 50G  # 先把文件系统缩到 50G

# 第四步:缩小逻辑卷
sudo lvreduce -L 50G /dev/mydata_vg/data_lv  # 再把逻辑卷缩到 50G

# 第五步:重新挂载
sudo mount /dev/mydata_vg/data_lv /data  # 挂回去

快照(测试利器)

# 创建逻辑卷快照(类似虚拟机快照)
sudo lvcreate -L 10G -s -n data_snap /dev/mydata_vg/data_lv
# -L 10G 快照空间 10GB(只存变化的数据)
# -s 表示创建快照
# -n data_snap 快照名称

# 挂载快照查看内容
sudo mkdir /mnt/snap  # 创建挂载点
sudo mount -o ro /dev/mydata_vg/data_snap /mnt/snap  # 只读挂载

# 恢复快照(回到快照时的状态)
sudo umount /data  # 先卸载原逻辑卷
sudo lvconvert --merge /dev/mydata_vg/data_snap  # 合并快照到原卷
sudo mount /dev/mydata_vg/data_lv /data  # 重新挂载

# 删除快照
sudo lvremove /dev/mydata_vg/data_snap  # 不需要时删掉

迁移数据(从一块盘搬到另一块)

# 把数据从 sdb 迁移到 sdd(在线迁移,不停机)
sudo pvmove /dev/sdb /dev/sdd  # 把 sdb 上的数据搬到 sdd
# 这个过程可能很慢,但不影响使用

# 迁移完成后从卷组中移除旧盘
sudo vgreduce mydata_vg /dev/sdb  # 从卷组中移除 sdb
sudo pvremove /dev/sdb  # 清除 sdb 的 PV 标记

常见报错

问题原因解决
Device /dev/sdb excluded by a filter硬盘有分区表或已被使用wipefs -a /dev/sdb 清除分区表
Insufficient free space卷组剩余空间不够添加新 PV 到卷组
Can't shrink: xfsxfs 不支持缩容只能备份→删除→重建→恢复
LV is in use逻辑卷正在被使用先 umount 再操作
resize2fs: 文件系统已挂载必须先卸载才能缩容ext4 扩容可在线,缩容需卸载
Not found: vg or lv名称写错了lvsvgs 确认正确名称

速查表

# === 物理卷(PV)管理 ===
sudo pvcreate /dev/sdX        # 创建物理卷
sudo pvs                       # 查看物理卷列表
sudo pvdisplay                 # 详细信息
sudo pvremove /dev/sdX         # 删除物理卷

# === 卷组(VG)管理 ===
sudo vgcreate vg名 /dev/sdX /dev/sdY  # 创建卷组
sudo vgs                              # 查看卷组列表
sudo vgdisplay                        # 详细信息
sudo vgextend vg名 /dev/sdZ           # 添加新 PV 到卷组
sudo vgreduce vg名 /dev/sdX           # 从卷组移除 PV

# === 逻辑卷(LV)管理 ===
sudo lvcreate -L 大小 -n lv名 vg名    # 创建逻辑卷
sudo lvs                              # 查看逻辑卷列表
sudo lvdisplay                        # 详细信息
sudo lvextend -L +大小 -r /dev/vg/lv  # 扩容(-r 自动扩文件系统)
sudo lvreduce -L 大小 /dev/vg/lv      # 缩容(危险,先备份)
sudo lvremove /dev/vg/lv              # 删除逻辑卷

# === 快照管理 ===
sudo lvcreate -L 大小 -s -n 快照名 /dev/vg/lv  # 创建快照
sudo lvconvert --merge /dev/vg/快照名           # 恢复快照

# === 数据迁移 ===
sudo pvmove /dev/旧盘 /dev/新盘      # 在线迁移数据

# === 完整创建流程 ===
# pvcreate → vgcreate → lvcreate → mkfs → mount → fstab