恢复整个磁盘的 DD

恢复整个磁盘的 DD

我正在使用旧的随机数据覆盖我的硬盘驱动器dd

dd if=/dev/urandom of=/dev/disk/by-uuid/etc bs=512

这是一个 2TB 阵列,而我的 MacBook(运行 Linux,好吗?)只能以 3.7MB/s 左右的速度写入数据,这非常可悲,因为我看到我家里的台式机的写入速度为 20MB/s。今晚回家的时候,我想把dd这里的跑步停下来,带回家,看看用更强大的机器一夜之间能取得什么样的进步。

我一直在使用一个简单的循环来监控进度:

while true; do kill -USR1 $PID ; sleep 10 ; done

输出如下所示:

464938971+7 records in
464938971+7 records out
238048755782 bytes (238 GB) copied, 64559.6 s, 3.7 MB/s

dd如果我在家恢复通行证,我该如何重新启动?我知道这个seek参数,但是我应该将它指向什么,记录号还是字节数?

答案1

正如@don_crissti 已经评论的那样,只需使用seek=即可恢复。

dd if=/dev/urandom of=/dev/disk/by-uuid/etc bs=512 seek=464938971

GNU dd还支持以字节为单位查找,因此无论块大小如何,您都可以准确恢复:

dd if=/dev/urandom of=/dev/disk/by-uuid/etc bs=1M \
   seek=238048755782 oflag=seek_bytes

即使对于像/dev/urandom.

如果您正在寻找更快的替代方案,您可以cryptsetup plainOpen使用随机密钥并将其归零,它应该快/dev/urandom一个数量级(不使用 AES-NI),甚至全速运行(使用 AES-NI)。

shred -n 1如果伪随机数据足以满足您的用例,您也可以使用。shred即使在非常慢的机器上,也应该能够利用完整的磁盘速度。

答案2

只是提醒那些想要复制而不只是随机化磁盘的人(这不是common) : 你可以用它skip=BLOCKS来启动阅读在适当的位置,并seek=BLOCKS开始写作在正确的位置。两个选项都使用块,而不是字节。中断/重新启动时,建议删除一堆块以防万一。通常值得将bs值提高到 512 以上,因为如果连续读取大量数据,可以获得更好的性能。

就您而言,它确实是您需要传递给的块值seek。也许您应该尝试调整bs以查看是否可以提高速度,因为/dev/random应该很快(当没有可用熵时,伪随机和非阻塞)

答案3

克隆磁盘:

扩展于从这个线程回答,这就是克隆整个磁盘并恢复的方式:

此示例针对从 5400rpm 旋转驱动器复制到特定系统上的 SSD 进行了优化。 gdd代表GNU dd

> sudo gdd 'if=/dev/rdisk3' 'of=/dev/rdisk6' bs=4M status=progress
247426187264 bytes (247 GB, 230 GiB) copied, 2082 s, 119 MB/s
59012+0 records in
59011+0 records out
247510073344 bytes (248 GB, 231 GiB) copied, 2082.92 s, 119 MB/s

我可以通过以下两种方式之一恢复此操作:

> sudo gdd 'if=/dev/rdisk3' 'of=/dev/rdisk6' \
bs=4M \
seek=59011 skip=59011 \
status=progress

或者:

> sudo gdd 'if=/dev/rdisk3' 'of=/dev/rdisk6' \
bs=4M \
seek=247510073344 skip=247510073344 \
oflag=seek_bytes iflag=skip_bytes \
status=progress

59011在第一个示例中,我们使用and not 的原因59012是因为59011有多少块大小的记录在中断之前被完全复制。 (记录出来)。

答案4

如果可以的话,使用

#ddrescue from to logfile
ddrescue /dev/sda /dev/sdb logfile

保持日志文件远离 from 或 to...,如果您必须按 ctrl-c 或其他键,ddrescue 将读取其自己的日志文件并自动恢复。它还首先简单地复制所有内容,并且由于它可以从日志文件中恢复,因此您可以告诉它“返回并更努力地尝试”其他内容。

相关内容