磁盘与存储管理 — LVM 逻辑卷实战

📖 知识点简介

运维日常中,"磁盘满了"是最常见的报警之一。面对分区空间不足、扩容困难的问题,LVM(Logical Volume Manager,逻辑卷管理器) 提供了灵活的解决方案------它打破了传统分区"固定大小"的限制,支持在线扩容、缩容、快照和跨磁盘聚合。掌握 LVM 是现代 Linux 运维的必修课。

🛠 核心命令整理

1. 物理卷(PV)管理

命令 说明
pvcreate /dev/sdb1 将分区初始化为物理卷
pvs 简要查看所有物理卷
pvdisplay 查看物理卷详细信息
pvremove /dev/sdb1 移除物理卷(清空 LVM 元数据)

2. 卷组(VG)管理

命令 说明
vgcreate vg_data /dev/sdb1 /dev/sdc1 创建卷组,可包含多个 PV
vgs 简要查看所有卷组
vgdisplay vg_data 查看卷组详情(PE 大小、总量、剩余空间)
vgextend vg_data /dev/sdd1 向卷组添加新物理卷(扩容!)
vgreduce vg_data /dev/sdb1 从卷组移除物理卷

3. 逻辑卷(LV)管理

命令 说明
lvcreate -L 100G -n lv_data vg_data 创建 100GB 逻辑卷
lvcreate -l 100%FREE -n lv_data vg_data 用全部剩余空间创建
lvs 简要列出所有逻辑卷
lvdisplay vg_data/lv_data 查看逻辑卷详情
lvextend -L +50G /dev/vg_data/lv_data 在线扩容 50GB(不用卸载!)
lvextend -l +100%FREE /dev/vg_data/lv_data 用尽 VG 所有剩余空间
lvreduce -L 50G /dev/vg_data/lv_data 缩容(⚠️ 需先缩文件系统)
lvremove /dev/vg_data/lv_data 删除逻辑卷

4. 文件系统感知(重要!)

bash 复制代码
# 扩容后必须同步文件系统!

# ext4 文件系统
resize2fs /dev/vg_data/lv_data

# xfs 文件系统
xfs_growfs /dev/vg_data/lv_data

# 也可以一步到位(内核 3.6+ 支持)
lvextend -L +50G /dev/vg_data/lv_data --resizefs

📝 实操示例

示例 1:从零搭建 LVM 存储

bash 复制代码
# 查看可用磁盘
lsblk | grep -E "sd[b-z]|nvme[0-9]n[0-9]"
# 输出: sdb      8:16   0  500G  0 disk
#       sdc      8:32   0  500G  0 disk

# 创建分区并标记为 LVM(使用 parted 或 fdisk)
parted /dev/sdb mklabel gpt
parted /dev/sdb mkpart primary 0% 100%
parted /dev/sdb set 1 lvm on
# 同样操作 /dev/sdc

# 1. 创建 PV
pvcreate /dev/sdb1 /dev/sdc1

# 2. 创建 VG(将两块 500G 盘聚合为 1T 池)
vgcreate vg_data /dev/sdb1 /dev/sdc1

# 3. 创建 LV
lvcreate -L 800G -n lv_app vg_data
lvcreate -L 150G -n lv_log vg_data

# 4. 格式化并挂载
mkfs.ext4 /dev/vg_data/lv_app
mkfs.ext4 /dev/vg_data/lv_log
mkdir /data /logs
mount /dev/vg_data/lv_app /data
mount /dev/vg_data/lv_log /logs

# 5. 写入 fstab 开机自动挂载
echo "/dev/vg_data/lv_app  /data  ext4  defaults  0  2" >> /etc/fstab
echo "/dev/vg_data/lv_log  /logs  ext4  defaults  0  2" >> /etc/fstab

示例 2:磁盘快满了?在线扩容!

bash 复制代码
# 场景:/data 目录告警,使用率已达 92%

# 第一步:查看剩余空间
vgs vg_data
# 输出: VG #PV #LV #SN Attr   VSize  VFree
#           vg_data   2   2   0 wz--n- 1000G  50G

# 剩余 50G,但不够?加一块新盘
pvcreate /dev/sdd1
vgextend vg_data /dev/sdd1   # 再追加 500G

# 第二步:扩容 LV + 同步文件系统(一步到位)
lvextend -L +200G /dev/vg_data/lv_app --resizefs

# 第三步:验证
df -h /data
# /dev/mapper/vg_data-lv_app  1000G  740G  260G  74%  /data
# ✅ 在线扩容成功,无需重启、无需卸载!

示例 3:LVM 快照做临时备份

bash 复制代码
# 给正在运行的数据库 LV 打快照(只读,做备份前一致性检查)
lvcreate -L 10G -s -n lv_db_snap /dev/vg_data/lv_db

# 挂载快照检查数据一致性
mkdir /snap_mount
mount /dev/vg_data/lv_db_snap /snap_mount

# 检查完成后清理
umount /snap_mount
lvremove /dev/vg_data/lv_db_snap

⚠️ 常见坑点/注意事项

  1. XFS 不支持缩容! RedHat/CentOS 7+ 默认用 XFS,一旦扩容就不能缩。需要缩容只能用 ext4,且必须按顺序:先缩文件系统 → 再缩 LV。
  2. lvextend 后一定要 resize2fs / xfs_growfs ,否则内核仍然认旧大小,df -h 看不到变化。
  3. PV 去除前必须确认 LV 不在其上pvmove /dev/sdb1 将数据迁移到同 VG 的其他 PV 上,再 vgreduce vg_data /dev/sdb1 才能安全移除。
  4. 快照卷会随着源卷变化而增长:源卷写入越多,快照占用越大。快照满了会自动失效(变成"invalid"),定期清理。
  5. PE 大小影响容量上限:默认 PE=4MiB,单 LV 最大 4PB,一般够用。超大规模存储可酌情调整。
  6. /boot 不能放 LVM 上:GRUB(Legacy)不支持 LVM 分区。/boot 必须是标准分区。
相关推荐
牛奔4 小时前
Go 如何打印调试深层或嵌套的结构体
开发语言·后端·golang
红烧大青虫4 小时前
HarmonyOS应用开发实战:小事记 - 数据迁移策略:RDB 表结构变更的版本号管理与 onUpgrade 回调
后端·华为·harmonyos·鸿蒙系统
geovindu5 小时前
go: Iterative Algorithms
开发语言·后端·算法·golang·迭代算法
阳光是sunny6 小时前
LangGraph实战教程:defer延迟节点——让收尾工作自动排到最后
前端·人工智能·后端
前端工作日常6 小时前
我学习到的Java中domain和dto区别
java·后端
kite01216 小时前
Go语言Map深度解析与最佳实践
开发语言·后端·golang
阳光是sunny6 小时前
LangGraph实战教程:控制流详解
前端·人工智能·后端
hold?fish:palm7 小时前
kv存储主从复制的设计与实现
c++·redis·后端
swipe8 小时前
07|(前端转后全栈)为什么后端也要缓存?从前端缓存思维理解 Redis
前端·后端·全栈
952368 小时前
Docker - 基础
运维·后端·docker·容器