Я купил карту SD на 64 ГБ у eBay. Он отлично работает, когда я записываю образ Arch Linux ARM и использую его для загрузки моего Raspberry Pi.
Однако, когда я пытаюсь создать на нем один раздел ext4 для использования всей емкости карты, возникают ошибки. mkfs.ext4
всегда заканчивается счастливо; однако, раздел не может быть mount
отредактирован, всегда выдает ошибку и dmesg
показывает сообщения ядра Cannot find journal
. Это подтвердилось как минимум на двух платформах: Arch Linux ARM и Ubuntu 13.04.
С другой стороны, я могу создать и смонтировать раздел FAT32 без ошибок (проверка полной емкости не была выполнена).
Я слышал, что некоторые плохие парни могут изменить интерфейс SD-карты, чтобы сообщить о неправильной емкости ОС (т. Е. Карта действительно всего 2 ГБ, но сообщает о себе как 64 ГБ), чтобы продать карту по более выгодной цене.
Я знаю, что подобные инструменты badblocks
существуют для меня, чтобы проверить SD-карту на предмет плохих блоков. Может ли badblocks
обнаружить такие проблемы? Если нет, то какие еще существуют решения для тестирования карты?
В идеале я хотел бы знать, был ли я обманут или нет; если результат показывает, что я только что получил плохой товар, я могу только вернуться к продавцу, а сообщить в eBay, что кто-то пытался меня обмануть.
ОБНОВИТЬ
операции и сообщения:
~$ sudo mkfs.ext4 /dev/sde1
mke2fs 1.42.5 (29-Jul-2012)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
4096000 inodes, 16383996 blocks
819199 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=4294967296
500 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
4096000, 7962624, 11239424
Allocating group tables: done
Writing inode tables: done
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done
~$ dmesg | tail
...
[4199.749118]...
~$ sudo mount /dev/sde1 /mnt
mount: wrong fs type, bad option, bad superblock on /dev/sde1,
missing codepage or helper program, or other error
In some cases useful info is found in syslog - try
dmesg | tail or so
~$ dmesg | tail
...
[ 4199.749118]...
[ 4460.857603] JBD2: no valid journal superblock found
[ 4460.857618] EXT4-fs (sde1): error loading journal
ОБНОВИТЬ
Я бежал, badblocks /dev/sde
но он не сообщает об ошибке. Это означает, что оставшиеся причины:
SD автомобиль хорош , но по какой - то причине
mke2fs
илиmount
или ядра есть ошибка , которая вызывает проблему.Я был обманут таким образом,
badblocks
что это не может обнаружить поражение. Это правдоподобно, потому что я думаю, чтоbadblocks
просто делает некоторый тест записи-чтения на месте. Однако мошенник может связать доступ к исходящим областям с каким-либо входящим блоком. В этом случае проверка на запись-чтение на месте не может обнаружить проблему.
Если нет приложения, способного выполнить надлежащий тест, я думаю, что я могу попытаться написать простую C-программу для его тестирования.
источник
dmesg
показывает сообщения ядра, и я уверен, что они появляются одновременно с ошибками, потому что я делал это до и после и сравнивал их. Я не проверю,syslog
потому что я верюdmesg
, покажет сообщения.Ответы:
Если кто-то увидит это позже: кто-то написал инструмент с открытым исходным кодом под названием «F3» для проверки емкости SD-карт и других подобных носителей. Его можно найти на сайте проекта и в Github .
источник
Обман был подтвержден следующими шагами:
Создайте файл случайных данных. (4194304 = 4 × 1024 × 1024 = 4 МБ, общий размер = 40 × 4 МБ = 160 МБ)
Команда:
Скопируйте данные на SD-карту. (2038340 × 4096 = 8153600 КиБ = 7962,5 МиБ)
Команда:
Считайте данные обратно с SD-карты.
Команда:
Показать результат
Команда:
Что произошло? Мы наблюдали разрыв нулей. Это показатель того, что случайные данные фактически не были записаны на карту. Но почему данные возвращаются после
1a81000
? Очевидно, карта имеет внутренний кэш.Мы также можем попытаться исследовать поведение кэша.
не дает результата, что означает, что сгенерированный мусор не имеет такой картины. Тем не мение,
есть 4 матча.
Вот почему он проходит
badblocks
проверку. Дальнейшие тесты могут показать, что фактическая емкость составляет 7962,5 МБ или чуть меньше 8 ГБ.Я пришел к выводу, что это очень маловероятно, что это просто случайный аппаратный сбой, но скорее всего это обман (т. Е. Мошенничество). Я хотел бы знать, какие действия я могу предпринять, чтобы помочь другим жертвам.
Обновление 11/05/2019
Люди спрашивали меня о том, как я выяснил, правильный
seek
параметр2038399
. Я сделал намного больше опыта, чем я показал выше. В основном вы должны угадать в первую очередь. Вы должны угадать правильный размер данных, и вы должны угадать, где было повреждение данных. Но вы всегда можете использовать метод деления пополам .В комментарии ниже я подумал, что предполагалось, что второй шаг выше (копирование данных на SD-карту) копирует только 1 сектор. Но я не ошибся в своем эксперименте. Вместо этого
seek
нужно было показать, что на этапе «показать результат» смещение1000
просто происходит во втором секторе данных. Еслиseek
2038399 секторов, коррупция находится на 2038400-м секторе.источник
bs=4194304 count=40
при чтении с,/dev/urandom
аbs=4096 count=40960
при записи и чтении с SD-карты? (Они математически эквивалентны; 167772160 байтов каждый.)seek
, поэтому я записал только 1 сектор на карту, что экономит объем передаваемых данных. Конечно, при экспериментировании я использовал больший блок данных, поэтому сгенерированный файл данных имеет размер 160 МБ.sudo dd if=test.orig of=/dev/sde seek=2038399 bs=4096
. И, очевидно, вы правы; он используетseek
. И, да, технически это не используетcount
. … (Продолжение)count
спецификацииdd
передает весь ввод (т. е. передает до EOF или с ошибкой). Таким образом, эта команда передает весь контентtest.orig
, который составляет 40960 записей по 4096 байт каждая, в общей сложности 167772160 байт (как я уже говорил).Прежде всего, прочитайте ответ F3 от @Radtoo. Это правильный путь.
Я как-то пропустил это и попробовал по-своему:
создать тестовый файл 1 ГБ:
dd if=/dev/urandom bs=1024k count=1024 of=testfile1gb
записать копии этого файла на SDCard (64 - размер SDCard в ГБ):
for i in $(seq 1 64); do dd if=testfile1gb bs=1024k of=/media/sdb1/test.$i; done
проверьте md5 файлов (все, кроме последнего, неполного, должны совпадать):
md5sum testfile1gb /media/sdb1/test.*
источник
Самый простой способ проверить полную емкость SD-карты - это заполнить ее файлами, а затем проверить правильность файлов:
diff -qr /directory/on/computer /directory/on/SD
Кроме того, вы можете использовать программы для записи шаблонов или цепочек хэшей в файл, а затем проверять их правильность.
Как отметил @Earthy Engine , важно заполнить SD-карту, а затем прочитать данные, поскольку традиционные подходы, которые просто записывают небольшой блок данных, а затем читают их, одурачены поддельными картами SSD.
источник
Я написал небольшой скрипт, который делает следующее.
-создание временного каталога на целевую карту USB или SC
-создает 5-мегабайтный случайно сгенерированный эталонный файл с контрольной суммой md5sum -копирует справочный файл к цели и генерирует проверку md5sum из цели, чтобы подтвердить успех чтения / записи - заполняет цель до емкости (100%) или останавливается при возникновении ошибки контрольной суммы -Как только скрипт останавливается естественным образом, он отображает целевой размер сообщения, использованные и свободные суммы.С помощью этого скрипта я пришел к выводу, что меня сорвал продавец eBay, который передал microSD 8 ГБ за 64 ГБ
источник
Можно написать последовательность чисел (каждая строка составляет 16 байтов), а затем проверить содержимое:
Затем проверьте пропустить == вывод (используя небольшую выборку пропущенных значений с меньшим количеством записанных записей), например пропустить = 9876 :
Или сделайте выборку из 20 мест с одним вкладышем:
of=tempFileOnSD
, если вы хотите избежать уничтожения данных, хранящихся на вашей карте (актуально, только если это не подделка)источник
seq -w 0 123456789012345 > /dev/yourSdHere
иseq -w 0 123456789012345 | cmp - /dev/yourSdHere
?