拥有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
,而不是因此您必须正确指定单位。 )G
GB
GiB
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 应该不会发现差异,但实际上,这种情况经常发生,因为现在许多发行版都带有各种难以禁用的自动功能。