Linux 磁盘管理从入门到精通:LVM 扩容实战案例

1. LVM 基础概念介绍

LVM(Logical Volume Manager)是 Linux 环境下对磁盘分区进行管理的一种机制,它允许用户将多个物理磁盘或磁盘分区组合成一个逻辑卷组(Volume Group),然后从卷组中划分出多个逻辑卷(Logical Volume),从而更灵活地管理磁盘空间。

1.1 LVM 核心组件

  • 物理卷(PV):物理磁盘或磁盘分区
  • 卷组(VG):一个或多个物理卷的集合
  • 逻辑卷(LV):从卷组中划分出的逻辑存储单元
  • 物理扩展(PE):磁盘空间分配的最小单位
graph TD A[物理磁盘 /dev/sdb] --> B[物理卷 PV] C[物理磁盘 /dev/sdc] --> D[物理卷 PV] B --> E[卷组 VG] D --> E E --> F[逻辑卷 LV] E --> G[逻辑卷 LV] F --> H[文件系统] G --> I[文件系统] style A fill:#2c3e50,stroke:#3498db,stroke-width:2px,color:#ffffff style B fill:#34495e,stroke:#3498db,stroke-width:2px,color:#ffffff style C fill:#2c3e50,stroke:#3498db,stroke-width:2px,color:#ffffff style D fill:#34495e,stroke:#3498db,stroke-width:2px,color:#ffffff style E fill:#16a085,stroke:#1abc9c,stroke-width:2px,color:#ffffff style F fill:#e74c3c,stroke:#c0392b,stroke-width:2px,color:#ffffff style G fill:#e74c3c,stroke:#c0392b,stroke-width:2px,color:#ffffff style H fill:#8e44ad,stroke:#9b59b6,stroke-width:2px,color:#ffffff style I fill:#8e44ad,stroke:#9b59b6,stroke-width:2px,color:#ffffff

2. 环境准备与初始状态检查

2.1 系统环境信息

首先检查当前系统环境,确保我们了解基础配置:

bash 复制代码
# 检查操作系统版本
cat /etc/os-release

# 检查内核版本
uname -r

# 检查当前用户权限(需要 root 权限)
whoami

2.2 检查现有磁盘和分区情况

bash 复制代码
# 查看所有磁盘设备
lsblk

# 使用 fdisk 查看磁盘详情
fdisk -l

# 查看磁盘空间使用情况
df -hT

2.3 检查当前 LVM 状态

bash 复制代码
# 查看物理卷信息
pvs
pvdisplay

# 查看卷组信息
vgs
vgdisplay

# 查看逻辑卷信息
lvs
lvdisplay

3. LVM 扩容实战场景

3.1 场景描述

假设我们有一个服务器,初始配置如下:

  • 已有逻辑卷 /dev/vg_data/lv_data 挂载在 /data
  • 当前逻辑卷大小为 20GB
  • 需要扩容到 50GB
  • 新添加了一块 40GB 的磁盘 /dev/sdb

4. 详细扩容步骤

4.1 步骤一:添加新物理磁盘

首先确认新磁盘已经被系统识别:

bash 复制代码
# 重新扫描 SCSI 总线以识别新磁盘
echo "- - -" > /sys/class/scsi_host/host0/scan
echo "- - -" > /sys/class/scsi_host/host1/scan
echo "- - -" > /sys/class/scsi_host/host2/scan

# 确认新磁盘
lsblk
fdisk -l /dev/sdb

4.2 步骤二:在新磁盘上创建物理卷

bash 复制代码
# 创建物理卷
pvcreate /dev/sdb

# 验证物理卷创建成功
pvs
pvdisplay /dev/sdb

如果磁盘有旧的分区表,可能需要先清理:

bash 复制代码
# 如果有旧分区,需要先删除(谨慎操作!)
parted /dev/sdb mklabel gpt

# 或者使用 fdisk 清理
fdisk /dev/sdb
# 在 fdisk 中依次输入:d (删除分区), w (保存)

4.3 步骤三:扩展卷组

将新的物理卷添加到现有的卷组中:

bash 复制代码
# 首先查看现有卷组名称
vgs

# 扩展卷组(假设卷组名为 vg_data)
vgextend vg_data /dev/sdb

