ddrescue 在 cat --generate-mode 之后在部分图像上生成映射文件

ddrescue 在 cat --generate-mode 之后在部分图像上生成映射文件

拥有1TB(931.5G)的硬盘。我做了:

sudo sh -c 'cat /dev/sdf >disk_1t.img'

但它停止了读取错误908G。

我认为下一步(应该是第一步)是使用 gnu ddrescue。问题是我没有地图文件。问题:

A)使用是否有损坏现有图像的风险--generate-mode

ddrescue -n --generate-mode /dev/sdf disk_1t.img disk_1t.map

猜测-n选项最适合第一次运行。如果有假请说出来。

如果我理解正确的话,那么它会从908G开始读取?

我不希望它再次开始读取整个磁盘。

二)如果最后一个字节被损坏,尝试让它以 907.5G 的速度读取是否有任何意义?cat无论如何都会写出坏数据吗?如果可能的话,从 910G 开始读取是否会更好,跳过 2G,因为它们可能是造成问题的部分?然后在稍后的运行中执行 908-910。

C)有没有办法在读取/尝试/耗尽剩余的 23.1G 后检查第一个 908G?


如果有的话,这里是现有图像的尾部:

$ tail -c 512 disk_1tb.img | xxd
00000000: b481 e803 8733 0000 5801 b454 6e3a 9e51  .....3..X..Tn:.Q
00000010: 4cc8 4851 0000 0000 e803 0100 2000 0000  L.HQ........ ...
00000020: 0000 0000 0000 0000 9314 260b 9414 260b  ..........&...&.
00000030: 9514 260b 9614 260b 0000 0000 0000 0000  ..&...&.........
00000040: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000050: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000060: 0000 0000 817a 168b 0000 0000 0000 0000  .....z..........
00000070: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000080: 1c00 0000 0000 0000 0000 0000 c8e9 3caa  ..............<.
00000090: 0000 0000 0000 0000 0000 0000 0000 0000  ................
000000a0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
000000b0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
000000c0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
000000d0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
000000e0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
000000f0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000100: b481 e803 b650 0000 7300 b454 6e3a 9e51  .....P..s..Tn:.Q
00000110: 879d c950 0000 0000 e803 0100 3000 0000  ...P........0...
00000120: 0000 0000 0000 0000 9714 260b 9915 260b  ..........&...&.
00000130: 9a15 260b 9b15 260b 9c15 260b 9d15 260b  ..&...&...&...&.
00000140: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000150: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000160: 0000 0000 827a 168b 0000 0000 0000 0000  .....z..........
00000170: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000180: 1c00 0000 0000 0000 0000 0000 f0cc 5056  ..............PV
00000190: 0000 0000 0000 0000 0000 0000 0000 0000  ................
000001a0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
000001b0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
000001c0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
000001d0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
000001e0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
000001f0: 0000 0000 0000 0000 0000 0000 0000 0000  ................

答案1

就您而言,没有真正需要生成映射文件。由于您确切地知道偏移量,因此可以将其作为输入位置传递(如果有疑问,请将输入位置设置得小一点。将其设置得较大会留下间隙。请注意,将其视为ddrescue,而不是因此您必须正确指定单位。 )GGBGiB

ddrescue --min-read-rate=1MiB \
         --input-position=900GiB \
         /dev/sdx sdx.img sdx.map

地图文件将产生如下结果:

#      pos        size  status
0x00000000  0xE100000000  ?

哪个将 0-900GiB 区域标记为?稍后再考虑。只要你继续使用--input-position周围的参数,ddrescue就会简单地忽略该区域并只处理其余部分。

如果您确定之前的部分已完全复制,则可以执行此操作。这就是你的情况,除非你做了一些奇特的事情,可能忽略了错误或更改了偏移量,从而导致数据损坏(例如使用时dd conv=noerror,sync)。

如果您改变主意并想重新读取前 900GiB,只需删除该--input-position参数即可。


使用是否有损坏现有图像的风险--generate-mode

一般来说,要做出ddrescue错误的事情是需要付出努力的。仅当您使其使用错误的源设备(通过复制错误的数据而损坏)或使其使用错误的偏移量(通过将正确的数据复制到错误的位置而损坏)ddrescue时,才会损坏图像文件。--output-position还有一种更奇特的--fill-mode方法,将数据模式写入图像文件,但您必须不遗余力地实际使用它。

如果我理解正确的话,那么它会从908G开始读取?

在生成模式下,ddrescue不知道图像文件是如何产生的(通过 ddrescue、通过 dd、通过其他方式),因此它假设任何二进制零区域之前可能已被跳过。因此,如果磁盘上有全零数据的区域,它可能会尝试重新读取这些区域,并且仅跳过具有非零数据的区域。

理论上,不重新读取包含数据的所有部分会节省您一些时间,但生成地图毕竟需要首先读取图像文件中的所有数据,因此实际上,如果您的源驱动器是,它只会比重新开始更快。缓慢(由于损坏)。

其要点--generate-mode并不是节省时间(生成需要时间),而是避免过度工作已经发生故障的源驱动器,并在不清楚先前复制了哪些数据段时方便恢复。

如果最后一个字节被损坏,尝试让它以 907.5G 的速度读取是否有任何意义?

在你的情况下根本不需要,从技术上讲,你可以从上次停下的地方继续,而不是重新读取之前复制的单个扇区。除非您忽略错误(就像这样dd conv=noerror,sync做),否则现有图像中不应该出现损坏,但cat.

有没有办法在读取/尝试/耗尽剩余的 23.1G 后检查第一个 908G?

您可以用来cmp比较两个文件或块设备:

cmp /dev/sdx sdx.img

这也可以在偏移量处完成:

cmp --bytes=64M /dev/sdx sdx.img 900G 900G

但是,仅当驱动器仅以只读方式访问时,数据才会匹配。如果您有任何自动挂载的东西,它将修改文件系统元数据。

因此,从理论上讲,cmp第一代 908G 应该不会发现差异,但实际上,这种情况经常发生,因为现在许多发行版都带有各种难以禁用的自动功能。

相关内容