检测 SD 卡损坏

检测 SD 卡损坏

有什么方法可以在运行时检测到 SD 卡损坏?

我遇到过一种情况,由于 SD 卡问题,固件升级受到影响,但只有在升级失败后才会知道。我正在寻找的是可用于随时检测 SD 卡损坏的测试/任何实用程序。比如说,我每天都会检查 SD 卡是否正常或已损坏?如果损坏,我可以暂停升级并建议更换 SD 卡或采取其他措施。

非常感谢您的意见。无需物理移除 SD 卡即可实现此目的。

答案1

如果您只对检测损坏感兴趣,那么您可以使用*sum实用程序,例如sha256sum

在要保护的目录中,运行以下命令。请注意使用find ... -print0xargs -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上面使用...它在 shell 中会变得混乱,所以你可能需要编写一个应用程序来更合理地处理这个问题...像这样的事情会“工作“(即:证明一个观点)。

用于签署清单的密钥的指纹是:A5C929D6A230C02067720F1DB2B38B43C2ABEB33

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

答案2

  • 计算文件的 MD5 并将其存储在卡上:

    md5sum * >SDCardFiles.md5
    
  • 要检查使用md5um“检查”模式(它将重新计算卡上文件的 MD5 并与文件中存储的 MD5 进行比较)。

    md5sum -c SDCardFiles.md5
    

md5sum注意:运行初始文件和文件时必须位于同一目录中,md5sum -c因为文件的路径保存在.md5文件中。

答案3

检测损坏的部分取决于(一点点) SD 卡最初的格式,但你可以尝试在其上运行 fdisk 或 badblock。请参阅验证 micro SD 是否已损坏

您应该使用 badblocks 命令来实现此目的,并使用选项 -n(指定检查以读写、非破坏性模式进行)和 -v(详细模式)。确保您要检查的分区未挂载

在命令提示符下,输入:mount 并查找与您的 SD 卡相对应的设备条目。如果列出,则必须先卸载文件系统:

$ sudo umount /dev/sde1

然后输入

$ sudo badblocks -n -v /dev/sde

或者

$ sudo fsck /dev/sde1

请注意,坏块可能需要很长时间。我会先尝试 fsck

相关内容