dd conv = sync,noerror会做什么?


39

那么在将conv=sync,noerror整个硬盘备份到映像文件上时添加添加会产生什么影响呢?是conv=sync,noerror做司法鉴定的东西时,一个要求吗?如果是这样,为什么参考linux fedora会出现这种情况?

编辑:

好的,所以如果我不使用dd conv=sync,noerror,并且dd在读取块(让我们的大小为100M)时遇到读取错误,dd会跳过100M块并在不写入内容的情况下读取下一个块吗(dd conv=sync,noerror将零写入100M的输出-那么这种情况呢? ?)?

如果不做的话,原始硬盘的哈希和输出文件是否不同conv=sync,noerror?还是仅当发生读取错误时?


3
支持问题“在进行法医检查时是否需要conv = sync,noerror吗?”
nergeia 2014年

Answers:


45

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

conv=sync,noerror是必要的,以防止dd错误停止并执行转储。conv=sync没有错误,在很大程度上是毫无意义的。

http://linuxcommand.org/man_pages/dd1.html

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


1
问题:如果dd没有conv = sync,noerror硬盘和映像文件的哈希是否会不同?
dding

另外,如果dd遇到读取错误,那么它会在此时停止吗?
dding

3
dd本身不会散列,因此您是否在考虑dcflDD forensicswiki.org/wiki/Dcfldd之类的工具?从理论上讲,只要计算哈希的工具以相同的方式遇到错误,磁盘的哈希和映像的哈希就应该相同。
Frank Thomas

37

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

A,B循环设备如下所示:

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

==> /dev/loop1 <==
B000000
B000001
B000002

因此,A,B的数字递增,这将有助于我们稍后验证偏移量。

现在,在Linux设备映射器的帮助下,将读取错误置于两者之间:

# dmsetup create AerrorB << EOF
0 2000 linear $A 0
2000 96 error
2096 2000 linear $B 48
EOF

此示例创建AerrorB2000扇区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

因此读取直到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

结果:

# 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

仅从文件大小就可以看出某些块大小是错误的。

校验和:

# 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

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

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

# dd bs=1 skip=2088576 count=8 if=/dev/mapper/AerrorB 
B130000

这是预期的行为dd conv=noerror,sync吗?我不知道,dd我可用的两个实现甚至都不相同。如果dd与性能块化选择一起使用,结果将非常无用。

以上是使用产生的dd (coreutils) 8.25BusyBox v1.24.2GNU ddrescue 1.21


3
非常有趣和详细,但仍然令人困惑。您是否将此视为错误?有报道吗?还是仅仅是需要确保用户使用与设备的实际块大小相对应的bs =参数?
nealmcb

您是否建议使用@frostschutz ddrescue而不是dd在扇区损坏的驱动器上使用?
ljk

2
没有; 该sync参数告诉它来保持输出正确的长度。如果您使用了错误的块大小,这将不起作用,因此请不要这样做。
psusi

11
嘿,iflag=fullblock似乎可以保存它。尽管md5sum用制作的图像的s iflag=fullblock仍然有所不同(当然!因为由于读取错误而被跳过的字节数不同-即\0图像中的s的数量不同),但是对齐方式保存为iflag=fullblock:对所有图像grep -a -b --only-matching B130000返回2088576
萨沙

2
@Sasha是正确的,需要更多投票!fullblock在文档中提到gnu.org/software/coreutils/manual/html_node/dd-invocation.html
MLT
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.