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

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

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

3 ответа3

1

Если вы заинтересованы только в обнаружении коррупции, вы можете использовать утилиту *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
  • Вычислите MD5 из файлов и сохраните его на карте:

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

    md5sum -c SDCardFiles.md5
    

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

0

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

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

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

$ sudo umount /dev/sde1

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

$ sudo badblocks -n -v /dev/sde

или же

$ sudo fsck /dev/sde1

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .