Scam-o-matic

Кажется, меня попытались надуть. Наверное, все уже слышали о «чудестных» карточках, у которых реальный размер здорово отличается от заявленного и сообщаемого карточкой.
Комплект из 5 microSD карт, по ‘якобы’ 4 GiB каждая недавно ко мне прихал, Реально там было около 115 MiB.
К счастью, денежки через диспут удалось вернуть, да и карточки остались у меня. Потому я стал думать, чем бы протестить эту хреновину.
Вообще, для теста разного рода скама есть две утилиты: h2testw and f3. Первая для винды, вторая для linux’a и прочих юниксов. Они как раз и находят реальный объем карты. Но у них есть пара недостатков. Можно бороду отрастить, пока они сканируют одну карту. А еще работают поверх файловой системы, что как по мне — так не совсем хорошо.
Потому, я решил изобрести свой костыль, с блэкджеком, который бы был побыстрее. Итак, ‘scam-o-matic’ в 200 строчках быдлокода на С.

Тупой как пробка и написанный пока f3 все еще сканировала одну карту. Моя софтина игнорирует файловую систему и пишет на карту псевдослучайные данные, до тех пор когда при считывании не напарывается на ошибку. Обычно это и есть граница хорошей памяти и пустоты. Дальше мы пустоту не сканируем, все равно с вероятностью 99,9% там ничего не будет. По просканированному региону мы вновь проходимся и верифицируем записанное, и если все в порядке (e.g. нет расхождений между первым и вторым проходом), то предлагаем вызвать fdisk и создать за пользователя раздел, который будет покрывать только ‘хорошее’, реальное место на карте.
Остается только отформатировать и сменить тип раздела cfdisk’ом если есть такая необходимость.
Страшненький исходный код валяется на github

Применение: scam-o-matic /dev/sdX
/dev/sdX — это путь к девайсу, который будем сканировать на профпригодность. Крайне не рекомендую использовать системный раздел или иной жесткий диск с важной информацией. Вытрет так, что даже ФСБ паяльником не достанет.

Программулина все напишет, обо всем спросит. Иногда первый проход на моих картах проходил дальше, чем
здоровая область, и это всплывало на втором проходе верификации. Повторный тест потом проходил нормально.
Веселитесь, и пусть вам эта программулина не понадобится никогда.

Пример вывода с замером времени:

necromant@ilwyn:~/Dev/software/scam-o-matic$ time sudo ./scam-o-matic /dev/sdf
!!!WARNING!!! I will now destroy all data on the device /dev/sdf
!!!WARNING!!! If you are ok with that - type OK & press enter
OK
Rock'n'roll, then!
Device reports to be 4194304000 bytes long.
Sectors are presumably 512 bytes each.
!!!WARNING!!! Last chance to stop. Are you sure? If so - type YES
YES
Starting a desructive surface test
Testing at position: 115343360

Ooops: 0xE383DF81 vs 0x8D5A303E

Mismatch at 115834880 detected
Sorry, dude, but it look like you've been scammed.
Or you might just have a old'n'corrupt card.
In case of scam you still have 115834876 usable bytes
That we can salvage. Let me double check the area for overwrites
Double checking at position: 113246208/115834876

Ooops: 0x202059EE vs 0x2122330B

Double checking at position: 115343360/115834876

Ooops: 0xE383DF81 vs 0x8D5A303E

The region looks fine. That's 0% of reported capacity.
Clearing first sector...
Would you like me to run fdisk and
Automagically create a partition, that will use only
the really avaliable space? (YEP/NOPE)YEP
Creating partition with 224191 sectors. Command line below
(echo n; echo p; echo 1; echo 2048; echo +224191; echo w)|fdisk /dev/sdf
Устройство не содержит ни верной таблицы разделов DOS, ни метки диска Sun, SGI или OSF
Building a new DOS disklabel with disk identifier 0x4fc8d399.
Changes will remain in memory only, until you decide to write them.
After that, of course, the previous content won't be recoverable.

Предупреждение: неверный флаг 0x0000 таблицы разделов 4 будет исправлен записью

Команда (m для справки): Partition type:
p primary (0 primary, 0 extended, 4 free)
e extended
Select (default p): Номер раздела (1-4, по умолчанию 1): Первый сектор (2048-8191999, по умолчанию 2048): Last сектор, +секторы or +size{K,M,G} (2048-8191999, по умолчанию 8191999):
Команда (m для справки): Таблица разделов была изменена!

Вызывается ioctl() для перечитывания таблицы разделов.
Синхронизируются диски.
I've done all I could. Good Bye.
Some rights reserved. (c) Necromant 2011

real 0m44.373s
user 0m1.748s
sys 0m0.666s

Добавить комментарий