# 验证卷组扩展
vgs
vgdisplay vg_data

4.4 步骤四:扩展逻辑卷

现在扩展逻辑卷的大小:

bash 复制代码
# 查看当前逻辑卷信息
lvs
lvdisplay /dev/vg_data/lv_data

# 扩展逻辑卷(增加 30GB,从 20GB 到 50GB)
lvextend -L +30G /dev/vg_data/lv_data

# 或者扩展到具体大小
lvextend -L 50G /dev/vg_data/lv_data

# 验证逻辑卷扩展
lvs
lvdisplay /dev/vg_data/lv_data

4.5 步骤五:扩展文件系统

根据文件系统类型选择相应的扩展命令:

4.5.1 对于 ext4 文件系统

bash 复制代码
# 检查文件系统类型
df -hT /data

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

# 验证扩展结果
df -hT /data

4.5.2 对于 xfs 文件系统

bash 复制代码
# 检查文件系统类型
df -hT /data

# 扩展 xfs 文件系统
xfs_growfs /data

# 验证扩展结果
df -hT /data

5. 完整流程验证

5.1 验证所有步骤是否成功

bash 复制代码
# 完整的验证脚本
echo "=== 物理卷状态 ==="
pvs

echo "=== 卷组状态 ==="
vgs

echo "=== 逻辑卷状态 ==="
lvs

echo "=== 文件系统状态 ==="
df -hT /data

echo "=== 详细逻辑卷信息 ==="
lvdisplay /dev/vg_data/lv_data

5.2 数据完整性检查

bash 复制代码
# 检查文件系统完整性(对于 ext4)
e2fsck -f /dev/vg_data/lv_data

# 对于生产环境,建议进行读写测试
touch /data/test_file
echo "LVM expansion test" > /data/test_file
cat /data/test_file
rm /data/test_file

6. LVM 扩容完整流程图

flowchart TD A[开始LVM扩容] --> B[检查当前系统状态] B --> C[识别新磁盘/dev/sdb] C --> D{磁盘是否就绪?} D -- 是 --> E[创建物理卷] D -- 否 --> C E --> F[扩展卷组VG] F --> G[扩展逻辑卷LV] G --> H{文件系统类型?} H -- ext4 --> I[使用resize2fs扩展] H -- xfs --> J[使用xfs_growfs扩展] I --> K[验证扩容结果] J --> K K --> L{验证是否成功?} L -- 是 --> M[完成扩容] L -- 否 --> N[排查问题] N --> B style A fill:#27ae60,stroke:#2ecc71,stroke-width:3px,color:#ffffff style M fill:#27ae60,stroke:#2ecc71,stroke-width:3px,color:#ffffff style D fill:#e67e22,stroke:#d35400,stroke-width:2px,color:#ffffff style H fill:#e67e22,stroke:#d35400,stroke-width:2px,color:#ffffff style L fill:#e67e22,stroke:#d35400,stroke-width:2px,color:#ffffff style N fill:#e74c3c,stroke:#c0392b,stroke-width:2px,color:#ffffff

7. 高级 LVM 操作技巧

7.1 在线扩容(无需重启)

LVM 支持在线扩容,无需卸载文件系统或重启系统:

bash 复制代码
# 整个扩容过程都可以在线进行
# 确保在业务低峰期操作
# 监控系统资源使用情况

7.2 精确控制扩展大小

bash 复制代码
# 使用精确单位控制扩展大小
lvextend -L +10G /dev/vg_data/lv_data      # 增加10GB
lvextend -L 30G /dev/vg_data/lv_data       # 扩展到30GB
lvextend -l +100%FREE /dev/vg_data/lv_data # 使用所有剩余空间

7.3 使用 PE 数量进行扩展

bash 复制代码
# 查看PE大小
vgdisplay vg_data | grep "PE Size"

# 基于PE数量扩展(假设PE大小为4MB)
lvextend -l +7680 /dev/vg_data/lv_data  # 增加30GB (30*1024/4=7680)

8. 故障排除与常见问题

8.1 常见问题及解决方案

问题1:物理卷创建失败

bash 复制代码
# 可能原因:磁盘有分区表
# 解决方案:
parted /dev/sdb mklabel gpt
pvcreate /dev/sdb

问题2:卷组空间不足

