Comparaison des périphériques de blocs bruts

12

Existe-t-il un utilitaire (ou un peu de magie du shell) qui me permet de comparer deux périphériques bloc?

Détails: J'ai un grand périphérique RAID (0,5 To) que j'ai sauvegardé sur un périphérique SATA légèrement plus grand en utilisant dd. Le périphérique comporte plusieurs partitions, mais je copie depuis le périphérique «parent» et non les nœuds de périphériques partitionnés (par exemple, je copie / dev / hda et non / dev / hda1 par exemple).

Je voudrais vérifier que la sauvegarde est bonne / correcte.

J'ai pensé à exécuter md5sum sur chaque appareil, mais cela ne me donnera pas un résultat précis car le deuxième appareil est légèrement plus grand que le premier et donc les octets supplémentaires changeront le hachage.

alanxz
la source

Réponses:

13

J'utiliserais la commande

cmp /dev/hda /dev/hdb

il s'arrêtera au premier octet différent, en écrivant son décalage, ou sur EOF sur le plus court.

enzotib
la source
Je ne vois rien dans la page de manuel concernant l'arrêt à l'EOF, est-ce documenté quelque part?
Kevin
En fait, l'état de sortie indique: "1: Les fichiers sont différents; cela inclut le cas où un fichier est identique à la première partie de l'autre." Cela semble impliquer qu'il ne les rapporte pas comme identiques si l'un est plus court.
Kevin
@Kevin: from info cmp: "La commande 'cmp' compare deux fichiers, et s'ils diffèrent, indique le premier octet et le numéro de ligne où ils diffèrent."
enzotib
1
Vous pouvez utiliser l' --bytes=LIMIToption, en définissant la LIMITvaleur sur la taille en octets du plus petit périphérique pour qu'il s'arrête à la fin du plus petit lecteur (ou de la limite de partition) sans avoir de cmpsortie avec un état différent de zéro.
rozcietrzewiacz
si j'ai une copie / dev / loop0 de / dev / sda et que j'apporte des modifications à / dev / loop0, comment pourrais-je ajouter les nouvelles modifications à / dev / sda ?? Merci
Milor123
2

Selon le niveau de remplissage des disques, il peut être plus rapide de monter les systèmes de fichiers et de

diff -qr /mnt/root1 /mnt/root2

Sinon, je dirais quelque chose comme ceci:

diff -q <(dd bs=1M count=500K if=/dev/sda) <(dd bs=1M count=500K if=/dev/sdb)

Évidemment, déterminez à quel point vous devez faire de la taille bset countarrêtez-vous (ou juste avant si c'est beaucoup plus pratique) à la fin du plus petit lecteur.

Ou, grâce au commentaire d'enzotib, il semble que vous pourriez utiliser cmp, mais vous aurez besoin de l' -nindicateur pour limiter le nombre d'octets au plus court des deux disques.

cmp /dev/sda /dev/sdb -n 500GB
Kevin
la source
Malheureusement, je ne peux pas monter le périphérique comme son volume NTFS, et j'ai un LiveCD sans les bons pilotes dessus. Pour la deuxième commande, les sous-coquilles que vous utilisez n'essaient pas d'aspirer tout le périphérique en mémoire avant de le charger dans diff?
alanxz
1
@alanxz Non, les diffsous- coquilles ne liront pas l'intégralité de l'appareil avant de l'écrire. ddécrit des bsoctets immédiatement après l'avoir lu (ou traité si spécifié, pas ici), et ils écrivent dans fifos, qui bloquent jusqu'à ce qu'ils soient lus.
Kevin
Je pensais plus au niveau du shell (ou tout ce qui implémente le FIFO). Mais cela répond à ma question!
alanxz
2

Vous recherchez un logiciel de diff binaire

rdiff
est conçu pour la sauvegarde et la transmission réseau, regardez rdiff-backup et duplicity pour la sauvegarde propuse

xdelta3
est un diff binaire open source, des outils de compression différentielle, une compression delta VCDIFF (RFC 3284).

bsdiff l'
est aussi !! faim de mémoire, ne convient pas aux périphériques bloc.

gustavodiazjaimes
la source
1

Il existe un utilitaire appelé bsdiff , qui fait exactement ce genre de chose. Il le fait très rapidement et il est capable de générer un patch binaire, si vous en avez besoin.

Voir ce post pour quelques explications à ce sujet.

Coren
la source
bsdiffLe travail est plus complexe que de simplement comparer deux fichiers, donc je doute qu'il puisse être plus rapide que le plus simple cmp.
enzotib
Le lien est rompu.
Owen Pauling
1

Vous pouvez comparer deux blocs de taille différente en utilisant md5sumcomme ceci:

(en supposant que le plus petit appareil est /dev/sda)

# md5sum /dev/sda && head -c $(blockdev --getsize64 /dev/sda) /dev/sdb | md5sum
EmmaV
la source
0

Pensez à exécuter fscksur la sauvegarde. Vous devrez peut-être jouer à quelques astuces losetuppour obtenir des périphériques de bouclage sur des partitions intégrées dans la sauvegarde, mais si la vérification du fichier indique que la structure du fichier est cohérente, les données elles-mêmes sont probablement bonnes.

Si vous voulez une somme de contrôle complète, vous pouvez utiliser des périphériques de bouclage avec décalages pour examiner séparément les `` partitions '' internes de la sauvegarde et de la somme md5, mais un forcé fsckpeut vous donner une idée de base beaucoup plus rapide que l'octet pour les comparaisons d'octets ou les calculs de somme de contrôle.

Evan Langlois
la source