Comparación de dispositivos de bloque sin procesar

12

¿Existe una utilidad (o algo de magia de shell) que me permita comparar dos dispositivos de bloque?

Detalles: Tengo un dispositivo RAID grande (0,5 TB) del que hice una copia de seguridad en un dispositivo SATA un poco más grande con dd. El dispositivo tiene varias particiones, sin embargo, copio del dispositivo 'principal' y no de los nodos del dispositivo particionado (por ejemplo, copio / dev / hda y no / dev / hda1, por ejemplo).

Me gustaría verificar que la copia de seguridad sea buena / correcta.

He pensado en ejecutar md5sum en cada dispositivo, sin embargo, eso no me dará un resultado preciso ya que el segundo dispositivo es ligeramente más grande que el primero y, por lo tanto, los bytes adicionales cambiarán el hash.

alanxz
fuente

Respuestas:

13

Usaría el comando

cmp /dev/hda /dev/hdb

se detendrá en el primer byte diferente, escribiendo su desplazamiento, o en EOF en el más corto.

enzotib
fuente
No veo nada en la página de manual sobre detenerse en EOF, ¿está documentado en alguna parte?
Kevin
De hecho, el estado de salida dice: "1: los archivos son diferentes; esto incluye el caso en que un archivo es idéntico a la primera parte del otro". Esto parece implicar que no los informa como idénticos si uno es más corto.
Kevin
@Kevin: from info cmp: "El comando 'cmp' compara dos archivos y, si difieren, le dice al primer byte y número de línea dónde difieren".
enzotib
1
Puede usar la --bytes=LIMITopción, estableciendo el LIMITvalor en el tamaño de bytes del dispositivo más pequeño para detenerse al final de la unidad más pequeña (o límite de partición) sin tener que cmpsalir con un estado distinto de cero.
rozcietrzewiacz
si tengo una copia / dev / loop0 de / dev / sda y hago cambios en / dev / loop0, ¿cómo podría agregar los nuevos cambios a / dev / sda? Gracias
Milor123
2

Dependiendo de cuán llenas estén realmente las unidades, puede ser más rápido montar los sistemas de archivos y hacer

diff -qr /mnt/root1 /mnt/root2

De lo contrario, diría algo como esto:

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

Obviamente descubra qué tan grande necesita hacer bsy countdetenerse (o justo antes si es mucho más conveniente) al final de la unidad más pequeña.

O, gracias al comentario de enzotib, parece que podría usar cmp, pero necesitará el -nindicador para limitar el número de bytes a la más corta de las dos unidades.

cmp /dev/sda /dev/sdb -n 500GB
Kevin
fuente
Desafortunadamente, no puedo montar el dispositivo ya que es un volumen NTFS, y tengo un LiveCD sin los controladores correctos. Para el segundo comando, ¿las subcapas que usa no intentan absorber todo el dispositivo en la memoria antes de alimentarlo en diff?
alanxz
1
@alanxz No, las subcapas diffno leerán todo el dispositivo antes de escribirlo. ddescribe bsbytes inmediatamente después de leerlo (o procesar si se especifica, no aquí), y escriben en fifos, que bloquean hasta que se leen.
Kevin
Estaba pensando más en el nivel de shell (o lo que sea que implemente el FIFO). ¡Pero eso responde a mi pregunta!
alanxz
2

Estás buscando software binario diff

rdiff
está diseñado para copia de seguridad y transmisión de red, mire rdiff-backup y duplicidad para propuso de copia de seguridad

xdelta3
es un diferencial binario de código abierto, herramientas de compresión diferencial, compresión VCDIFF (RFC 3284) delta.

bsdiff
también lo es! hambriento de memoria, no es adecuado para dispositivos de bloque.

gustavodiazjaimes
fuente
1

Hay una utilidad llamada bsdiff , que hace exactamente este tipo de cosas. Lo hace realmente rápido y es capaz de generar un parche binario, si lo necesita.

Vea esta publicación para obtener alguna explicación al respecto.

Coren
fuente
bsdiffEl trabajo es más complejo que simplemente comparar dos archivos, por lo que dudo que pueda ser más rápido que el más simple cmp.
enzotib
El enlace está roto.
Owen Pauling
1

Puede comparar dos dispositivos de bloque de diferentes tamaños usando md5sumesto:

(suponiendo que el dispositivo más pequeño es /dev/sda)

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

Considera correr fsck en la copia de seguridad. Es posible que deba jugar algunos trucos losetuppara configurar los dispositivos de bucle invertido en las particiones incrustadas en la copia de seguridad, pero si la verificación del archivo dice que la estructura del archivo es consistente, los datos en sí mismos probablemente sean buenos.

Si desea una suma de verificación completa, puede usar dispositivos de bucle invertido con compensaciones para ver las 'particiones' internas de la copia de seguridad y md5sum cada una por separado, pero un forzado fsckpuede darle una idea básica mucho más rápido que el byte para comparar bytes o los cálculos de suma de verificación.

Evan Langlois
fuente