Почему эти дублированные SD-карты имеют разные значения содержания?

17

У меня есть куча SD-карт класса 10 UHS-1 SDHC от разных производителей. Все они разделены следующим образом

 $ 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

Я использовал дубликатор карты памяти для копирования изображений. Все карты имеют одинаковое содержание.

Когда я монтирую второй раздел любых двух SD-карт и сравниваю содержимое, они абсолютно одинаковы.

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

Однако, если я сравню sha1sum разделов, они иногда отличаются

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

Незнакомец, если я сравниваю эти два диска, используя бинарный инструмент, например radiff2, я вижу следующее

 $ 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 изменений, хотя diffи не видел различий в содержании!

И для здравомыслия, если я сравниваю два раздела с одинаковым значением sha1sum, я вижу следующее

 $ radiff2 -c sdj2.img sdf2.img
0

0 изменений!

Вот разбивка различных значений, которые я вижу по разным картам. Похоже, что производитель карты сильно влияет на то, какой sha1sum я получаю, когда использую dd для чтения диска.

введите описание изображения здесь

Несмотря на различия в sha1sums, все эти карты работают для моих целей. Однако это затрудняет проверку целостности, потому что я не могу сравнить sha1sums.

Как это возможно, что два раздела SD-карты могут иметь разные значения, но при подключении иметь одинаковое содержимое?


Ответ: теперь все работает как положено. Чтобы прояснить ситуацию, несоответствие было вызвано дубликатом SySTOR, который я использовал. В настройках копирования он использовал скопированную информацию о разделах и файлы, но не нужно было добавлять биты, чтобы гарантировать совпадение «один к одному».

peskal
источник
3
Какие тесты вы проводите с такой кучей карт? :)
hjk
Если вы сравниваете их после того, как монтируете их, в этом ваша проблема.
Дэвид Хоэлзер

Ответы:

18

Вы сравнили их содержимое сразу после написания дублированного содержимого? Если да, они должны выйти точно так же. Например,

# 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

Это верно только в том случае, если карты имеют одинаковый размер. Иногда даже разные партии карт одного и того же производителя и модели выпускаются с немного разными размерами. использованиеblockdev --getsize64 чтобы получить точный размер устройства.

Кроме того, если обе карты имеют абсолютно одинаковые размеры, но вы записали изображение на обе карты, которое было меньше емкости карт, то мусор, который появляется после конца изображения, может привести к появлению различий.

Как только вы смонтируете любую файловую систему на устройстве, вы начнете видеть различия. Реализация файловой системы будет записывать различные вещи в файловую систему, такие как пустой журнал или флаг / метка времени, чтобы пометить файловую систему как чистую, и тогда вы больше не увидите идентичный контент. Я считаю, что это может иметь место при некоторых обстоятельствах, даже если вы монтируете файловую систему только для чтения.

Celada
источник
Есть ли OP нужно использовать blockdev --getsize64? Похоже, ddобъявляет объем данных, которые он читает.
G-Man говорит: «Восстанови Монику»
3
EIBTI. Запрос размера делает это действительно ясным. ddсообщит, сколько это скопировало . В случае несоответствия размера между файлом изображения, размером одного устройства и размером другого устройства и т. Д. ... это может быть размер источника, назначения или того и другого.
Селада
Ты прав. Они должны быть и они точно такие же. Посмотрев дальше, я обнаружил, что несоответствие было вызвано настройкой копирования на моем дубликаторе SySTOR. Когда яdd SD-карты со своего компьютера (как я делал с главным образом для дубликатора), все шасумы совпадают. Я изменил настройки SySTOR с «только данные систем и файлов» на «весь носитель», и теперь все дублированные карточки имеют одинаковые шасумы
Пескал
8

Чтобы развить ответ Селады: с одной стороны, вы делаете diff(рекурсивно) между двумя смонтированными файловыми системами. С другой стороны, вы делаете двоичное сравнение между устройствами, на которых есть файловые системы - очевидно, после того, как вы смонтировали файловые системы. Это яблоки и гранаты.

Операция на уровне смонтированной файловой системы может видеть только содержимое данных файлов в файловых системах. Двоичное сравнение между устройствами смотрит на данные и метаданные . Я немного удивлен различиями в 767368, но я могу догадаться о нескольких:

  • Когда вы монтируете файловую систему, ядро ​​записывает текущее время в суперблок файловой системы как «время монтирования». Если установлены оба устройства (а не в точном то же время), то «установить время» в суперблоках будет отличаться.
  • Если вы выполняете двоичное сравнение на уровне устройства после рекурсивной файловой системы diff, каждому файлу на каждом устройстве будет обновлено время доступа (в inode).

PS Вам нужно ddтак много использовать ? Что произойдет, если вы делаете radiff2 -c /dev/sdg2 /dev/sdj2 илиsha1sum /dev/sdg2 ?

G-Man говорит: «Восстанови Монику»
источник
Это применимо даже при монтировании диска только для чтения? Я сделал сравнение shasum перед монтажом, и они все еще отличаются. Я также никогда не видел изменения shasum после монтажа только для чтения. - Также ты прав, я должен выиграть бесполезное использование награды dd: p
peskal
(1) Нет, как вы подозреваете (т.е. в соответствии с вашим опытом), монтирование файловой системы как ro(только для чтения) не должно вызывать (или разрешать) какие-либо изменения. (Хотя я видел один или два случая, когда программное обеспечение делало что-то отличное от того, что оно должно делать.) (2) После прочтения ваших комментариев (по одному на каждый ответ на момент написания этой статьи) я все еще не совсем понимаю, что получилось. Не могли бы вы отредактировать свой вопрос или опубликовать ответ, объясняющий обстоятельства, при которых вы получили ошибку сравнения (т. Е. Обнаружил различия) сразу после дублирования (до монтажа),… (Продолжение)
G-Man говорит «Восстановить Монику»
(Продолжение) ... и что вы сделали, чтобы решить это? (3) Мне это нравится, но должно ли оно называться «UUOD», «UUODD» или «UUDD»? Я голосую за «UUDD», но мы, вероятно, должны обсудить это с Meta. :-) ⁠
G-Man говорит «Восстановить Монику»