关于 Raspberry Pi 上 SD 卡的健康状况

SD 卡健康状况

SD卡是--紧挨着电源--Raspberry Pi的一个重要的附加组件。监控它的健康状况对于确保你的Raspberry Pi操作系统的顺利运行和良好的用户体验非常重要。这篇文章将告诉你如何检查和监测你的microSD卡的健康状况的几种方法。

首先,我将深入介绍存储卡的工作原理,让你了解检查 SD 卡健康状况的可能性和局限性。

然后,我将介绍如何通过减少 Raspberry Pi 用户遇到的常见问题来保护 microSD 卡。我们还将介绍我们推荐的适用于 Raspberry Pi 的最佳 microSD 卡品牌。

如果你愿意,也可以跳到下面,直接获取Linux命令来检查当前microSD卡的状态。

基础知识。微型SD卡内部

内嵌的微型存储卡
图片。SD卡内部的插图。microSD卡也有类似的结构。图片来源。 CC-BY-SA Korpsvart, 维基共享资源

microSD卡包含一个闪存芯片(在图片的左边),和一个微控制器(在图片的右边,通常基于ARM)。

闪光灯

闪存通过以下方式存储信息 "诱捕 "电子这是用高电压通过非导体 "注入 "到所谓的 "非导体 "中。 浮动门(**).因此,电子是一个晶体管的一部分,它可能允许也可能不允许连接的电流流动,这取决于浮动门的电荷。理论上,它们不能流走。 因为浮动门是电隔离的.这意味着即使关闭电源,信息也不会丢失。

信息总是在源极(S)和漏极(D)之间读取。引入浮动栅极的电子增加了例如晶体管的阈值电压,从那里开始会有电流流动。然后,晶体管在正常的读取电压下阻断(不导电)。

在对浮动栅极进行编程时,需要比正常读取操作(如 3.3 V)高得多的电压(如 10 V)。为此,控制栅极(V1/V2/V3)发挥了关键作用。

为了擦除所有内容,控制栅极通过施加高负压将电子赶出浮动栅极。

microSD卡中使用的NAND闪存组件将单个存储晶体管分成页,并将若干页分成块。一个页面有512到8192个字节,一个块最多可以包含256个页面(因此,在8kB的页面大小下,总共有2048kB)。

写入(逻辑 "1")可以按位或至少按字节/字节顺序进行。擦除(逻辑 "0")只能按顺时针方向进行。如果有任何未更改的信息,则必须重新编程。

由于编程和擦除的原因,闪存的使用寿命有限,我们以擦除周期来计算。

寿命有限的原因是绝缘氧化层受损,该层保护浮动栅极,防止高电压造成的电荷泄漏。一旦该层导电,存储单元就无法保存更多信息。

旁观者清。多层次细胞记忆单元

最初,只有两种电荷状态(1比特的信息)。现在,由于每个晶体管有多个浮动栅极,多级单元存储单元可以存储不同的电荷状态,因此每个存储晶体管可以存储多个比特。在读出过程中,系统会评估施加的电流在晶体管中的传导情况。

一方面,这使得大大增加存储单元的密度成为可能,但另一方面,读出速度较慢,存储单元对电荷损失的位错误反应更加敏感。对于单级单元,可以进行100,000到1,000,000次的写入-擦除循环,对于TLC(三级单元,每个存储单元有三个比特),可以进行大约1000次写入-擦除循环。

这就是工业SD卡通常具有较低的内存密度,并使用SLC(单层单元)的原因,以获得更好的数据完整性。.

控制器

控制器的任务是管理闪存,特别是执行 磨平和读错校正.microSD卡的性能和寿命决定性地取决于控制器中使用的算法。

由于上述浮动栅极的绝缘氧化层的损坏,闪存不能按要求频繁地进行重写。为了避免对特别频繁使用的个别区域的损坏。 控制器改变物理分配给可由文件系统进行逻辑寻址的块(=损耗均衡)。

这种物理分配的变化也是写测试SD卡的原因(通过写和读的坏块工具等),实际上不能识别真正的坏块,也不能让你在操作系统/文件系统层面上避免它们。只有microSD卡内的闪存控制器知道在任何给定的时刻,哪个区块被写入/读出,而且正如所讨论的那样,这可能会随着时间而改变。

有缺陷的块(坏块)已经存在于全新的闪存中。这些有缺陷的块被标记在闪存的一个特殊区域。

单个区块的纠错信息也被管理,这样可以通过校验来纠正读取错误。控制器将有集群读取错误的块添加到坏块列表中,并转移逻辑块的实际物理分配。

