关于Raspberry Pi上SD卡/microSD卡健康的所有信息

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

首先,我将深入介绍存储卡的工作原理,这样你就可以了解检查SD卡健康状态的可能性和局限性。 然后我将解释如何通过减少Raspberry Pi用户遇到的常见问题来保护你的microSD卡。我们还将深入探讨我们推荐的用于树莓派的最佳microSD卡品牌。 如果你愿意,你也可以进一步跳下去,只需获得检查当前microSD卡状态的Linux命令。

基础知识。微型SD卡内部

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

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

闪光灯

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

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

为了对浮动门进行编程,需要使用比正常读操作(例如3.3V)高得多的电压(例如10V)。为此,另外还使用了控制门(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合作

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

闪迪

建议使用TL;DR

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

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

三星

建议使用TL;DR

三星存储卡也经常被推荐。作为NAND闪存领域的市场领导者,三星可以将SD卡的所有组件完美地相互匹配,并拥有所有必要的信息,以获得可靠的产品。

金斯敦

TL;DR 建议

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

以下是 文章作者: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盘,因为闪存也被安装在其中。

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

3评论

  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卡,所以同样的程序也适用。

发表评论