Por que esses cartões SD duplicados têm sha1sums diferentes para seu conteúdo?

17

Eu tenho um monte de cartões SD 10 UHS-1 SDHC de diferentes fabricantes. Eles são todos particionados da seguinte maneira

 $ 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

Usei um duplicador de cartão de memória para copiar as imagens. Todos os cartões têm o mesmo conteúdo.

Quando monto a segunda partição de dois cartões SD e comparo o conteúdo, eles são exatamente iguais.

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

No entanto, se eu comparar o sha1sum das partições, elas às vezes diferem

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

Estranho, se eu comparar essas duas unidades usando uma ferramenta de diferenças binárias como radiff2, vejo o seguinte

 $ 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 alterações, mesmo que diffnão tenha visto nenhuma diferença no conteúdo!

E por sanidade, se eu comparar duas partições que tinham o mesmo sha1sum, vejo o seguinte

 $ radiff2 -c sdj2.img sdf2.img
0

0 alterações!

Aqui está um resumo dos diferentes sha1sums que vejo em diferentes cartões. Parece que o fabricante da placa tem um grande efeito sobre o sha1sum que recebo quando uso o dd para ler a unidade.

insira a descrição da imagem aqui

Apesar das diferenças nos sha1sums, todos esses cartões funcionam para meus propósitos. No entanto, está dificultando a verificação de integridade porque não posso comparar sha1sums.

Como é possível que duas partições de cartão SD possam ter sha1sums diferentes, mas tenham exatamente o mesmo conteúdo quando montadas?


Resposta: Então agora funciona como esperado. Para esclarecer as coisas, a inconsistência foi causada pelo duplicador SySTOR que eu estava usando. A configuração de cópia em que eu usei usava informações e arquivos de partições copiados, mas não era necessário dd os bits para garantir que houvesse uma correspondência individual.

peskal
fonte
3
Que tipo de teste você está fazendo com um monte de cartões? :)
HJK
Se você as estiver comparando depois de montá-las, esse é o seu problema.
David Hoelzer

Respostas:

18

Você comparou o conteúdo deles imediatamente após escrever o conteúdo duplicado? Se sim, eles devem ser exatamente iguais. Por exemplo,

# 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

Isso só é verdade se os cartões tiverem exatamente o mesmo tamanho. Às vezes, até diferentes lotes de cartões do mesmo fabricante e modelo são produzidos com tamanhos ligeiramente diferentes. Use blockdev --getsize64para obter o tamanho exato do dispositivo.

Além disso, se os dois cartões tiverem tamanhos exatamente idênticos, mas você tiver gravado uma imagem nos dois cartões menor que a capacidade dos cartões, o lixo que vem depois do final da imagem pode causar diferenças.

Depois de montar qualquer sistema de arquivos no dispositivo, você começará a ver diferenças. A implementação do sistema de arquivos gravará várias coisas no sistema de arquivos, como um diário vazio ou um sinalizador / carimbo de data / hora para marcar o sistema de arquivos como limpo e você não verá mais conteúdo idêntico. Acredito que esse possa ser o caso em algumas circunstâncias, mesmo se você montar o sistema de arquivos somente leitura.

Celada
fonte
O OP precisa usar blockdev --getsize64? Parece que ddestá anunciando a quantidade de dados que lê.
G-Man diz 'Reinstate Monica'
3
EIBTI. Consultar o tamanho deixa muito claro. ddrelatará quanto foi copiado . No caso de incompatibilidade de tamanho entre um arquivo de imagem, o tamanho de um dispositivo e o tamanho de outro dispositivo, etc ... que pode ser o tamanho da fonte, do destino ou de ambos.
Celada
Você está certo. Eles deveriam ser e são exatamente iguais. Depois de analisar isso mais adiante, descobri que a inconsistência foi causada pela configuração de cópia no meu duplicador SySTOR. Quando eu ddcoloco os cartões SD do meu computador (como fiz com a imagem principal do duplicador), todos os shasums coincidem. Eu mudei as configurações no Systor de "sistemas e arquivos somente de dados" para "media inteiras" e shasums agora todos os cartões duplicados têm correspondentes
peskal
8

Para aproveitar a resposta da Celada: Por um lado, você está fazendo um diff(recursivo) entre dois sistemas de arquivos montados. Por outro lado, você está fazendo uma comparação binária entre dispositivos que possuem sistemas de arquivos - aparentemente, depois de montar os sistemas de arquivos. São maçãs e romãs.

A operação no nível do sistema de arquivos montado pode ver apenas o conteúdo dos dados dos arquivos nos sistemas de arquivos. A comparação binária entre os dispositivos examina os dados e os metadados . Estou um pouco surpreso com as diferenças do 767368, mas posso adivinhar algumas:

  • Quando você monta um sistema de arquivos, o kernel grava a hora atual no superbloco do sistema de arquivos como o "tempo de montagem". Se você montou os dois dispositivos (e não exatamente ao mesmo tempo), os "tempos de montagem" nos superblocos serão diferentes.
  • Se você fizer a comparação binária no nível do dispositivo após o sistema de arquivos recursivo diff, todos os arquivos em cada dispositivo terão seu tempo de acesso (no inode) atualizado.

PS Você precisa usar ddtanto? O que acontece se você faz radiff2 -c /dev/sdg2 /dev/sdj2 ou sha1sum /dev/sdg2?

G-Man Diz 'Reinstate Monica'
fonte
Isso se aplica mesmo ao montar a unidade como somente leitura? Também fiz a comparação do shasum antes da montagem e eles ainda diferem. Também nunca vi o shasum mudar depois da montagem como somente leitura. - Você também está certo, eu deveria ganhar um uso inútil do dd award: p
peskal
(1) Não, como você suspeita (isto é, consistente com sua experiência), montar um sistema de arquivos como ro(somente leitura) não deve causar (ou permitir) nenhuma modificação. (Embora eu tenha visto um ou dois casos de software fazendo algo diferente do que deveria fazer.) (2) Depois de ler seus comentários (um em cada resposta, no momento da redação deste artigo), ainda não entendi bem o que aconteceu. Você pode editar sua pergunta ou postar uma resposta explicando as circunstâncias nas quais você obteve falha na comparação (ou seja, encontrou diferenças) imediatamente após duplicar (antes da montagem),… (continua)
G-Man diz 'Reinstate Monica'
(Continua) ... e o que você fez para resolvê-lo? (3) Gostei, mas deveria ser chamado de "UUOD", "UUODD" ou "UUDD"? Eu voto em "UUDD", mas provavelmente deveríamos aceitar isso no Meta. :-) ⁠
G-Man diz 'Reinstate Monica'