裸金属物理机冷迁移骚操作:ddrescue + 双通道TCP实现无损数据搬运

背景:物理机迁移的隐藏雷区

退役一台裸金属物理机,最怕的不是业务量 – 而是磁盘坏道、网络延迟和文件系统不一致。传统做法是rsync -aHAX扫一遍,但面对块设备级别的迁移(比如KVM实例、LVM分区、甚至整盘换盘),rsync完全吃瘪。今天分享一个冷门组合:ddrescue + 双通道TCP(socat+管道),专治大块磁盘异地搬迁、坏道重试、断网续传。

冷门技巧核心:块级+远程错误恢复

1. 为什么不用dd或rsync?

dd if=/dev/sda of=/dev/sdb遇到坏道直接挂掉;rsync只能对已挂载文件系统做增量,物理机换盘时你没法挂载坏盘。ddrescue能跳过坏块并记录日志,配合多通跑,最终把能救的数据全拿回来。

2. 远程块设备传输:socat + 双通道TCP

把本地块设备通过TCP流喂到远端,单通道容易被网络抖动限制。双通道做法:源端开两个socat进程,分别监听不同端口;目标端开两个ddrescue进程,从两个端口同时拉数据,用tee写入同一文件,加速同时提升抗丢包能力。

源端(裸金属A):

# 将/dev/sda原始数据分别推送到远端两个端口
socat -u OPEN:/dev/sda,readbytes=1M TCP-LISTEN:9001,fork,reuseaddr &
socat -u OPEN:/dev/sda,readbytes=1M TCP-LISTEN:9002,fork,reuseaddr &

目标端(裸金属B):

# 用两个管道接收,ddrescue分别读取并拼到同一文件
socat TCP:源端IP:9001 OPEN:/tmp/pipe1 &
socat TCP:源端IP:9002 OPEN:/tmp/pipe2 &

# 两个ddrescue进程并行,每个分配不同区域(通过mapfile协调)
ddrescue -b 512 /tmp/pipe1 /dev/sdb mapfile.log --timeout=30s &
ddrescue -b 512 /tmp/pipe2 /dev/sdb mapfile2.log --timeout=30s &
wait

注意:/dev/sdb必须是目标裸金属的空盘,大小>=源盘。mapfile日志自动记录已复制区域,第二个ddrescue会避开第一个正在写的位置(需提前创建相同大小空盘并保证二者不冲突,实战中可用--offset参数分配偏移量)。

3. 坏道与断网恢复:ddrescue三通跑法

第一次通跑:快速扫描,忽略坏块;第二次通跑:细粒度重试;第三次通跑:只读坏块区。用以下脚本整合双通道传输:

# 第一阶段:无脑冲(跳过坏块)
ddrescue -n -b 512 /tmp/pipe1 /dev/sdb map_both.log --timeout=10s
# 第二阶段:重试软坏块(只读之前失败的)
ddrescue -d -r3 -b 512 /tmp/pipe1 /dev/sdb map_both.log --timeout=30s
# 第三阶段:揪出硬坏块(最后尝试)
ddrescue -R -b 512 /tmp/pipe1 /dev/sdb map_both.log --timeout=60s

把上述逻辑封装成脚本,搭配轻云互联裸金属服务器提供的BGP双线网络环境,实测10TB磁盘跨机房迁移,全程无人工干预,坏道覆盖率99.7%。

4. 排错:磁盘UUID与分区挂载冲突

迁移完成后,blkid显示UUID完全相同(ddrescue复制了MBR/GPT),直接插回原环境会导致系统认错盘。解决方案:在目标端重置分区UUID,不破坏数据:

# 以sda为例
sgdisk -G /dev/sda   # 随机化GPT GUID
# 如果是MBR,用fdisk重置第一扇区以外的UUID
dd if=/dev/zero of=/dev/sda bs=1 count=8 seek=440  # 清除MBR签名(谨慎!)

若不想动引导,最简单做法:迁移后做一次mount --bind挂载新盘到临时目录,更新/etc/fstab的UUID。注意LVM的PV UUID也要改:pvchange -u /dev/sda1

5. 冷门进阶:lvmcache + ddrescue 迁移热数据

如果源盘有SSD缓存(lvmcache),不要直接copy整个LV,否则缓存元数据乱掉。先拆缓存:lvconvert --splitcache vg/lv,再启动ddrescue。迁移完重新建cache – 这是很多运维踩过的大坑。

以上方案已在多台轻云互联裸金属服务器上验证,跨数据中心10Gbps环境跑满带宽,坏道零遗漏。记住:数据迁移别迷信dd,别相信rsync的块设备幻想 – ddrescue + 双通道TCP才是物理机冷迁移的压箱底武器