dd conv=sync,noerror 有什么作用?

ddi*_*ing 55 linux backup dd forensics

conv=sync,noerror整个硬盘备份到映像文件时添加有什么影响?

conv=sync,noerror做司法鉴定的东西时,一个要求吗?如果是这样,为什么参考 Linux Fedora 会出现这种情况?

编辑:

好的,如果我dd没有这样做conv=sync,noerror并且dd在读取块时遇到读取错误(假设是 100M),是否dd只是跳过 100M 块并读取下一个块而不写入任何内容(dd conv=sync,noerror将零写入 100M 的输出 - 这种情况怎么样?)?

如果没有,原始硬盘和输出文件的哈希值是否不同conv=sync,noerror?还是只有在发生读取错误时才会这样?

Fra*_*mas 59

conv=sync告诉dd用空值向左填充每个块,以便如果由于错误而无法读取完整块,则保留原始数据的全长,即使并非所有数据本身都可以包含在图像中. 这样你至少知道数据的损坏程度,这可能会为你提供取证线索,如果由于坏块或其他原因根本无法拍摄图像,则无法分析任何数据。有总比没有好。

如果在读取源时出现读取错误,conv=sync,noerror则必须防止dd因错误而停止并执行转储。conv=sync如果没有错误,在很大程度上是没有意义的。

https://www.man7.org/linux/man-pages/man1/dd.1.html

http://vlinux-freak.blogspot.com/2011/01/how-to-use-dd-command.html

  • dd 本身并不哈希,所以您是否在考虑像 dcflDD http://www.forensicswiki.org/wiki/Dcfldd 这样的工具?理论上,磁盘的哈希值和图像的哈希值应该是相同的,只要计算哈希值的工具以相同的方式遇到错误即可。 (3认同)
  • @LukeHutchison,看起来您正在查看 Flags 选项的操作数(`iflag=`、`oflag=`),其中包括 `sync` 和 `dsync`,而不是 `conv=` 选项。我承认该手册页的文本格式还有很多不足之处,主题之间没有明确的区分。无缘无故地难以阅读。查看其上方的块,您将看到 conv= 操作数。请注意, conv=sync 用 NUL 或空格填充,具体取决于其他选项(“block”、“unblock”),而不是值 0。 (3认同)
  • 赞成成为这个问题上唯一清楚回答问题的答案,但是您如何看待另一个答案的结论,即它实际上损坏了备份?你的两个答案似乎互相矛盾,但也许我误解了。 (2认同)

fro*_*utz 54

dd conv=sync,noerror(或conv=noerror,sync)破坏您的数据。

根据遇到的 I/O 错误和使用的块大小(大于物理扇区大小?),输入和输出地址实际上并没有保持同步,而是以错误的偏移量结束,这使得复制对于文件系统映像和其他偏移很重要的事情。

很多地方推荐conv=noerror,sync在处理坏盘时使用。我曾经提出同样的建议,我自己。前段时间我不得不恢复坏磁盘时,它确实对我有用。

但是,测试表明这实际上根本不可靠。

使用losetupdmsetup创建A error B设备:

truncate -s 1M a.img b.img
A=$(losetup --find --show a.img)
B=$(losetup --find --show b.img)
i=0 ; while printf "A%06d\n" $i ; do i=$((i+1)) ; done > $A
i=0 ; while printf "B%06d\n" $i ; do i=$((i+1)) ; done > $B
Run Code Online (Sandbox Code Playgroud)

A、B 回路设备如下所示:

# head -n 3 $A $B
==> /dev/loop0 <==
A000000
A000001
A000002

==> /dev/loop1 <==
B000000
B000001
B000002
Run Code Online (Sandbox Code Playgroud)

所以它是带有递增数字的 A、B,这将有助于我们稍后验证偏移量。

现在在两者之间放置一个读取错误,由 Linux 设备映射器提供:

# dmsetup create AerrorB << EOF
0 2000 linear $A 0
2000 96 error
2096 2000 linear $B 48
EOF
Run Code Online (Sandbox Code Playgroud)

此示例创建AerrorBas2000扇区A,然后2*48是错误扇区,然后是2000扇区B

只是为了验证:

# blockdev --getsz /dev/mapper/AerrorB
4096
# hexdump -C /dev/mapper/AerrorB
00000000  41 30 30 30 30 30 30 0a  41 30 30 30 30 30 31 0a  |A000000.A000001.|
00000010  41 30 30 30 30 30 32 0a  41 30 30 30 30 30 33 0a  |A000002.A000003.|
[...]
000f9fe0  41 31 32 37 39 39 36 0a  41 31 32 37 39 39 37 0a  |A127996.A127997.|
000f9ff0  41 31 32 37 39 39 38 0a  41 31 32 37 39 39 39 0a  |A127998.A127999.|
000fa000
hexdump: /dev/mapper/AerrorB: Input/output error
Run Code Online (Sandbox Code Playgroud)

所以它读取直到A127999\n,因为每行有 8 个字节,总共 1024000 个字节,这是我们的 2000 个 512 个字节的扇区。一切似乎都井井有条……

它会融合吗?

for bs in 1M 64K 16K 4K 512 42
do
    dd bs=$bs conv=noerror,sync if=/dev/mapper/AerrorB of=AerrorB.$bs.gnu-dd
    busybox dd bs=$bs conv=noerror,sync if=/dev/mapper/AerrorB of=AerrorB.$bs.bb-dd
done

ddrescue /dev/mapper/AerrorB AerrorB.ddrescue
Run Code Online (Sandbox Code Playgroud)

结果:

