Обнаружение повреждения SD-карты

385
Ravi

Можно ли как-то обнаружить повреждение SD-карты во время работы?

У меня есть ситуация, когда обновление микропрограммы затрагивается из-за проблемы с SD-картой, однако это будет известно только после сбоя обновления. То, что я ищу, это тесты / любые утилиты, которые можно использовать для обнаружения повреждения SD-карты на ходу. Скажем, я запускаю проверку каждый день, чтобы узнать, исправна ли SD-карта или она повреждена? В случае повреждения я могу остановить обновление и рекомендовать замену SD-карты или предпринять другие действия.

Любой вклад с благодарностью. Достигнуть этого без физического извлечения SD-карты будет хорошо.

0

3 ответа на вопрос

1
Attie

Если вы заинтересованы только в обнаружении коррупции, то вы можете использовать *sumутилиту, например sha256sum.

В каталоге для защиты выполните следующее. Обратите внимание на использование find ... -print0и xargs -0для размещения путей с пробелами или другими специальными символами.

find . -type f -print0 \ | xargs -0 sha256sum \ > manifest.sum 

Затем используйте следующее для проверки содержимого файла.

sha256sum -c manifest.sum 

В выводе будут перечислены файлы с OKили FAILED, и возвращаемое значение будет 0(ноль), если все файлы проверены нормально, или ненулевое значение, если были ошибки.

Этот процесс проверит все файлы в текущем каталоге и оставит их manifest.sumпозади.

В идеале вы должны генерировать manifest.sumв источнике (например: во время сборки) и распространять его вместе с файлами - только с помощью проверки ( sha256sum -c) на целевом устройстве.


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

Во многих случаях полезно убедиться, что применяемое обновление является подлинным и предоставлено предполагаемым источником ... Если вы разрешите применить какое-либо обновление к системе, то откроете его для случайного (и потенциально повреждения), а также вредоносные обновления.

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

  • Вы можете избежать подписи только manifest.sumвышеизложенного (меньше затрат на обработку). Подписывая контрольные суммы, вы можете проверить содержимое каждого файла ... при условии, что, конечно, дайджест безопасен ... ( MD5 не будет хорошим выбором)
  • Однако может быть лучше распространять архив, который подписан (и, возможно, зашифрован) полностью и проверен до того, как он будет извлечен.

Поскольку выходные данные *sumутилит представляют собой текст ASCII, вы можете использовать gpg --clearsignдля подписи данные:

find . -type f -print0 \ | xargs -0 sha256sum \ | gpg --clearsign --default-key 7826F053 \ > manifest.asc 

На цели вы можете проверить подпись:

gpg --verify manifest.asc 

Затем, если и только если подпись действительна и имеет ожидаемое происхождение (вы должны будете использовать это --status-fdдля проверки), вы можете перейти к проверке содержимого файла:

gpg --decrypt manifest.asc \ | sha256sum -c - 

Обратите внимание, что он *sumдолжен быть в « конце » конвейера, чтобы убедиться, что вы видите код возврата ... в качестве альтернативы вы можете использоватьset -o pipefail


Я упомянул использование --status-fdвыше ... это мешает в оболочке, так что вы, вероятно, захотите написать приложение, чтобы справиться с этим более разумно ... Что-то вроде этого будет " работать " (т.е. доказывать свою точку зрения).

Отпечаток ключа, используемого для подписания манифеста: A5C929D6A230C02067720F1DB2B38B43C2ABEB33.

gpg --status-fd 3 --verify manifest.asc 3>&1 1>/dev/null \ | grep -Eq '^\[GNUPG:\] VALIDSIG A5C929D6A230C02067720F1DB2B38B43C2ABEB33 ' 
0
B.McCready

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

Для этого вы должны использовать команду badblocks, используя опции -n (чтобы указать, что проверка выполняется в режиме чтения-записи, неразрушающего режима) и -v (подробный режим). Убедитесь, что разделы, которые вы хотите проверить, НЕ смонтированы

в командной строке введите: mount и найдите запись устройства, соответствующую вашей SD-карте. Если он указан в списке, то сначала необходимо размонтировать файловые системы:

$ sudo umount /dev/sde1 

затем введите

$ sudo badblocks -n -v /dev/sde 

или же

$ sudo fsck /dev/sde1 

Обратите внимание, что блокировка может занять очень много времени. Я бы сначала попробовал fsck

Пожалуйста, включите важные шаги из вашей ссылки в вашем ответе. confetti 5 лет назад 1
Добро пожаловать в Супер пользователя! Пожалуйста, процитируйте основные части ответа по ссылочной ссылке (ссылкам), так как ответ может стать недействительным, если связанные страницы изменятся. DavidPostill 5 лет назад 0
В большинстве файловых систем это будет пропускать _any_ / _all_ повреждение, которое затрагивает содержимое файла, но пропускает метаданные файловой системы. Attie 5 лет назад 0
@ Atttie - это хороший момент, использование контрольной суммы, как предложил ксеноид, поможет справиться с повреждением содержимого файла. B.McCready 5 лет назад 0
Использование fsck и badblocks работает нормально. Не удалось обнаружить ошибку и операция завершена. Даже после того, как они показали все нормально, у меня была другая проблема. Предположим, я создал новый файл внутри SD-карты, а затем размонтировал и смонтировал его. Этот созданный файл не существует после монтирования! Точно так же я удалил существующий файл с SD-карты и сделал размонтирование и монтирование обратно. Удаленный файл появился снова после монтирования! Как это могло произойти? Это тоже повреждение SD-карты? Как обнаружить это состояние заранее? Ravi 5 лет назад 0
0
xenoid
  • Вычислите MD5 из файлов и сохраните его на карте:

    md5sum * >SDCardFiles.md5 
  • Для проверки используйте md5umв режиме «проверки» (он пересчитает MD5 файлов на карте и сравнит с MD5, хранящимся в файле).

    md5sum -c SDCardFiles.md5 

Примечание: вы должны находиться в том же каталоге, когда вы запускаете исходный файл, md5sumа md5sum -cпуть к файлам сохраняется в .md5файле.

Похожие вопросы