有什么方法可以在运行时检测到 SD 卡损坏?
我遇到过一种情况,由于 SD 卡问题,固件升级受到影响,但只有在升级失败后才会知道。我正在寻找的是可用于随时检测 SD 卡损坏的测试/任何实用程序。比如说,我每天都会检查 SD 卡是否正常或已损坏?如果损坏,我可以暂停升级并建议更换 SD 卡或采取其他措施。
非常感谢您的意见。无需物理移除 SD 卡即可实现此目的。
答案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
上面使用...它在 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