¿Por qué estas tarjetas SD duplicadas tienen sha1sums diferentes para su contenido?


17

Tengo un montón de tarjetas SD SDHC UHS-1 Clase 10 de diferentes fabricantes. Todos están divididos de la siguiente manera

 $ sudo fdisk -l /dev/sdj
Disk /dev/sdj: 14.9 GiB, 15931539456 bytes, 31116288 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x0000de21

Device     Boot   Start      End  Sectors  Size Id Type
/dev/sdj1          2048  1050623  1048576  512M  c W95 FAT32 (LBA)
/dev/sdj2       1050624  2099199  1048576  512M 83 Linux
/dev/sdj3       2099200  3147775  1048576  512M 83 Linux
/dev/sdj4       3147776 31116287 27968512 13.3G 83 Linux

Usé un duplicador de tarjeta de memoria para copiar las imágenes. Todas las tarjetas tienen el mismo contenido.

Cuando monte la segunda partición de dos tarjetas SD y compare el contenido, son exactamente iguales.

 $ sudo mount -o ro /dev/sdg2 /mnt/system-a/
 $ sudo mount -o ro /dev/sdj2 /mnt/system-b/
 $ diff -r --no-derefence /mnt/system-a /mnt/system-b/
 $ # prints nothing^

Sin embargo, si comparo el resumen de las particiones, a veces difieren

 $ sudo dd if=/dev/sdg2 | sha1sum
1048576+0 records in
1048576+0 records out
536870912 bytes (537 MB) copied, 12.3448 s, 43.5 MB/s
ee7a16a8d7262ccc6a2e6974e8026f78df445e72  -

 $ sudo dd if=/dev/sdj2 | sha1sum
1048576+0 records in
1048576+0 records out
536870912 bytes (537 MB) copied, 12.6412 s, 42.5 MB/s
4bb6e3e5f3e47dc6cedc6cf8ed327ca2ca7cd7c4  -

Más extraño, si comparo estas dos unidades usando una herramienta de diferenciación binaria como radiff2, veo lo siguiente

 $ sudo dd if=/dev/sdg2 of=sdg2.img
1048576+0 records in
1048576+0 records out
536870912 bytes (537 MB) copied, 12.2378 s, 43.9 MB/s

 $ sudo dd if=/dev/sdj2 of=sdj2.img
1048576+0 records in
1048576+0 records out
536870912 bytes (537 MB) copied, 12.2315 s, 43.9 MB/s

 $ radiff2 -c sdg2.img sdj2.img
767368

767368 cambios, a pesar de diffque no vio ninguna diferencia en el contenido!

Y por cordura, si comparo dos particiones que tenían el mismo sha1sum, veo lo siguiente

 $ radiff2 -c sdj2.img sdf2.img
0

0 cambios!

Aquí hay un desglose de los diferentes sha1sums que veo de diferentes tarjetas. Parece que el fabricante de la tarjeta tiene un gran efecto en la suma que obtengo cuando uso dd para leer la unidad.

ingrese la descripción de la imagen aquí

A pesar de las diferencias en sha1sums, todas estas tarjetas funcionan para mis propósitos. Sin embargo, está dificultando la comprobación integral porque no puedo comparar sha1sums.

¿Cómo es posible que dos particiones de la tarjeta SD puedan tener sha1sums diferentes y, sin embargo, tener exactamente el mismo contenido cuando están montadas?


Respuesta: Entonces ahora funciona como se esperaba. Para aclarar las cosas, la inconsistencia fue causada por el duplicador SySTOR que estaba usando. La configuración de copia que hice usaba la información y los archivos de la partición copiados, pero no era necesario dd los bits para garantizar que hubiera una coincidencia uno a uno.


3
¿Qué tipo de pruebas estás haciendo con un montón de cartas? :)
hjk

Si los está comparando después de montarlos, ahí está su problema.
David Hoelzer

Respuestas:


18

¿Comparó sus contenidos inmediatamente después de escribir los contenidos duplicados? En caso afirmativo, deberían salir exactamente igual. Por ejemplo,

# Duplicate
dd bs=16M if=/dev/sdg of=/dev/sdk

# Comparing should produce no output
cmp /dev/sdg /dev/sdk
# Compare, listing each byte difference; also no output
cmp -l /dev/sdg /dev/sdk

