使用dd命令克隆磁盘至分区后引发磁盘异常的问题咨询
兄弟,先别气了,咱们来拆解一下你这次操作出的问题,以及为啥会搞成这样:
1. 核心错误:把整个磁盘克隆到了分区上
你用的命令是dd if=/dev/sda of=/dev/sdb1 bs=4K conv=noerror,sync,这里的问题非常关键:
/dev/sda是整个物理磁盘,它包含了磁盘最开头的分区表(MBR/GPT)、所有分区的引导信息以及分区里的所有数据;- 而
/dev/sdb1是/dev/sdb这个磁盘上的一个分区,它只是磁盘上被划分出来的一段连续扇区,本身依赖于sdb的分区表存在。
当你用dd把整个sda的镜像写到sdb1里时,相当于把一个完整的“带分区表的磁盘结构”强行塞进了sdb1这个分区内部。这会让系统的磁盘识别逻辑彻底混乱:一方面sdb本身的分区表还在,另一方面sdb1里又有一套独立的分区表结构,内核处理这种矛盾的磁盘数据时,很容易出现设备异常、无法识别的情况。而且这种写入操作本身就可能覆盖sdb上的关键数据区域,直接破坏原有分区的完整性。
2. Putty超时断开的雪上加霜
Putty超时断开的时候,正在运行的dd进程很可能没有被正常终止,这会导致sdb1的写入操作中断在半路上,磁盘的写入状态完全不一致。Linux内核遇到这种异常的IO操作时,会把对应的磁盘设备标记为错误状态,这就是为啥你当时fdisk、lsusb都识别不到磁盘的原因——内核暂时把这些设备“冻结”了。
重启后内核会重新枚举硬件,所以部分设备能恢复识别,但已经完成的写入操作已经对数据和磁盘结构造成了不可逆的破坏。
3. 关于源盘被擦的小疑问
这里有点奇怪,你的命令里if=/dev/sda是只读读取源盘数据,理论上不会修改sda的内容。可能是重启后系统识别sda时,因为之前的异常IO操作导致文件系统挂载异常,或者你误判了数据状态?不过不管怎样,核心问题还是磁盘到分区的错误克隆操作。
后续正确的操作建议
- 磁盘克隆要对应到整个磁盘:如果想把sda完整复制到sdb,命令应该是
dd if=/dev/sda of=/dev/sdb bs=4K conv=noerror,sync——目标是整个sdb磁盘,不是它下面的分区。这样克隆完成后,sdb会和sda拥有完全一致的分区表和数据。 - 分区克隆要对应到分区:如果只是想复制sda上的某个分区(比如
sda1)到sdb的某个分区(sdb1),那命令应该是dd if=/dev/sda1 of=/dev/sdb1 bs=4K conv=noerror,sync,这才是同类型的克隆操作。 - 避免远程连接中断影响后台任务:以后在Putty里运行长时间的命令(比如dd克隆大磁盘),可以用
screen或者tmux来创建后台会话,这样即使Putty断开,命令还会在服务器上继续运行;也可以在Putty的设置里开启心跳包(Connection -> Seconds between keepalives),防止无操作超时断开。
现在的补救方向
如果新的12TB盘还想救,你可以试试用testdisk这类数据恢复工具,扫描磁盘尝试恢复原来的分区表;或者直接重新分区格式化,把源盘里还能正常读取的数据重新拷贝过去。
备注:内容来源于stack exchange,提问作者qu4ntumrush