microSD卡通常有--取决于制造商--大约10%的备用容量,可以用好的 "储备块 "交换坏的块。

肮脏的小秘密。闪存问题

删减只是顺时针方向的

数据只能被逐块擦除。擦除会给存储单元带来压力,并缩短它们的寿命--新的坏块被创造出来。

出厂的有缺陷的块状物

闪存在出厂时已经带有缺陷块。在操作过程中,会有更多的有缺陷的块(坏块)加入。因此,控制器试图通过损耗均衡来尽可能地均匀地写入/擦除块。

MLC和TLC特别敏感

多级单元存储单元(MLC)减少了擦除周期的数量,从而降低了长期可靠性。

阅读打扰

有一种现象我还没有提到,但却特别敷衍,那就是 阅读打扰.即使只是从卡上读取,它也可以--只是通过读取--导致同一区块中相邻的存储单元改变其程序。这种情况发生的概率在读了几十万次后会急剧增加。

为了避免读取干扰,控制器记录了对一个区块的访问次数,以便在超过阈值时将其整体复制到一个新的位置,并删除原始区块。此后,该块可以再次被重新使用。

所有这些都是控制器必须弥补的,以便向我们假装它是一张外表 "完美的存储卡",而它的内部看起来却并不完美。

最后但并非最不重要的是,由X射线写入的比特可能会被无意中抹去。在这里,只有对X射线安全的卡片设计才能确保数据保持完整。

制造商和选择一个好的卡

微控制器和闪存设备以及 microSD 卡成品可以来自不同的制造商--示例照片中的松下 SD 卡采用了三星闪存。控制器是日本制造的。

目前有四家制造商生产 NAND 闪存设备:

  • 三星<-市场领导者
  • 东芝
  • IM闪存技术(美光科技和英特尔的合资企业)。
  • 海力士与Numonyx合作

东芝和三星生产所有芯片中的大部分。

闪迪(推荐)

闪迪和东芝在闪存制造方面有一家合资企业。然而,在2009年,闪迪将晶圆厂的权利转让给了东芝,成为东芝的子公司。 无晶圆厂闪存制造商.它们在存储器开发方面仍在合作。闪迪、东芝和松下是 1999 年推出的 SD 标准的创始人。闪迪还创建了 microSD 标准。

我们长期以来一直依赖闪迪品牌,到目前为止,我们在这方面的经验非常好。

三星(推荐)

我们还推荐三星存储卡。作为 NAND 闪存领域的市场领导者,三星可以将 SD 卡的所有组件完美地相互匹配,并掌握所有必要的信息,从而提供可靠的产品。

金士顿(不推荐)

在一个关键项目中,我们对 128 GB 金士顿存储卡的可靠性有过一次糟糕的经历。金士顿没有自己的工厂,而是从其他闪存制造商那里购买多余的容量。因此,无法保证稳定的性能。

以下是 文章作者:Bunny Huang 在这种情况下也很有意思。

东芝

东芝作为全球DRAM市场的#2,也销售自己的存储卡产品。闪迪和东芝与松下一起,是1999年推出的SD标准的创始人。到目前为止,我们还没有使用东芝卡的经验。

创维/硅宝

我们也使用过创见和硅动力的卡,特别是低价位的卡。这些卡基本上都很好,但我们看到创见的退货/缺陷比闪迪的高。因此,对于关键项目,我宁愿推荐闪迪/三星。

选择一个好的存储卡

为了选择一个好的存储卡,首先要做的是选择制造商。我们建议 三星或闪迪,可能还有东芝,入围名单。

其次,内存级别也很重要。该级别表示逐块写入的最快速度。它不是分散随机存取写入的写入速度,后者在实际应用中更有意义。

更高等级的卡更加昂贵,但由于性能的显著提高而被推荐。我们通常运送10级卡。

eLinux.org上的这个概述您可以检查合适的存储卡是否与您的 Raspberry Pi 兼容。重要提示:他们会不断修改 Raspberry Pi 固件,以提高与存储卡的兼容性,避免数据损坏。

你应该从值得信赖的来源订购 - 例如。 我们得到了我们的闪迪microSD卡 直接从Raspberry Pi Trading,以及有信誉的大型德国分销商处购买。在亚马逊上,一定要直接从亚马逊订购,而不是从市场零售商那里。

某些信息(cid, csd, date, manfid, oemid, serial)的microSD卡可以用Linux读取,以检查你是否收到正确的制造商。以创见卡为例。

cd /sys/class/mmc_host/mmc?/mmc?:*
echo "man:$(cat manfid) oem:$(cat oemid) name:$(cat name) hwrev:$(cat hwrev) fwrev:$(cat fwrev)"
 man:0x000074 oem:0x4a60 name:USD hwrev:0x1 fwrev:0x0