# ls -l
-rw-r--r-- 1 root root 2113536 May 11 23:54 AerrorB.16K.bb-dd
-rw-r--r-- 1 root root 2064384 May 11 23:54 AerrorB.16K.gnu-dd
-rw-r--r-- 1 root root 3145728 May 11 23:54 AerrorB.1M.bb-dd
-rw-r--r-- 1 root root 2097152 May 11 23:54 AerrorB.1M.gnu-dd
-rw-r--r-- 1 root root 2097186 May 11 23:54 AerrorB.42.bb-dd
-rw-r--r-- 1 root root 2048004 May 11 23:54 AerrorB.42.gnu-dd
-rw-r--r-- 1 root root 2097152 May 11 23:54 AerrorB.4K.bb-dd
-rw-r--r-- 1 root root 2097152 May 11 23:54 AerrorB.4K.gnu-dd
-rw-r--r-- 1 root root 2097152 May 11 23:54 AerrorB.512.bb-dd
-rw-r--r-- 1 root root 2097152 May 11 23:54 AerrorB.512.gnu-dd
-rw-r--r-- 1 root root 2162688 May 11 23:54 AerrorB.64K.bb-dd
-rw-r--r-- 1 root root 2097152 May 11 23:54 AerrorB.64K.gnu-dd
-rw-r--r-- 1 root root 2097152 May 11 23:54 AerrorB.ddrescue
Run Code Online (Sandbox Code Playgroud)

仅从文件大小就可以看出某些块大小有问题。

校验和:

# md5sum *
8972776e4bd29eb5a55aa4d1eb3b8a43  AerrorB.16K.bb-dd
4ee0b656ff9be862a7e96d37a2ebdeb0  AerrorB.16K.gnu-dd
7874ef3fe3426436f19ffa0635a53f63  AerrorB.1M.bb-dd
6f60e9d5ec06eb7721dbfddaaa625473  AerrorB.1M.gnu-dd
94abec9a526553c5aa063b0c917d8e8f  AerrorB.42.bb-dd
1413c824cd090cba5c33b2d7de330339  AerrorB.42.gnu-dd
b381efd87f17354cfb121dae49e3487a  AerrorB.4K.bb-dd
b381efd87f17354cfb121dae49e3487a  AerrorB.4K.gnu-dd
b381efd87f17354cfb121dae49e3487a  AerrorB.512.bb-dd
b381efd87f17354cfb121dae49e3487a  AerrorB.512.gnu-dd
3c101af5623fe8c6f3d764631582a18e  AerrorB.64K.bb-dd
6f60e9d5ec06eb7721dbfddaaa625473  AerrorB.64K.gnu-dd
b381efd87f17354cfb121dae49e3487a  AerrorB.ddrescue
Run Code Online (Sandbox Code Playgroud)

dd与同意ddrescue只对发生在对准我们的错误区(块大小5124K)。

让我们检查原始数据。

# grep -a -b --only-matching B130000 *
AerrorB.16K.bb-dd:  2096768:B130000
AerrorB.16K.gnu-dd: 2047616:B130000
AerrorB.1M.bb-dd:   2113152:B130000
AerrorB.1M.gnu-dd:  2064000:B130000
AerrorB.42.bb-dd:   2088578:B130000
AerrorB.42.gnu-dd:  2039426:B130000
AerrorB.4K.bb-dd:   2088576:B130000
AerrorB.4K.gnu-dd:  2088576:B130000
AerrorB.512.bb-dd:  2088576:B130000
AerrorB.512.gnu-dd: 2088576:B130000
AerrorB.64K.bb-dd:  2113152:B130000
AerrorB.64K.gnu-dd: 2064000:B130000
AerrorB.ddrescue:   2088576:B130000
Run Code Online (Sandbox Code Playgroud)

虽然数据本身似乎存在,但显然不同步;bs=16K,1M,​​42,64K 的偏移量完全不正常......只有偏移量2088576是正确的,可以针对原始设备进行验证。

# dd bs=1 skip=2088576 count=8 if=/dev/mapper/AerrorB 
B130000
Run Code Online (Sandbox Code Playgroud)

这是预期的行为dd conv=noerror,sync吗?我不知道,dd我可用的两个实现甚至彼此不同意。如果您使用dd高性能块大小选择,结果将毫无用处。

以上是使用dd (coreutils) 8.25, BusyBox v1.24.2,制作的GNU ddrescue 1.21

  • 嘿嘿,`iflag=fullblock` 好像保存了。尽管使用 iflag=fullblock 制作的图像的 md5sum 仍然不同(当然!因为由于读取错误而跳过的字节数不同——即图像中的 `\0` 数量不同),但对齐方式使用 `iflag=fullblock` 保存:`grep -a -b --only-matching B130000` 为所有图像返回 `2088576`。 (32认同)
  • @Sasha 是对的,需要更多的支持!*fullblock* 在文档 https://www.gnu.org/software/coreutils/manual/html_node/dd-invocation.html 中提到 (4认同)
  • @Sasha `iflag=fullblock` 似乎适用于 GNU dd,尽管不适用于 BusyBox dd。 (4认同)
  • 非常有趣和详细,但仍然令人困惑。你认为这是一个错误吗?被举报了吗?或者仅仅是用户需要确保使用与设备实际块大小相对应的 bs= 参数? (3认同)
  • @frostschutz 在处理有坏扇区的驱动器时,您会建议使用“ddrescue”而不是“dd”吗? (2认同)
  • 不; `sync` 参数告诉它保持输出的正确长度。如果您使用错误的块大小,它将不起作用,所以不要这样做。 (2认同)
  • @BillMcGonigle 在 debian 上,使用 `dd conv=noerror,sync iflag=fullblock` 的建议不会出现在 gnu dd 的手册页上。它位于 gnu 信息文档中,我通常不查阅该文档。它包含许多有关 dd “陷阱”的其他信息,如果您使用 dd 进行 HDD 救援,则需要阅读这些信息。 (2认同)