Que fait dd conv = sync, noerror?

39

Alors, quel est le cas lorsque l’ajout conv=sync,noerrorfait une différence lors de la sauvegarde d’un disque dur entier sur un fichier image? Existe conv=sync,noerror- t-il une exigence lors de la réalisation de travaux de police scientifique? Si tel est le cas, pourquoi s’agit-il de linux fedora?

Modifier:

OK, donc si je ne Dd sans conv=sync,noerror, et des ddrencontres erreur de lecture lors de la lecture du bloc (taille LET 100M), ne dd juste sauter 100M bloc et lit le bloc suivant sans écrire quelque chose ( dd conv=sync,noerrorécrit des zéros à 100M de la production - de sorte que sur cette affaire ?)?

Et si le hachage du disque dur d'origine et du fichier de sortie est-il différent si on le fait sans conv=sync,noerror? Ou est-ce seulement quand une erreur de lecture s'est produite?

dding
la source
3
Vote positif pour la question "Est-ce que conv = sync, noerror est obligatoire pour effectuer des
actes

Réponses:

46

conv=syncindique ddde cadrer chaque bloc à gauche avec des valeurs NULL, de sorte que si, en raison d'une erreur, le bloc complet ne puisse pas être lu, la longueur complète des données d'origine est conservée, même si toutes les données ne peuvent pas être incluses dans l'image. . De cette façon, vous savez au moins à quel point les données sont endommagées, ce qui peut vous fournir des indices, et si vous ne pouvez pas prendre une image du tout à cause de blocs défectueux, vous ne pouvez pas analyser les données. certains sont meilleurs que rien.

conv=sync,noerrorest nécessaire pour éviter ddde s'arrêter en cas d'erreur et d'effectuer un cliché. conv=syncest en grande partie sans signification sans noerror.

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

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

Frank Thomas
la source
1
Question: si on fait dd sans conv = sync, noerror le hachage du disque dur et du fichier image devient-il différent?
dding
De plus, si dd rencontre une erreur de lecture, s'arrête-t-il à ce moment-là?
dding
3
dd lui-même ne doit pas avoir de hachage, pensez-vous à des outils tels que dcflDD forensicswiki.org/wiki/Dcfldd ? en théorie, le hachage du disque et le hachage de l'image devraient être identiques, tant que les outils de calcul du hachage rencontrent les erreurs de la même manière.
Frank Thomas
On a voté pour être la seule réponse à cette question qui répond clairement à la question, mais que pensez-vous de la conclusion de l'autre réponse, à savoir que cela corrompt effectivement la sauvegarde? Vos deux réponses semblent se contredire, mais je me trompe peut-être.
Hashim
36

dd conv=sync,noerror(ou conv=noerror,sync) corrompt vos données.

En fonction de l'erreur d'E / S rencontrée et de la taille de bloc utilisée (supérieure à la taille du secteur physique?), Les adresses d'entrée et de sortie ne restent pas synchronisées, mais aboutissent à des décalages incorrects, ce qui rend la copie inutile pour les images du système de fichiers et autres. les choses où les compensations comptent.

De nombreux endroits recommandent d’utiliser le conv=noerror,synctraitement des disques défectueux. J'avais l'habitude de faire la même recommandation, moi-même. Cela a fonctionné pour moi, alors que je devais récupérer un mauvais disque il y a quelque temps.

Cependant, les tests suggèrent qu'il ne s'agit en réalité d'aucune fiabilité.

Utilisez losetupet dmsetuppour créer un A error Bappareil:

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

Les dispositifs de boucle A, B ressemblent à ceci:

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

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

C'est donc A, B avec des nombres incrémentiels qui nous aideront à vérifier les décalages plus tard.

Maintenant, pour mettre une erreur de lecture entre les deux, gracieuseté du mappeur de périphériques Linux:

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

Cet exemple crée AerrorBcomme dans les 2000secteurs de A, suivis des 2*48secteurs d'erreur, suivis des 2000secteurs de B.

Juste pour vérifier:

# 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

Donc, il lit jusqu'à A127999\n, puisque chaque ligne a 8 octets qui totalisent 1024000 octets, ce qui correspond à nos 2000 secteurs de 512 octets. Tout semble être en ordre...

Est-ce que ça va se mélanger?

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

Résultats:

# 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

Rien que pour la taille des fichiers, vous pouvez savoir que les choses ne vont pas pour certaines tailles de blocs.

Checksums:

# 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

ddaccepte ddrescueuniquement pour les tailles de bloc qui se trouvent alignées sur notre zone d’erreur ( 512, 4K).

Vérifions les données brutes.

# 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

Bien que les données elles-mêmes semblent être présentes, elles ne sont évidemment pas synchronisées. les décalages sont complètement décalés pour bs = 16K, 1M, 42,64K ... seules celles avec décalage 2088576sont correctes, comme le prouve le périphérique d'origine.

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

Ce comportement attendu de dd conv=noerror,sync? Je ne sais pas et les deux implémentations ddque j'avais disponibles ne sont même pas d'accord. Le résultat est très inutile si vous utilisez ddun choix de taille de bloc performant.

Ce qui précède a été produit en utilisant dd (coreutils) 8.25, BusyBox v1.24.2, GNU ddrescue 1.21.

Frostschutz
la source
3
Très intéressant et détaillé, mais toujours déroutant. Voyez-vous cela comme un bug? At-il été rapporté? Ou est-ce simplement que l'utilisateur doit être sûr d'utiliser un argument bs = qui correspond à la taille de bloc réelle du périphérique?
Nealmcb
@frostschutz recommanderiez-vous d'utiliser ddrescueplutôt que de ddtravailler avec des disques avec des secteurs défectueux?
Ljk
2
Non; l' syncargument lui dit de conserver la longueur correcte de la sortie. Cela ne fonctionne pas si vous utilisez une mauvaise taille de bloc, alors ne le faites pas.
Psusi
12
Hey, iflag=fullblocksemble le sauver. Bien que md5sumles images créées avec iflag=fullblockencore diffèrent (bien sûr! Étant donné que le nombre d'octets ignorés en raison de l'erreur de lecture diffère - c'est-à-dire que la quantité de \0s dans les images diffère), l'alignement est enregistré avec iflag=fullblock: grep -a -b --only-matching B130000retourne 2088576pour toutes les images.
Sasha
3
@Sasha a raison et a besoin de plus de votes positifs! fullblock est mentionné dans les docs gnu.org/software/coreutils/manual/html_node/dd-invocation.html
mlt