bash 复制代码
# 检查卷组可用空间
vgdisplay vg_data

# 如果空间不足,添加更多物理卷
vgextend vg_data /dev/sdc

问题3:文件系统扩展失败

bash 复制代码
# 对于ext4,先检查文件系统
e2fsck -f /dev/vg_data/lv_data

# 然后重新尝试扩展
resize2fs /dev/vg_data/lv_data

8.2 安全检查脚本

bash 复制代码
#!/bin/bash
# LVM扩容安全检查脚本

echo "=== LVM扩容前安全检查 ==="
echo "1. 检查备份状态..."
# 检查是否有有效备份

echo "2. 检查磁盘状态..."
lsblk
fdisk -l

echo "3. 检查LVM状态..."
pvs
vgs
lvs

echo "4. 检查文件系统..."
df -hT

echo "5. 检查系统负载..."
uptime
free -h

echo "=== 检查完成 ==="

9. 生产环境最佳实践

9.1 扩容前的准备工作

bash 复制代码
# 1. 业务通知
echo "将在维护窗口进行存储扩容,预计耗时30分钟"

# 2. 数据备份
tar -czf /backup/data_backup_$(date +%Y%m%d).tar.gz /data

# 3. 制定回滚方案
cat << EOF > /root/lvm_rollback_plan.txt
回滚步骤:
1. 如果扩容失败,保持现状
2. 如果数据损坏,从备份恢复
3. 联系:系统管理员
EOF

9.2 监控扩容过程

bash 复制代码
# 实时监控磁盘空间
watch -n 5 'df -h /data; echo "---"; pvs; echo "---"; vgs; echo "---"; lvs'

# 监控系统日志
tail -f /var/log/messages

10. 总结

通过本教程,我们详细学习了LVM扩容的完整流程,从基础概念到实际操作,再到故障排除和最佳实践。关键要点总结:

  1. 规划先行:在操作前充分了解当前环境状态
  2. 步骤清晰:严格按照PV→VG→LV→文件系统的顺序操作
  3. 验证到位:每个步骤后都要验证操作结果
  4. 备份重要:生产环境务必提前备份关键数据
  5. 监控持续:整个过程中持续监控系统状态

LVM 提供了强大的磁盘管理能力,熟练掌握 LVM 扩容技术对于 Linux 系统管理员至关重要。建议在测试环境中多次练习后再在生产环境操作。

graph LR A[物理磁盘] --> B[物理卷PV] B --> C[卷组VG] C --> D[逻辑卷LV] D --> E[文件系统] E --> F[应用程序] style A fill:#2c3e50,stroke:#3498db,stroke-width:2px,color:#ffffff style B fill:#34495e,stroke:#3498db,stroke-width:2px,color:#ffffff style C fill:#16a085,stroke:#1abc9c,stroke-width:2px,color:#ffffff style D fill:#e74c3c,stroke:#c0392b,stroke-width:2px,color:#ffffff style E fill:#8e44ad,stroke:#9b59b6,stroke-width:2px,color:#ffffff style F fill:#27ae60,stroke:#2ecc71,stroke-width:2px,color:#ffffff

希望本教程能够帮助您顺利完成 LVM 扩容操作!如有任何问题,请参考相关文档或在技术社区寻求帮助。

相关推荐
maosheng11465 小时前
RHCSA的第一次作业
linux·运维·服务器
wifi chicken5 小时前
Linux 端口扫描及拓展
linux·端口扫描·网络攻击
旺仔.2916 小时前
Linux 信号详解
linux·运维·网络
放飞梦想C6 小时前
CPU Cache
linux·cache
Hoshino.416 小时前
基于Linux中的数据库操作——下载与安装(1)
linux·运维·数据库
播播资源8 小时前
CentOS系统 + 宝塔面板 部署 OpenClaw源码开发版完整教程
linux·运维·centos
源远流长jerry8 小时前
在 Ubuntu 22.04 上配置 Soft-RoCE 并运行 RDMA 测试程序
linux·服务器·网络·tcp/ip·ubuntu·架构·ip
lay_liu9 小时前
Linux安装redis
linux·运维·redis
寂柒10 小时前
序列化与反序列化
linux·网络
lay_liu10 小时前
ubuntu 安装 Redis
linux·redis·ubuntu