DDRescue 日志文件在 6 周恢复后损坏

DDRescue 日志文件在 6 周恢复后损坏

我已经在 3Tb 驱动器上运行 DDRescue 近 2 个月了,当系统崩溃并且我使用的日志文件损坏时,我已经恢复了大约 2.8Tb。我能够恢复该日志文件的一部分,但恢复的日志中的扇区存在间隙,导致 DDRescue 在再次启动时返回错误。以下是查看日志文件的 wetransfer 链接:https://we.tl/58aSOeCOJo

我尝试编辑日志文件以删除损坏的数据,但是由于这会在扇区的时间顺序中产生“间隙”,DDRescue 似乎不喜欢这样。

感谢您的帮助,我真的想避免再重新运行 DDRescue 两个月来保存这个驱动器......

答案1

为了使这个答案至少对有类似问题的其他用户有用,让我们在这里引用您的日志的关键部分:

# Rescue Logfile. Created by GNU ddrescue version 1.18.1
# Command line: ddrescue -f -d -R -r3 /dev/sde /dev/sdf /mnt/somedir/logfiles/log3.log
# Start time:   2017-08-14 10:22:44
# Current time: 2017-08-14 12:13:09
# Copying non-tried blocks... Pass 1 (backwards)
# current_pos  current_status
0x27BF0520000     ?
#      pos        size  status
0x00000000  0x02870000  +
0x02870000  0x001A0000  *
0x02A10000  0x00010200  +
0x02A20200  0x0005FE00  *
# ...                          many lines here
0x2BA92360000  0x00040000  ?
0x2BA923A0000  0x00010000  *
#                              binary garbage here
0xE4E1710000  0x00010000  *
# ...                          many lines here
0x13D75970000  0x00000200  +
0x13D75970200  0x00

您确定二进制垃圾之前的行是最后一个有效行。它显示,0x2BA923A0000 0x00010000 *并且您的情况是行号 880829。这是有道理的,因为垃圾之后的行具有较低的位置(第一个数字),它们似乎重复了较早的行。

我做到了

<log3.txt head -n 880829 > log3new.txt

并运行ddrescue(由于是infile来自大型稀疏文件的循环设备,所以这应该无关紧要)。它抱怨第 583658 行。

这是该线及其邻域:

# ...
0x186C6940000  0x00000200  +
0x186C6940200 A9520200  0x0001FE00  *  # <- this line here
0x24AA9540000  0x00000200  +
# ...

0x186C6940200要解决此问题,您应该覆盖从到 的整个范围0x24AA9540000,以便日志文件是连续的。长度为0x24AA9540000- 0x186C6940200= 0xC3E2BFFE00。整行 583658 应该是:

0x186C6940200 0xC3E2BFFE00 ?

其中?表示未经尝试的块。

我修复了

sed -i '583658s/.*/0x186C6940200 0xC3E2BFFE00 ?/' log3new.txt

生成的日志文件有效期为ddrescue


编辑

但是我遇到的问题是,DDrescue 认为它只恢复了 2041GB,而当崩溃发生时,它超过了 2800GB,你可以想象,最后的 800GB 花了数周时间才恢复。

事实上,我们不知道这是否是相同的 800 GB。有一个工具ddrescueview (带有 GUI,ddrescueview在 Ubuntu 中作为软件包提供)可以向您显示我们引入的这些未经尝试的块的确切位置。请注意,当前位置在其他地方:

ddrescueview 截图


所以我想知道垃圾后面的信息是否与此有关?我们有什么办法可以将其包含在日志文件中吗?

我已经分离出这个“垃圾之后”的部分,即最后的 129289 行:

tail -n 129289 log3.txt > extra.txt

此命令将显示在extra.txt但不在的行log3new.txt

diff --suppress-common-lines extra.txt log3new.txt | grep -e '^<'

输出为

< 0x13D75970200  0x00

这意味着只有垃圾之后的最后一行(不完整)在原始垃圾之前不存在log3.txt。抱歉,在我看来这log3new.txt已经是你能得到的最好的了。

相关内容