echo "serial:$(cat serial) mdt:$(cat date)"
序号:0x401e39f2 mdt:03/2017

制造商ID (芒菲德)是由 SD-3C有限责任公司以及OEM/应用ID (oemid).的。 oemid 识别卡片的OEM和/或卡片的内容。

产品名称(名称)是5个字符的长度(ASCII)。 hwrev 是硬件版本,和 fwrev 固件修订版。它们共同构成了产品版本(hwrev.fwrev).

ǞǞǞ 串行 是 microSD 卡的序列号,是一个 32 位字段,读作无符号整数。

ǞǞǞ mdt (制造日期)表示卡片的制造时间--年和月。

您可以将数值与网站进行比较,以发现假冒 microSD 卡的欺诈行为。推荐阅读 兔子的博客文章(一)本条(二).

稳定的 人/oem 一个品牌的组合表示一个控制良好和一致的供应链。例如,闪迪公司有以下组合 用于eLinux.org维基中的所有条目: man:0x000003 oem:0x5344.其他品牌(如创见)的供应商各不相同,因此质量不一定稳定。

避免操作过程中的数据损坏

microSD 卡是 Raspberry Pi 的 "硬盘"。在正常的 Linux 配置下,它像普通硬盘一样工作 - 读取和写入都会发生。Linux 会将信息记录到许多日志文件中,并更新文件访问时间。因此,数据经常会发生变化。这正是 microSD 卡的设计初衷。

提示#1:正确关闭Raspberry Pi并使用良好的电源

你也不会随便拔掉一台Windows电脑的插头。有了Linux电脑,尤其是支持microSD卡的Raspberry Pi's,这只是一个时间问题。 在断电时发生数据损坏之前.

Linux 具有读写缓存,可加快文件操作速度。当你拔掉 Pi 的电源时,可能会丢失写缓存中尚未存储到 microSD 中的信息。

如前所述,microSD控制器在运行时主动转移数据,以实现磨损均衡,并避免读取干扰。这发生在Linux系统不知情的情况下("透明")。而且根据制造商的情况,或多或少都是保守的。同样在这里--特别是在写操作期间- 数据损坏和损失可能发生。

所以你应该确保在关闭你的Pi后,Raspberry Pi的ACT-LED停止闪烁,然后才拔掉电源。

坏的电源也可能导致以下问题 断电 (电压过低)。如果有疑问,请使用Raspberry Pi Trading推荐/提供的电源。

尖端#2只读系统与覆盖物

只读系统并不能保护SD卡免受读取干扰,从而避免因必要的擦除周期而导致的老化。然而,这比主动写入时要慢得多。

只读文件系统也有其他优点,例如,在启动时减少文件系统的检查。

尤其是嵌入式系统,即在应用中具有特定用途的系统(如数字标牌),并不一定需要不断安装新软件和在现场保存精确的日志。您可以通过网络将日志发送到中央服务器(如有必要,可延迟发送),系统更新时,系统可进入维护模式以应用更新。

下面是Raspbian所基于的Debian项目的一些信息。 https://wiki.debian.org/ReadonlyRoot.

使用 RAM 磁盘覆盖(在 tmpfs 中),系统仍可写入日志文件或更改文件。你可以定期将 RAM 磁盘覆盖与 SD 卡上专门指定的分区同步。在使用 RAM 磁盘时应小心谨慎,以免内存溢出(由于日志文件的存在),当然也会减少可用于正常活动的 RAM 内存。

我们使用这种技术 使用我们的产品Anonymebox在这种情况下,必须假定用户只是将其从插座上拔下来。

你是否在寻找一个合作伙伴,为你的嵌入式Raspberry Pi项目实现一个可靠的只读解决方案? 我们(作为pi3g e.K.)提供咨询和开发服务在硬件和软件方面。

提示#3 减少写操作

特别是在较早的内核中,Linux会根据POSIX标准更新每次文件访问的访问时间。 这意味着,每一次读操作都会自动导致一次写操作.有可能明确地设置 不时间 /etc/fstab 如果尚未设置(Raspbian 似乎会自动设置)。

更多相关信息 亲属时间 不时间

使用掩码禁用系统日志。

systemctl mask systemd-journald.service
创建了/etc/systemd/systemd-journald.service到/dev/null的符号链接。
sudo systemctl mask rsyslog.service
创建了从/etc/systemd/system/rsyslog.service到/dev/null的符号链接。

其他应用程序创建的日志,以及禁用这些服务的后果(例如,某些服务不再启动),当然也应该详细检查。

调换文件。

