首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >Linux 使用 LVM 物理卷无损合并双磁盘完整指南

Linux 使用 LVM 物理卷无损合并双磁盘完整指南

作者头像
行者全栈架构师
修改2026-05-24 21:23:30
修改2026-05-24 21:23:30
2450
举报

Linux 使用 LVM 物理卷无损合并双磁盘完整指南

💡 摘要: 本文详细介绍 Linux 环境下使用 LVM(Logical Volume Manager) 物理卷技术,在保留原有磁盘 (sdb) 数据的前提下,将新磁盘 (sdc) 与原有磁盘无损合并并统一挂载到/data 目录的完整方案。包含"先建后迁"安全策略、5 个关键操作注意事项、完整的回滚机制和数据验证流程,以及企业级性能优化建议。通过本文学习,你将掌握生产环境 LVM 磁盘管理的核心技能,实现存储资源的安全整合与弹性扩展。适合系统管理员、DevOps 工程师阅读。


1. 背景与核心需求

1.1 实际场景

代码语言:javascript
复制
# ✅ 当前磁盘状态
/dev/sdb   1TB    # 已有重要数据,已挂载使用
/dev/sdc   4TB    # 新磁盘,空盘待用
# ❌ 核心需求
1. 将 sdb(1TB) + sdc(4TB) 合并为统一的 5TB 存储空间
2. 统一挂载到 /data 目录
3. **关键要求**: 不能丢失 sdb 上的任何现有数据!
4. 使用 LVM 物理卷技术实现灵活管理

1.2 技术挑战

  1. 数据安全性: sdb 上有重要数据,绝对不能丢失
  2. 业务连续性: 尽量减少停机时间
  3. 操作风险: 需要可靠的回滚方案
  4. 技术选型: 为什么选择 LVM 而不是其他方案

1.3 为什么选择 LVM

特性

LVM 物理卷

UnionFS

传统分区

胜出者

数据安全性

⭐⭐⭐⭐⭐ 高

⭐⭐⭐⭐ 较高

⭐⭐ 低

🏆 LVM

空间连续性

⭐⭐⭐⭐⭐ 真正连续

⭐⭐⭐ 逻辑连续

❌ 不连续

🏆 LVM

灵活性

⭐⭐⭐⭐⭐ 在线扩容

⭐⭐⭐ 一般

⭐ 差

🏆 LVM

性能表现

⭐⭐⭐⭐⭐ 原生

⭐⭐⭐ 有损耗

⭐⭐⭐⭐ 较好

🏆 LVM

可管理性

⭐⭐⭐⭐⭐ 优秀

⭐⭐⭐ 一般

⭐⭐ 复杂

🏆 LVM

推荐指数

⭐⭐⭐⭐⭐ 首选

⭐⭐⭐ 备选

⭐ 不推荐

🏆 LVM

推荐建议:

  • 生产环境: 优先选择 LVM (最安全可靠)
  • 需要连续空间: LVM 提供真正的连续存储空间
  • 未来扩容: LVM 支持在线添加磁盘

2. 方案原理与架构设计

2.1 "先建后迁"安全策略

2.2 核心优势

  1. 零数据丢失: sdb 数据始终保持完整,直到验证新环境正常
  2. 可回滚: 任何阶段发现问题都可立即回滚
  3. 业务影响小: 大部分准备工作可在业务运行时完成
  4. 灵活扩展: 未来可继续添加新磁盘

3. 完整实施步骤

阶段一:准备工作 (10 分钟)

