恢复整个磁盘的DD


10

我正在使用旧版本的随机数据覆盖硬盘驱动器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
我是否使用记录号?这等于块写入计数吗?
Naftuli Kay 2015年

2
块数=总字节数/块大小,理论上应该是238048755782/512 = 464938976,但是那里有部分记录,所以为了安全起见,我会从数字中减去一些块,例如seek=464938960
don_crissti

Answers:


8

正如@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即使在非常慢的计算机上,也应该能够利用整个磁盘速度。


plainOpen直到现在我才知道。大!我在大约4个小时内完成了对2TB驱动器的争夺,而在12天内使用256GB完成了我的争夺/dev/urandom
Naftuli Kay 2015年

3

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

就您而言,它确实是您需要传递给的块值seek。也许您应该尝试调整bs一下是否可以提高速度,就像/dev/random应该快一些一样(在没有熵的情况下使用伪随机和非阻塞)


0

dd512字节这样的小块大小可能会比磁盘的最大吞吐量慢很多。使用更高的块大小(我预感会说几MB)以获得良好的性能。或使用cat-在Linux 上,当涉及到单个磁盘时,我发现cat它的速度dd与最佳块大小一样快(我不知道OSX是否同样适用)。

若要查找cat已达到的距离,请运行lsof -p1234,其中1234是该进程的进程ID cat

要从某个职位恢复,请使用

{ dd bs=1 seek=123456; cat /dev/urandom; } >/dev/disk/…

其中123456是字节偏移量。


0

克隆磁盘:

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

此示例经过优化,可从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不使用59012,是因为59011在中断之前已完全复制了多少块大小的记录。(记录下来)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.