磁盘与存储管理 — 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 必须是标准分区。
相关推荐
IT_陈寒2 小时前
闭包陷阱让我加了两天班,JavaScript你真行
前端·人工智能·后端
易协同低代码3 小时前
通达OA核心类库TD类深度解析
后端
Gopher_HBo3 小时前
Go语言学习笔记(十八)Gin处理Session
后端
谭光志4 小时前
工具塞满上下文窗口怎么办?深度拆解 AI Agent Tool Search 按需加载实现原理
前端·后端·ai编程
她说..4 小时前
Java 默认值设置方式
java·开发语言·后端·springboot
foggyprojects4 小时前
从0开始,一句话启动AI DataAgent
后端·数据分析·ai编程
郡杰4 小时前
一些基础和问题解决
后端
陈随易5 小时前
前端项目部署只要30秒
前端·后端·程序员
YIAN5 小时前
从零手写文件读取 MCP 服务:一文吃透 Model Context Protocol 全链路通信原理
前端·后端·mcp
Imchendiana5 小时前
《狂人日记NO.9》— 前后端一把梭,我的全栈实录
前端·后端