Linux 使用 LVM 物理卷无损合并双磁盘完整指南
💡 摘要: 本文详细介绍 Linux 环境下使用 LVM(Logical Volume Manager) 物理卷技术,在保留原有磁盘 (sdb) 数据的前提下,将新磁盘 (sdc) 与原有磁盘无损合并并统一挂载到/data 目录的完整方案。包含"先建后迁"安全策略、5 个关键操作注意事项、完整的回滚机制和数据验证流程,以及企业级性能优化建议。通过本文学习,你将掌握生产环境 LVM 磁盘管理的核心技能,实现存储资源的安全整合与弹性扩展。适合系统管理员、DevOps 工程师阅读。
1. 背景与核心需求
1.1 实际场景
# ✅ 当前磁盘状态/dev/sdb 1TB # 已有重要数据,已挂载使用/dev/sdc 4TB # 新磁盘,空盘待用# ❌ 核心需求1. 将 sdb(1TB) + sdc(4TB) 合并为统一的 5TB 存储空间2. 统一挂载到 /data 目录3. **关键要求**: 不能丢失 sdb 上的任何现有数据!4. 使用 LVM 物理卷技术实现灵活管理
1.2 技术挑战
- 数据安全性
- 业务连续性
- 操作风险
- 技术选型
1.3 为什么选择 LVM
| | | | |
|---|
| 数据安全性 | | | | |
| 空间连续性 | | | | |
| 灵活性 | | | | |
| 性能表现 | | | | |
| 可管理性 | | | | |
| 推荐指数 | | | | |
推荐建议:
- ✅ 需要连续空间: LVM 提供真正的连续存储空间
2. 方案原理与架构设计
2.1 "先建后迁"安全策略