如果没有足够的RAM,Linux会将各个RAM区域移到SWAP文件中。(考虑使用有足够RAM的Raspberry Pi 4,例如 Pi 4 / 4 GBPi 4 / 8 GB 以满足您的使用要求)。使用以下命令可以检查 SWAP 文件的状态:

sudo systemctl status dphys-swapfile
● dphys-swapfile.service - LSB:自动生成并使用交换文件
已加载:已加载(/etc/init.d/dphys-swapfile)。
活动:自 Sat 2017-07-01 19:11:57 UTC起活动(退出);8分钟前
进程。498 ExecStart=/etc/init.d/dphys-swapfile start (code=exited, status=0/SUCCESS)

您可以使用以下命令禁用 SWAP:

sudo systemctl disable dphys-swapfile

总结

持续使用的microSD卡使基于Raspberry Pi的系统的长期可靠性受到严峻考验。

通过使用合适的电源、带覆盖层的只读系统、持续减少写入操作以及选择知名品牌的优质 SD 卡,可以提高长期稳定性。

如果你的基于Raspberry Pi的项目/产品需要专业支持,请联系我们进行免费的初步咨询。.

笔记

(*) 备注: Raspberry Pi 3, 3B+和4可以从USB媒体,或通过网络(以太网)启动,无需microSD卡。

特别是通过网络启动时,我们建议安装带有特殊固件的 microSD 卡,因为启动代码中的超时错误会导致无法稳定启动(Raspberry Pi 3B)。

上述关于闪存结构的解释同样适用于 U 盘,因为它们也依赖于闪存。

(**) 注越来越多地使用的浮动门的替代品是电荷捕获闪存,其功能原理是相同的。电荷捕获闪存单元可以实现更高的存储密度。

如果您想了解有关 Raspberry Pi SD 卡的更多信息,请查阅 我们的许多文章都涉及这一主题.

5评论

  1. Pete 在10 月 13, 2021在8:27 下午

    你好。
    有什么办法可以检查SD卡中的控制器有多少个坏锁?
    通过定期检查,我想建立一个趋势图。
    谢谢你的工作。
    注意到。
    彼得

    • unintell 在11 月 9, 2022在3:55 下午

      对于普通的消费级SD卡来说,这是不可能的,除非你有特定使用的控制器的MP工具,而这是不可能的。
      如果卡是工业级的,并且有SMART信息(在其各自的数据表中指定),那就有可能,然后你可以写一些代码来读出SMART数据。
      但这仅仅是PITA的开始。没有SD卡健康监测的工业标准,所以每个制造商都以不同的方式实现协议,而且并不总是公布。
      有些制造商的SMART报告只给你一个卡片剩余寿命的百分比数,有些则提供更详细的信息,包括保留块、初始坏块、后来的坏块、最大/最小/最大擦除数、P/E寿命等等。
      目前我已经能够读取Lexar、ADATA、ATP、Sandisk、Apacer、Metorage、Delkindevices、SiliconePower、Swissbit和其他一些公司的卡的健康统计数据。
      我的动机是破解Foresee生产的廉价二手工业卡的SMART信息,目前我已经能够破解MPS/M9M/M9H/D7D/X52/X53系列卡,我还在研究其他一些型号。

      我希望尽快有一个SD卡智能信息的工业标准。我还发现,有些SD卡的TBW寿命比许多SSD还要高,这很有趣。

      • unintell 在11 月 9, 2022在4:03 下午

        哦,我忘了说,大多数(但不是全部,该死)卡通过向卡发送CMD56命令和一个32位的int参数来提供SMART信息,你需要从数据手册和各自的数据格式中找到那个神奇的数字来读取数据。如果你拿到了数据表,那么你基本上就完成了,请查看github上的sdmon工具的示例代码。
        如果数据手册没有出来,或者神奇的数字没有公布,你将不得不遍历整个31位(最低位总是1)的int空间来强制破解它,这可能需要12小时到半个月的时间,这取决于你的运气。我希望没有邪恶的制造商以0xF_______ 开始他们的神奇数字。目前,我设法破解/收集到的所有魔法号码都以0x1_______ 开始。

        有些卡需要更复杂的程序来读出SMART信息,如Apacer,但好在他们在数据手册中提供了必要的信息。Apacer公司也为其他一些品牌生产OEM卡,所以同样的程序也适用。

  2. [...] SD 卡的健康状况(包括保养 SD 卡的最佳实践!) [...] SD 卡的健康状况(包括保养 SD 卡的最佳实践!) [...

  3. [关于 Raspberry Pi 上 SD 卡/microSD 卡的健康状况 [...]

发表评论