步骤 1: 检查磁盘状态
代码语言:javascript
复制
# ✅ 查看磁盘列表和分区
lsblk
sudo 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 /data
du -sh /data/*
# ✅ 记录原挂载信息
sudo blkid /dev/sdb1 > /tmp/sdb_backup.txt
mount | grep /data >> /tmp/sdb_backup.txt
cat /etc/fstab | grep -v "^#" > /tmp/fstab_backup.txt
echo "✓ 原磁盘信息已备份到 /tmp/sdb_backup.txt"

步骤 2: 安装 LVM 工具
代码语言:javascript
复制
# Ubuntu/Debian
sudo apt update
sudo apt install -y lvm2 rsync
# CentOS/RHEL
sudo yum install -y lvm2 rsync
# ✅ 验证安装
pvs --version
vgs --version
lvs --version
# 输出示例:
# LVM version: 2.03.11(2) (2021-01-08)

阶段二:创建 LVM 基础架构 (15 分钟)

步骤 3: 格式化 sdc 并创建物理卷
代码语言:javascript
复制
# ⚠️ 警告:以下操作会清除 sdc 的所有数据!
# 再次确认 sdc 是要格式化的新盘
# ✅ 最后确认
lsblk /dev/sdc
sudo 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 pvs
sudo 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: 创建卷组和逻辑卷
代码语言:javascript
复制
# ✅ 创建卷组 (VG) - 先只使用 sdc
# 注意:暂时不添加 sdb,避免影响原有数据
sudo vgcreate vg_data /dev/sdc
# ✅ 创建逻辑卷 (LV) - 使用 sdc 的全部空间
sudo lvcreate -l 100%FREE -n lv_data vg_data
# ✅ 验证 LVM 结构
sudo pvs
sudo vgs
sudo 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: 格式化逻辑卷并临时挂载
代码语言:javascript
复制
# ✅ 格式化为 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_new
sudo chmod -R 755 /data_new

阶段三:数据迁移 (关键步骤!)

步骤 6: 同步数据到新卷
代码语言:javascript
复制
# ✅ 第一次全量同步 (业务不中断)
# 使用 rsync 保留所有文件属性、权限、时间戳
sudo rsync -av --progress /data/ /data_new/
# ✅ 参数说明:
# -a: 归档模式 (保留所有属性)
# -v: 详细输出
# --progress: 显示同步进度
# ✅ 验证第一次同步结果
echo "=== 源数据 ==="
du -sh /data/
echo "=== 目标数据 ==="
du -sh /data_new/
# 两者应该基本一致

预计时间:

  • 100GB 数据约需 30-60 分钟
  • 1TB 数据约需 3-5 小时
  • 取决于磁盘 I/O 速度

步骤 7: 增量同步 (减少停机时间)
代码语言:javascript
复制
# ✅ 在业务低峰期执行增量同步
# 此时业务仍在运行,会有新数据产生
sudo rsync -av --delete --progress /data/ /data_new/
# ✅ 参数说明:
# --delete: 删除目标端多余的文件 (保持完全一致)
# ✅ 重复执行直到没有新变化
while true; do
    CHANGED=CHANGED"
    [ (diff -rq /data/ /data_new/ | wc -l)
echo "差异文件数:DIFF_COUNT -eq 0 ]; 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 1
fi
# 3. 随机抽样 MD5 验证
echo "随机抽样验证 (10 个文件)..."
ERROR_COUNT=0
for 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++))
    fi
done
if [ ERROR_COUNT 个文件有问题"
    exit 1
else
    echo "✓ 数据完整性验证通过!"
fi

⚠️ 注意 2: 业务切换窗口管理

代码语言:javascript
复制
#!/bin/bash
# switch_window_management.sh
# 标准切换流程脚本
set -e
echo "[通知] 将于 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 /data
umount /data_new
mount /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" ] || exit 1
# 1. 停止占用/data 的服务
echo "停止服务..."
fuser -km /data || true
# 2. 卸载新 LVM
echo "卸载新 LVM..."
umount /data || true
# 3. 恢复原挂载点
echo "恢复原挂载点..."
mount /dev/sdb1 /data
# 4. 验证恢复
echo "验证恢复..."
df -h /data
ls -la /data/
echo "✓ 回滚完成!已恢复到迁移前状态"

📊 监控与告警

实时监控脚本

代码语言:javascript
复制
#!/bin/bash
# monitor_lvm_health.sh
LOG_FILE="/var/log/lvm_monitor.log"
ALERT_THRESHOLD=85
log() {
    echo "1" | tee -a line"; 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 3600
done &
# 添加到 systemd 服务
sudo tee /etc/systemd/system/lvm-monitor.service << EOF
[Unit]
Description=LVM Storage Monitor
After=network.target
[Service]
Type=simple
ExecStart=/bin/bash /path/to/monitor_lvm_health.sh
Restart=always
[Install]
WantedBy=multi-user.target
EOF
sudo systemctl daemon-reload
sudo systemctl enable lvm-monitor
sudo systemctl start lvm-monitor

📝 总结

本文系统介绍了使用 LVM 物理卷无损合并双磁盘的完整方案,包括5 个关键操作注意事项完整的数据验证流程企业级性能优化技巧关键收获:

  1. "先建后迁"策略最安全: 先在新盘创建 LVM 并迁移数据,验证正常后再添加原盘,确保零风险
  2. 数据一致性验证至关重要: 必须通过文件数量、总大小、MD5 抽样三重验证
  3. 回滚方案必备: 无论哪种方案,都要准备好回滚脚本和应急预案
  4. 性能优化不可忽视: 4K 对齐、PE 大小选择、调度器优化可提升 150% 性能

最佳实践建议:

  • ✅ 生产环境:严格按照本方案执行,确保每步验证
  • ✅ 测试环境:可适当简化流程,但必须保留回滚方案
  • ✅ 数据安全:宁可慢也要稳,不要为了速度牺牲安全性
  • ✅ 文档记录:详细记录每步操作和配置,便于后续维护

👍 如果本文对你有帮助,欢迎点赞、收藏、转发! 💬 有任何问题或建议,请在评论区留言交流~ 🔔 关注我,获取 DevOps 运维系列文章! 📝 行文仓促,定有不足之处,欢迎各位朋友在评论区批评指正,不胜感激!!


附录:快速参考命令

代码语言:javascript
复制
# 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                   # 计算文件 MD5
find /data -type f | wc -l    # 统计文件数量
du -sh /data                  # 查看目录大小
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2026-04-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 行者架构谈 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Linux 使用 LVM 物理卷无损合并双磁盘完整指南
    • 1. 背景与核心需求
      • 1.1 实际场景
      • 1.2 技术挑战
      • 1.3 为什么选择 LVM
    • 2. 方案原理与架构设计
      • 2.1 "先建后迁"安全策略
      • 2.2 核心优势
    • 3. 完整实施步骤
      • 阶段一:准备工作 (10 分钟)
      • 阶段二:创建 LVM 基础架构 (15 分钟)
      • 阶段三:数据迁移 (关键步骤!)
      • ⚠️ 注意 2: 业务切换窗口管理
    • 📊 监控与告警
      • 实时监控脚本
    • 📝 总结
    • 附录:快速参考命令
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档