这个坑值得记一笔。机房一台旧文件服务器要下线,系统盘 SMART 里 Reallocated_Sector_Ct 是 8,dd if=/dev/sda of=/dev/sdb 拷到百分之六十就停住不动,ctrl+c 之后目标盘也不完整。
刚开始盯着「目标盘容量比源盘小几十兆,按整盘复制会在末尾报 no space」,折腾了半个多小时,排掉了。
真正麻烦的地方在于,几个原因的现象几乎一样。dd 遇到读错误默认直接退出或长时间重试,整段拷贝卡在一个扇区上;没有设置跳过坏块的参数,读到坏道后反复重试直到驱动超时;源盘还在被挂载读写,拷贝过程中数据持续变化,拷出来的一致性无法保证。
第一件事是看坏块位置和盘的健康状况
smartctl -a /dev/sda | grep -E 'Reallocated|Pending|UNC'
卸载源盘避免边拷边改
umount /dev/sda1 /dev/sda2 2>/dev/null; blockdev --setro /dev/sda
接着用 ddrescue 跳过错块并记录日志
ddrescue -d -r3 /dev/sda /dev/sdb /root/rescue.map
补拷一遍只处理上次失败的区域
ddrescue -d -r3 -A /dev/sda /dev/sdb /root/rescue.map
别只看报错消失,验证要多做一步。ddrescue 结束时 rescued 比例接近百分百、errsize 只剩几十 K,目标盘挂载后文件系统能通过 fsck -n,关键目录文件数一致。
提醒一点。坏道盘上别用 dd 硬扛,重试会把整块盘读挂;拷完要立刻换盘,待映射扇区说明盘已经在用备用区续命,随时可能彻底失效。监控比日志更早给出信号,事后回看经常能提前半小时发现异常。