Perché queste schede SD duplicate hanno sha1sums diversi per il loro contenuto?


17

Ho un gruppo di schede SD SDHC UHS-1 di classe 10 di diversi produttori. Sono tutti partizionati come segue

 $ 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

Ho usato un duplicatore di memory card per copiare le immagini. Tutte le carte hanno lo stesso contenuto.

Quando monto la seconda partizione di due schede SD e confronto il contenuto, sono esattamente gli stessi.

 $ 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^

Tuttavia, se confronto lo sha1sum delle partizioni, a volte differiscono

 $ 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  -

Straniero, se metto a confronto queste due unità usando uno strumento diffing binario simile radiff2, vedo quanto segue

 $ 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 modifiche, anche se diffnon ci sono state differenze nel contenuto!

E per sanità mentale, se confronto due partizioni che avevano lo stesso sha1sum, vedo quanto segue

 $ radiff2 -c sdj2.img sdf2.img
0

0 modifiche!

Ecco una ripartizione dei diversi sha1sum che vedo da diverse carte. Sembra che il produttore della scheda abbia un grande impatto su ciò che ottengo quando uso dd per leggere l'unità.

inserisci qui la descrizione dell'immagine

Nonostante le differenze in sha1sums, tutte queste carte funzionano per i miei scopi. Tuttavia, sta rendendo difficile il controllo dell'integrità perché non riesco a confrontare sha1sums.

Come è possibile che due partizioni di schede SD possano avere sha1sums diversi, ma avere lo stesso identico contenuto quando montate?


Risposta: Quindi ora funziona come previsto. Per chiarire le cose, l'incoerenza è stata causata dal duplicatore SySTOR che stavo usando. L'impostazione di copia che avevo usato utilizzava informazioni e file di partizione copiati, ma non era necessario dd i bit per assicurarsi che ci fosse una corrispondenza uno a uno.


3
Che tipo di test stai facendo con un tale mazzo di carte? :)
hjk il

Se li stai confrontando dopo averli montati, qui c'è il tuo problema.
David Hoelzer, il

Risposte:


18

Hai confrontato i loro contenuti immediatamente dopo aver scritto i contenuti duplicati? Se sì, dovrebbero uscire esattamente allo stesso modo. Per esempio,

# 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

Questo è vero solo se le carte hanno esattamente le stesse dimensioni. A volte, anche diversi lotti di carte dello stesso produttore e modello escono con dimensioni leggermente diverse. Utilizzare blockdev --getsize64per ottenere le dimensioni esatte del dispositivo.

Inoltre, se entrambe le carte hanno dimensioni esattamente identiche ma hai scritto un'immagine su entrambe le carte che era inferiore alla capacità delle carte, la spazzatura che viene dopo la fine dell'immagine potrebbe causare la segnalazione di differenze.

Una volta montato qualsiasi filesystem sul dispositivo, inizierai a vedere le differenze. L'implementazione del filesystem scriverà varie cose sul filesystem, come un journal vuoto o un flag / timestamp per contrassegnare il filesystem come pulito, e quindi non vedrai più contenuti identici. Credo che questo possa essere il caso in alcune circostanze anche se monti il ​​filesystem in sola lettura.


L'OP deve essere utilizzato blockdev --getsize64? Sembra che ddstia annunciando la quantità di dati che legge.
G-Man dice "Ripristina Monica" il

3
EIBTI. Interrogare le dimensioni lo rende davvero chiaro. ddsegnalerà quanto è stato copiato . In caso di dimensioni non corrispondenti tra un file di immagine, la dimensione di un dispositivo e la dimensione di un altro dispositivo, ecc ... che può essere la dimensione della fonte, la desinenza o entrambi.
Celada,

Hai ragione. Dovrebbero essere e sono esattamente gli stessi. Dopo aver esaminato ulteriormente questo, ho scoperto che l'incoerenza era causata dall'impostazione della copia sul mio duplicatore SySTOR. Quando ho ddle schede SD dal mio computer (come ho fatto con l'immagine principale per il duplicatore), tutti gli shasums corrispondono. Ho cambiato le impostazioni su SySTOR da "solo sistemi e file di dati" a "interi media" e ora tutte le carte duplicate hanno shasums corrispondenti
peskal

8

Per basarsi sulla risposta di Celada: da un lato, stai facendo un diff(ricorsivo) tra due filesystem montati. D'altra parte, stai facendo un confronto binario tra i dispositivi che hanno file system su di essi - apparentemente, dopo aver montato i file system. Sono mele e melograni.

L'operazione a livello di filesystem montato può vedere solo il contenuto dei dati dei file nei filesystem. Il confronto binario tra i dispositivi esamina i dati e i metadati . Sono un po 'sorpreso dalle differenze di 767368, ma posso indovinare alcune:

  • Quando montate un filesystem, il kernel scrive l'ora corrente nel superblocco del filesystem come "mount time". Se avete montato entrambi i dispositivi (e non al esatto stesso tempo), il "monte volte" nei superblocchi sarà diverso.
  • Se si esegue il confronto binario a livello di dispositivo dopo il filesystem ricorsivo diff, ogni file su ciascun dispositivo avrà il suo tempo di accesso (nell'inode) aggiornato.

PS Hai bisogno di usare ddcosì tanto? Cosa succede se lo fai radiff2 -c /dev/sdg2 /dev/sdj2 o sha1sum /dev/sdg2?


Questo vale anche quando si monta l'unità in sola lettura? Ho fatto anche il confronto con shasum prima del montaggio e differiscono ancora. Inoltre non ho mai visto il cambiamento di shasum dopo il montaggio in sola lettura. - Inoltre hai ragione, dovrei vincere un uso inutile del premio dd: p
peskal il

(1) No, come sospetti (cioè, in linea con la tua esperienza), montare un filesystem come ro(sola lettura) non dovrebbe causare (o consentire) alcuna modifica. (Anche se ho visto uno o due casi di software che fanno qualcosa di diverso da quello che dovrebbe fare.) (2) Dopo aver letto i tuoi commenti (uno su ciascuna risposta, al momento in cui scrivo), non riesco ancora a capire cosa è accaduto. Potresti modificare la tua domanda o pubblicare una risposta che spieghi le circostanze in cui hai avuto un errore di confronto (cioè, ha trovato differenze) immediatamente dopo la duplicazione (prima del montaggio), ... (proseguendo)
G-Man dice "Reinstate Monica"

(Proseguendo) ... e cosa hai fatto per risolverlo? (3) Mi piace, ma dovrebbe essere chiamato "UUOD", "UUODD" o "UUDD"? Io voto per "UUDD", ma probabilmente dovremmo prendere questo su Meta. :-) ⁠
G-Man dice "Ripristina Monica" il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.