Esto solo es cierto si las tarjetas tienen exactamente el mismo tamaño. A veces, incluso diferentes lotes de tarjetas que son del mismo fabricante y modelo salen con tamaños ligeramente diferentes. Use blockdev --getsize64para obtener el tamaño exacto del dispositivo.

Además, si ambas tarjetas tienen tamaños exactamente idénticos pero usted escribió una imagen para ambas tarjetas que era más pequeña que la capacidad de las tarjetas, entonces la basura que viene después del final de la imagen puede causar que se notifiquen diferencias.

Una vez que monte cualquier sistema de archivos en el dispositivo, comenzará a ver las diferencias. La implementación del sistema de archivos escribirá varias cosas en el sistema de archivos, como un diario vacío o una marca / marca de tiempo para marcar el sistema de archivos como limpio, y ya no verá más contenido idéntico. Creo que este puede ser el caso en algunas circunstancias, incluso si monta el sistema de archivos de solo lectura.


¿El OP necesita usar blockdev --getsize64? Parece que ddestá anunciando la cantidad de datos que lee.
G-Man dice 'reinstalar a Mónica'

3
EIBTI. Consultar el tamaño lo deja muy claro. ddinformará cuánto copió . En caso de desajustes de tamaño entre un archivo de imagen, el tamaño de un dispositivo y el tamaño de otro dispositivo, etc., puede ser el tamaño de la fuente, el destino o ambos.
Celada

Tienes razón. Deberían ser y son exactamente lo mismo. Después de investigar esto más a fondo, descubrí que la configuración de copia en mi duplicador SySTOR causó la inconsistencia. Cuando ddutilizo las tarjetas SD de mi computadora (como hice con la imagen maestra del duplicador), todos los shasums coinciden. Cambié la configuración del SySTOR de "solo datos de sistemas y archivos" a "medios completos" y ahora todas las tarjetas duplicadas tienen chasums coincidentes
peskal

8

Para construir sobre la respuesta de Celada: Por un lado, estás haciendo un diff(recursivo) entre dos sistemas de archivos montados. Por otro lado, está haciendo una comparación binaria entre dispositivos que tienen sistemas de archivos en ellos , aparentemente, después de haber montado los sistemas de archivos. Eso es manzanas y granadas.

La operación en el nivel del sistema de archivos montado solo puede ver el contenido de datos de los archivos en los sistemas de archivos. La comparación binaria entre los dispositivos analiza los datos y los metadatos . Estoy un poco sorprendido por las diferencias 767368, pero puedo adivinar algunas:

  • Cuando monta un sistema de archivos, el núcleo escribe la hora actual en el superbloque del sistema de archivos como el "tiempo de montaje". Si ha montado ambos dispositivos (y no en el exacto mismo tiempo), el "montar tiempos" en los superbloques será diferente.
  • Si realiza la comparación binaria a nivel de dispositivo después del sistema de archivos recursivo diff, cada archivo en cada dispositivo tendrá su tiempo de acceso (en el inodo) actualizado.

PD: ¿necesitas usar ddtanto? ¿Qué pasa si haces radiff2 -c /dev/sdg2 /dev/sdj2 o sha1sum /dev/sdg2?


¿Esto se aplica incluso al montar la unidad como solo lectura? He hecho la comparación de shasum antes de montar también y todavía difieren. Tampoco he visto cambiar el shasum después de montarlo como solo lectura. - También tienes razón, debería ganar un uso inútil del premio dd: p
peskal

(1) No, como sospecha (es decir, de acuerdo con su experiencia), montar un sistema de archivos como ro(solo lectura) no debería causar (o permitir) ninguna modificación. (Aunque he visto uno o dos casos de software haciendo algo diferente de lo que debería hacer). (2) Después de leer sus comentarios (uno en cada respuesta, en el momento de escribir esto), todavía no entiendo qué sucedió ¿Podrías editar tu pregunta o publicar una respuesta que explique las circunstancias en las que obtuviste un error de comparación (es decir, encontró diferencias) inmediatamente después de duplicar (antes de montar), ... (Continúa)
G-Man dice 'Reinstate Monica'

(Continúa) ... ¿y qué hiciste para resolverlo? (3) Me gusta, pero ¿debería llamarse "UUOD", "UUODD" o "UUDD"? Voto por "UUDD", pero probablemente deberíamos abordar esto en Meta. :-) ⁠
G-Man dice 'Reincorporar a Monica' el
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.