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 扩容操作!如有任何问题,请参考相关文档或在技术社区寻求帮助。

相关推荐
liu****2 小时前
12.线程(二)
linux·开发语言·c++·1024程序员节
咯哦哦哦哦2 小时前
vscode arm交叉编译 中 cmakeTools 编译器设置
linux·arm开发·vscode·编辑器
工具人55553 小时前
Linux 抓取 RAM Dump 完整指南
linux·运维·安全
不懂音乐的欣赏者3 小时前
Windows 下 ROS/ROS2 开发环境最优解:WSL 比直接安装、虚拟机、双系统更优雅!
linux·windows·ubuntu·ros·wsl·ros2·双系统
小狗爱吃黄桃罐头5 小时前
正点原子【第四期】Linux之驱动开发学习笔记-10.1 Linux 内核定时器实验
linux·驱动开发·学习
Kang强6 小时前
tcpdump 抓到 icmp 包,但是抓不到 tcp 包??
linux
demodashi6666 小时前
Linux下ag搜索命令详解
linux·运维·windows
無识6 小时前
Linux-第四章web服务
linux·运维·服务器
一叶知秋yyds6 小时前
Centos 安装 Docker教程
linux·docker·centos