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

15

Eu tenho um monte de cartões SDHC SDHC Classe 10 de diferentes fabricantes. Eles são todos particionados da seguinte forma

 $ 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

Eu usei um duplicador de cartão de memória para copiar as imagens. Todas as cartas têm o mesmo conteúdo.

Quando montei a segunda partição de dois cartões SD e comparei o conteúdo, eles são exatamente os mesmos.

 $ 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 esses dois drives usando uma ferramenta de diff binário como radiff2 , eu 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 muda, mesmo que diff não tenha encontrado diferenças no conteúdo!

E para 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 detalhamento dos diferentes sha1sums que vejo de diferentes cards. Parece que o fabricante da placa tem um grande efeito sobre o que eu recebo quando uso dd para ler a unidade.

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

Como é possível que duas partições de cartão SD tenham sha1sums diferentes e tenham o mesmo conteúdo exato quando montadas?

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

    
por peskal 18.12.2015 / 04:18

2 respostas

18

Você comparou seu conteúdo imediatamente depois de escrever o conteúdo duplicado? Se sim, eles devem sair exatamente da mesma forma. 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 as cartas tiverem exatamente o mesmo tamanho. Às vezes, mesmo diferentes lotes de cartões que são do mesmo fabricante e modelo saem com tamanhos ligeiramente diferentes. Use blockdev --getsize64 para obter o tamanho exato do dispositivo.

Além disso, se ambos os cartões tiverem tamanhos exatamente idênticos, mas você escreveu uma imagem para ambos os cartões menores que a capacidade dos cartões, o lixo que vem depois do final da imagem pode causar diferenças a serem relatadas.

Depois de montar qualquer sistema de arquivos no dispositivo, você começará a ver as diferenças. A implementação do sistema de arquivos irá gravar várias coisas no sistema de arquivos, como um diário vazio, ou um flag / timestamp para marcar o sistema de arquivos como limpo, e então você não verá mais o mesmo conteúdo. Eu acredito que este pode ser o caso em algumas circunstâncias, mesmo se você montar o sistema de arquivos somente leitura.

    
por 18.12.2015 / 04:29
8

Para construir sobre a resposta de 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 neles - aparentemente, depois de montar os sistemas de arquivos. Isso é 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 analisa os dados e os metadados . Estou um pouco surpreso com as diferenças de 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 ambos os dispositivos (e não no exato 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 , cada arquivo em cada dispositivo terá seu tempo de acesso (no inode) atualizado.

P.S. Você precisa usar dd tanto? O que acontece se você fizer radiff2 -c /dev/sdg2 /dev/sdj2 ou sha1sum /dev/sdg2 ?

    
por 18.12.2015 / 06:13

Tags