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: xfs | xfs 不支持缩容 | 只能备份→删除→重建→恢复 |
LV is in use | 逻辑卷正在被使用 | 先 umount 再操作 |
resize2fs: 文件系统已挂载 | 必须先卸载才能缩容 | ext4 扩容可在线,缩容需卸载 |
Not found: vg or lv | 名称写错了 | lvs 或 vgs 确认正确名称 |
速查表
# === 物理卷(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