
💡 摘要: 本文详细介绍 Linux 环境下使用 LVM(Logical Volume Manager) 物理卷技术,在保留原有磁盘 (sdb) 数据的前提下,将新磁盘 (sdc) 与原有磁盘无损合并并统一挂载到/data 目录的完整方案。包含"先建后迁"安全策略、5 个关键操作注意事项、完整的回滚机制和数据验证流程,以及企业级性能优化建议。通过本文学习,你将掌握生产环境 LVM 磁盘管理的核心技能,实现存储资源的安全整合与弹性扩展。适合系统管理员、DevOps 工程师阅读。
# ✅ 当前磁盘状态
/dev/sdb 1TB # 已有重要数据,已挂载使用
/dev/sdc 4TB # 新磁盘,空盘待用
# ❌ 核心需求
1. 将 sdb(1TB) + sdc(4TB) 合并为统一的 5TB 存储空间
2. 统一挂载到 /data 目录
3. **关键要求**: 不能丢失 sdb 上的任何现有数据!
4. 使用 LVM 物理卷技术实现灵活管理
特性 | LVM 物理卷 | UnionFS | 传统分区 | 胜出者 |
|---|---|---|---|---|
数据安全性 | ⭐⭐⭐⭐⭐ 高 | ⭐⭐⭐⭐ 较高 | ⭐⭐ 低 | 🏆 LVM |
空间连续性 | ⭐⭐⭐⭐⭐ 真正连续 | ⭐⭐⭐ 逻辑连续 | ❌ 不连续 | 🏆 LVM |
灵活性 | ⭐⭐⭐⭐⭐ 在线扩容 | ⭐⭐⭐ 一般 | ⭐ 差 | 🏆 LVM |
性能表现 | ⭐⭐⭐⭐⭐ 原生 | ⭐⭐⭐ 有损耗 | ⭐⭐⭐⭐ 较好 | 🏆 LVM |
可管理性 | ⭐⭐⭐⭐⭐ 优秀 | ⭐⭐⭐ 一般 | ⭐⭐ 复杂 | 🏆 LVM |
推荐指数 | ⭐⭐⭐⭐⭐ 首选 | ⭐⭐⭐ 备选 | ⭐ 不推荐 | 🏆 LVM |
推荐建议:

# ✅ 查看磁盘列表和分区
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"# 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)# ⚠️ 警告:以下操作会清除 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
# ✅ 创建卷组 (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
# ✅ 格式化为 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
# ✅ 第一次全量同步 (业务不中断)
# 使用 rsync 保留所有文件属性、权限、时间戳
sudo rsync -av --progress /data/ /data_new/
# ✅ 参数说明:
# -a: 归档模式 (保留所有属性)
# -v: 详细输出
# --progress: 显示同步进度
# ✅ 验证第一次同步结果
echo "=== 源数据 ==="
du -sh /data/
echo "=== 目标数据 ==="
du -sh /data_new/
# 两者应该基本一致预计时间:
# ✅ 在业务低峰期执行增量同步
# 此时业务仍在运行,会有新数据产生
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#!/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 "✓ 回滚完成!已恢复到迁移前状态"#!/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 个关键操作注意事项、完整的数据验证流程和企业级性能优化技巧。关键收获:
最佳实践建议:
👍 如果本文对你有帮助,欢迎点赞、收藏、转发! 💬 有任何问题或建议,请在评论区留言交流~ 🔔 关注我,获取 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 # 计算文件 MD5
find /data -type f | wc -l # 统计文件数量
du -sh /data # 查看目录大小