最大限度地恢复带有坏扇区和多次传递的旧软盘中的数据

最大限度地恢复带有坏扇区和多次传递的旧软盘中的数据

我收集了一些旧的 3.5 英寸软盘,希望从中恢复尽可能多的数据。

该问题是由于某些文件的结构造成的,我需要维护所有文件的长度,这意味着应该填充任何坏扇区(tl;dr 原因是某些文件是 Acorn ADFS 文件,其中数据和代码结合在一起。代码将数据引用为文件开头的偏移量。在 Linux 中读取 ADFS 格式不是问题,填充坏扇区才是问题)。

这些光盘已经有 25 年没有被读取过了,因此我预计读取会出现不可预测的情况、经常出现坏扇区并可能导致光盘无法读取——只要数据恢复达到最大化,我不介意这些。

为了做到这一点,我预计需要多次通读才能读到尽可能多的内容。

我查看了 dd,这个命令有望首次运行:

dd if=/dev/fd0 of=adfs.img conv=noerror,sync

随后又调用

dd if=/dev/fd0 of=adfs.img conv=noerror,notrunc

在哪里:

无错误意味着错误被忽略

同步表示坏扇区用空字符填充

诺特伦克意味着调用 dd 时(已经存在的)输出文件不会被截断。

然而,当我读到手册页和这个notrunc 的解释尽管设置了 notrunc,dd 每次都会覆盖输出,导致输出仍然只代表上次读取的内容。任何之前正确读取但现在损坏的扇区(例如由于旧软盘性能下降)都将被覆盖为 null。

所以 dd 看起来不太合适。

救援

救援看起来很有希望,因为它可以用于多次传递,只要使用日志文件来记录成功写入的内容,然后在下一次传递完成时引用即可。

第一遍只读取无错误块

ddrescue -d -p --no-scrape /dev/fd0 output.img log/output.logfile

填补第一遍和后续遍的错误

ddrescue -d -r3 /dev/fd0 output.img log/output.logfile

在哪里

-d直接磁盘访问。忽略系统缓存

--no-scrape或者-n跳过抓取阶段

-ppreallocate 在恢复之前预先分配磁盘空间,即输出文件将与输入文件/设备的大小相同

-r3重试坏扇区 3 次(第二次及以后使用)

但问题是 ddrescue 似乎不会在出现坏扇区时对其进行填充。设置 -p 后,它似乎会导致所有填充都位于文件末尾,而不是按照要求维护数据与文件开头之间的偏移量。

情况似乎确实如此,因为 ddrescue 被编写为尽量节省磁盘空间,因此坏扇区会被截断,如果在后续过程中成功读取坏扇区,则会将其添加到坏扇区中。设置 -p 只会创建一个与输入文件大小相同的输出文件以节省空间,而不是填充数据。因此,设置或取消设置 -p 后的输出内容将相同,即直到文件末尾才进行填充。

问题

所以我的问题分为三部分

  1. 即使设置了 -p,ddrescue 也不会填充恢复的文件,这是正确的吗?

  2. 有什么方法可以让它填充?我在互联网上搜索时看到一条评论(会再次找到并添加),ddrescue 创建的日志文件可以被脚本用来填充相关位置。有什么想法吗?

  1. 您是否知道任何更好的命令/程序/脚本来完成我想做的事情 - 通过多次读取损坏的磁盘并填充坏扇区来最大限度地恢复数据?

我正在使用 Ubuntu 18.04,dd 版本是 (coreutils) 8.28,GNU ddrescue 版本是 1.22,均来自 Ubuntu 存储库。

一如既往地感谢您的帮助

答案1

GNU 救援是您尝试进行恢复的正确工具。


1)即使设置了 -p,ddrescue 也不会填充恢复的文件,这是正确的吗?

但这种假设是错误的。 你可能会感到困惑手册说这样:

当 Ddrescue 在输入中发现坏扇区时,它不会在输出中写入零,并且如果没有要求,它不会截断输出文件。

这只是意味着没有用零代替坏扇区。坏扇区应该有的内容并没有被填满。如果你正在向空白磁盘或文件写入数据,目标处的未写入区域将读回为零(空字节)。

此外,-p/--preallocate选项与“填充”没有任何关系。它的意思是“预分配”。在受支持的文件系统上,该选项可确保目标上有足够的磁盘空间来存储源磁盘。


2)有什么方法可以让它垫起来吗?

GNU ddrescue 输出的文件在逻辑上与源磁盘的布局相同。 从源读取的块位于目标中的相同位置。您甚至可以反转整个恢复 ( -R/ --reverse),块将反向填充,仍然位于正确的位置。


3)您是否知道任何更好的命令/程序/脚本来完成我想做的事情 - 通过多次读取损坏的磁盘并填充坏扇区来最大限度地恢复数据?

GNU ddrescue 完全可以满足您的需求。它可以执行多次传递(-r/ ),并且所需的坏扇区“填充”是 GNU ddrescue 的默认行为。从--retry-passes=n手册

如果输出文件是 ddrescue 创建的常规文件,则标记为坏扇区的区域将包含零。

为了完全清楚地解决您的担忧,即成功读取后跟错误读取将被“填充”为 null,ddrescue 不会尝试重新读取成功的读取―没有必要,因为数据已经恢复。mapfile 是 ddrescue 了解已恢复和未能恢复的内容的方式。

相关内容