Что делает 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? Или это только когда произошла ошибка чтения?

dding
источник
3
Upvote на вопрос «Является ли conv = sync, noerror обязательным требованием при выполнении судебно-медицинской экспертизы?»
nergeia

Ответы:

46

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 не станет ли хеш жесткого диска и файла образа другим?
Ддинг
Кроме того, если dd встречает ошибку чтения, останавливается ли она в этот момент?
Ддинг
3
сам dd не хэш, так что вы думаете о таких инструментах, как dcflDD forensicswiki.org/wiki/Dcfldd ? теоретически, хэш диска и хэш изображения должны быть одинаковыми, при условии, что инструменты, вычисляющие хэш, сталкиваются с ошибками одинаково.
Фрэнк Томас
Голосовали за то, что это единственный ответ на этот вопрос, который четко отвечает на вопрос, но как вы относитесь к выводу другого ответа о том, что он фактически повреждает резервную копию? Ваши два ответа, кажется, противоречат друг другу, но, возможно, я неправильно понимаю.
Хашим
36

dd conv=sync,noerror(или conv=noerror,sync) портит ваши данные.

В зависимости от обнаруженной ошибки ввода-вывода и используемого размера блока (больше, чем размер физического сектора?), Входные и выходные адреса фактически не синхронизируются, а заканчиваются неправильными смещениями, что делает копию бесполезной для образов файловой системы и других вещи, где смещения имеют значение.

Многие места рекомендуют использовать conv=noerror,syncпри работе с плохими дисками. Я сам делал такую ​​же рекомендацию. Это сработало для меня, когда я должен был восстановить плохой диск некоторое время назад.

Тем не менее, тестирование показывает, что это не совсем надежно.

Используйте losetupи dmsetupдля создания 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

Этот пример создает AerrorBкак в 2000секторах 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только с размерами блоков, которые оказываются выровненными по нашей зоне ошибки ( 512, 4K).

Давайте проверим необработанные данные.

# 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.25, BusyBox v1.24.2, GNU ddrescue 1.21.

frostschutz
источник
3
Очень интересно и подробно, но все еще сбивает с толку. Вы видите это как ошибку? Было ли это сообщено? Или просто пользователю необходимо обязательно использовать аргумент bs =, который соответствует фактическому размеру блока устройства?
nealmcb
@frostschutz вы бы порекомендовали использовать ddrescueвместо ddпри работе с дисками с поврежденными секторами?
LJK
2
Нет; syncаргумент говорит это , чтобы выходной сигнал нужной длины. Это не работает, если вы используете неправильный размер блока, так что просто не делайте этого.
psusi
12
Эй, iflag=fullblockпохоже, чтобы спасти это. Хотя md5sums изображений, созданных с помощью, по- iflag=fullblockпрежнему различаются (конечно! Потому что количество байтов, которые были пропущены из-за ошибки чтения, различаются - т.е. количества \0s в изображениях различаются), но выравнивание сохраняется с iflag=fullblock: grep -a -b --only-matching B130000возвращает 2088576для всех изображений.
Саша
3
@ Саша прав и нуждается в большем количестве голосов! fullblock упоминается в документации gnu.org/software/coreutils/manual/html_node/dd-invocation.html
MLT