2.2 核心优势
- 零数据丢失
- 可回滚
- 业务影响小
- 灵活扩展
3. 完整实施步骤
阶段一:准备工作 (10 分钟)
步骤 1: 检查磁盘状态
# ✅ 查看磁盘列表和分区lsblksudo fdisk -l# 输出示例:# NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT# sdb 8:16 0 1T 0 disk # └─sdb1 8:17 0 1024G 0 part /data ← 已有重要数据# sdc 8:32 0 4T 0 disk ← 新盘,待用# ✅ 确认 sdb 的数据量和挂载情况df -h /datadu -sh /data/*# ✅ 记录原挂载信息sudo blkid /dev/sdb1 > /tmp/sdb_backup.txtmount | grep /data >> /tmp/sdb_backup.txtcat /etc/fstab | grep -v "^#" > /tmp/fstab_backup.txtecho "✓ 原磁盘信息已备份到 /tmp/sdb_backup.txt"
步骤 2: 安装 LVM 工具
# Ubuntu/Debiansudo apt updatesudo apt install -y lvm2 rsync# CentOS/RHELsudo yum install -y lvm2 rsync# ✅ 验证安装pvs --versionvgs --versionlvs --version# 输出示例:# LVM version: 2.03.11(2) (2021-01-08)
阶段二:创建 LVM 基础架构 (15 分钟)
步骤 3: 格式化 sdc 并创建物理卷
# ⚠️ 警告:以下操作会清除 sdc 的所有数据!# 再次确认 sdc 是要格式化的新盘# ✅ 最后确认lsblk /dev/sdcsudo fdisk -l /dev/sdc# ✅ 创建物理卷 (PV)# 注意:这会在 sdc 上创建 LVM 元数据sudo pvcreate /dev/sdc# 输出示例:# Physical volume "/dev/sdc" successfully created.# Wiping xfs file system signature on /dev/sdc.# ✅ 验证物理卷sudo pvssudo pvdisplay /dev/sdc# 输出示例:# PV VG Fmt Attr PSize PFree# /dev/sdc lvm2 --- <4t <4t# # "/dev/sdc" is a new physical volume (PV)# Size: <4 TiB# Free: <4 TiB
步骤 4: 创建卷组和逻辑卷
# ✅ 创建卷组 (VG) - 先只使用 sdc# 注意:暂时不添加 sdb,避免影响原有数据sudo vgcreate vg_data /dev/sdc# ✅ 创建逻辑卷 (LV) - 使用 sdc 的全部空间sudo lvcreate -l 100%FREE -n lv_data vg_data# ✅ 验证 LVM 结构sudo pvssudo vgssudo lvs# 输出示例:# PV VG Fmt Attr PSize PFree# /dev/sdc vg_data lvm2 a-- <4t 0# # VG #PV #LV VSize VFree# vg_data 1 1 <4t 0# # LV VG Attr LSize# lv_data vg_data -wi-a----- <4t
步骤 5: 格式化逻辑卷并临时挂载
# ✅ 格式化为 ext4 (推荐,兼容性好)sudo mkfs.ext4 /dev/vg_data/lv_data# 或格式化为 xfs (适合超大文件)# sudo mkfs.xfs /dev/vg_data/lv_data# ✅ 创建临时挂载点sudo mkdir -p /data_new# ✅ 挂载新的逻辑卷sudo mount /dev/vg_data/lv_data /data_new# ✅ 验证df -h /data_new# 显示约 4TB 容量 (sdc 的大小)# ✅ 设置权限 (与原/data 保持一致)sudo chown -R (id-g) /data_newsudo chmod -R 755 /data_new
阶段三:数据迁移 (关键步骤!)
步骤 6: 同步数据到新卷
# ✅ 第一次全量同步 (业务不中断)# 使用 rsync 保留所有文件属性、权限、时间戳sudo rsync -av --progress /data/ /data_new/# ✅ 参数说明:# -a: 归档模式 (保留所有属性)# -v: 详细输出# --progress: 显示同步进度# ✅ 验证第一次同步结果echo "=== 源数据 ==="du -sh /data/echo "=== 目标数据 ==="du -sh /data_new/# 两者应该基本一致
预计时间:
步骤 7: 增量同步 (减少停机时间)
# ✅ 在业务低峰期执行增量同步# 此时业务仍在运行,会有新数据产生sudo rsync -av --delete --progress /data/ /data_new/# ✅ 参数说明:# --delete: 删除目标端多余的文件 (保持完全一致)# ✅ 重复执行直到没有新变化while true; do CHANGED=CHANGED" [ (diff -rq /data/ /data_new/ | wc -l)echo "差异文件数:DIFF_COUNT-eq0 ]; then echo "✓ 数据完全一致!"else echo "⚠️ 发现 (find /data -type f |shuf|head-1) REL_PATH=REL_PATH" ]; then SRC_MD5=FILE" | cut -d' ' -f1) DST_MD5=REL_PATH" | cut -d' ' -f1) if [ "DST_MD5" ]; then echo "✓ REL_PATH MD5 不匹配!" exit 1 fi else echo "❌ 缺失文件:(date +%Y%m%d).tar.gz# ✅ 记录最终配置cat > /root/lvm_config.txt << EOF=== LVM 最终配置 ===创建时间:(sudo pvs)卷组:(sudo lvs)挂载信息:(find /data -type f |wc-l)DST_COUNT=SRC_COUNT, 目标=SRC_COUNT-ne(du-sb /data |cut-f1)DST_SIZE=SRC_SIZE, 目标=((SRC_SIZE - DST_SIZE)) -gt 1024 ]; then echo "❌ 总大小差异超过 1KB!" exit 1fi# 3. 随机抽样 MD5 验证echo "随机抽样验证 (10 个文件)..."ERROR_COUNT=0for i in {1..10}; do FILE={FILE#/data/} if [ -f "/data_new/(md5sum "(md5sum "/data_new/SRC_MD5"="REL_PATH OK" else echo "❌ REL_PATH" ((ERROR_COUNT++)) fidoneif [ ERROR_COUNT 个文件有问题" exit 1else echo "✓ 数据完整性验证通过!"fi
⚠️ 注意 2: 业务切换窗口管理
#!/bin/bash# switch_window_management.sh# 标准切换流程脚本set -eecho "[通知] 将于 30 分钟后进行存储升级,预计停机 10 分钟"# 1. 预同步 (业务不中断)echo "[预同步] 开始第一次全量同步..."rsync -av /data/ /data_new/# 2. 等待 30 分钟,让业务继续运行...echo "[等待] 30 分钟后执行最终切换..."sleep 1800# 3. 正式切换 (业务中断开始)echo "[切换] 停止服务..."systemctl stop nginx mysql redis# 4. 最终同步echo "[最终同步] 执行增量同步..."rsync -av --delete /data/ /data_new/# 5. 切换挂载echo "[切换挂载] 卸载原目录,挂载新 LVM..."umount /dataumount /data_newmount /dev/vg_data/lv_data /data# 6. 启动服务echo "[启动服务]..."systemctl start nginx mysql redis# 7. 验证echo "[验证] 检查服务状态..."curl http://localhost/health || exit 1# 8. 通知完成echo "[完成] 存储升级完成,业务已恢复"echo "总停机时间:confirm"="yes" ] ||exit1# 1. 停止占用/data 的服务echo "停止服务..."fuser -km /data || true# 2. 卸载新 LVMecho "卸载新 LVM..."umount /data || true# 3. 恢复原挂载点echo "恢复原挂载点..."mount /dev/sdb1 /data# 4. 验证恢复echo "验证恢复..."df -h /datals -la /data/echo "✓ 回滚完成!已恢复到迁移前状态"
📊 监控与告警
实时监控脚本
#!/bin/bash# monitor_lvm_health.shLOG_FILE="/var/log/lvm_monitor.log"ALERT_THRESHOLD=85log() { echo "1"|tee-aline"; done # 检查卷组 log "卷组状态:" sudo vgs | while read line; do log "line"; done # 检查空间使用 USAGE=5}'|tr-d'%') if [ ALERT_THRESHOLD ]; then log "⚠️ 警告:/data 使用率 {USAGE}%" | mail -s "存储告警" admin@example.com else log "✓ /data 使用率 ${USAGE}% 正常" fi log "✓ 检查完成"}# 每小时检查一次while true; do check_lvm_health sleep 3600done &# 添加到 systemd 服务sudo tee /etc/systemd/system/lvm-monitor.service << EOF[Unit]Description=LVM Storage MonitorAfter=network.target[Service]Type=simpleExecStart=/bin/bash /path/to/monitor_lvm_health.shRestart=always[Install]WantedBy=multi-user.targetEOFsudo systemctl daemon-reloadsudo systemctl enable lvm-monitorsudo systemctl start lvm-monitor
📝 总结
本文系统介绍了使用 LVM 物理卷无损合并双磁盘的完整方案,包括5 个关键操作注意事项、完整的数据验证流程和企业级性能优化技巧。关键收获:
- "先建后迁"策略最安全: 先在新盘创建 LVM 并迁移数据,验证正常后再添加原盘,确保零风险
- 数据一致性验证至关重要: 必须通过文件数量、总大小、MD5 抽样三重验证
- 回滚方案必备
- 性能优化不可忽视: 4K 对齐、PE 大小选择、调度器优化可提升 150% 性能
最佳实践建议:
- ✅ 数据安全:宁可慢也要稳,不要为了速度牺牲安全性
- ✅ 文档记录:详细记录每步操作和配置,便于后续维护
👍 如果本文对你有帮助,欢迎点赞、收藏、转发! 💬 有任何问题或建议,请在评论区留言交流~ 🔔 关注我,获取 DevOps 运维系列文章! 📝 行文仓促,定有不足之处,欢迎各位朋友在评论区批评指正,不胜感激!!
附录:快速参考命令
# LVM 基本命令速查# 物理卷管理pvcreate /dev/sdc # 创建物理卷pvdisplay # 显示 PV 信息pvs # 简洁显示 PV# 卷组管理vgcreate vg_data /dev/sdc # 创建卷组vgextend vg_data /dev/sdb # 扩展卷组vgdisplay # 显示 VG 信息vgs # 简洁显示 VG# 逻辑卷管理lvcreate -l 100%FREE -n lv_data vg_data # 创建逻辑卷lvextend -l +100%FREE /dev/vg_data/lv_data # 扩展逻辑卷lvdisplay # 显示 LV 信息lvs # 简洁显示 LV# 文件系统操作mkfs.ext4 /dev/vg_data/lv_data # 格式化resize2fs /dev/vg_data/lv_data # 扩展文件系统mount /dev/vg_data/lv_data /data # 挂载# 数据同步rsync -av --progress /data/ /data_new/ # 同步数据rsync -av --delete /data/ /data_new/ # 增量同步# 验证工具diff -rq /data/ /data_new/ # 对比目录差异md5sum file # 计算文件 MD5find /data -type f | wc -l # 统计文件数量du -sh /data # 查看目录大小