11

我想在我的系统(Raspberry Pi)关闭时进行跟踪/注册,通常是由于突然断电。

我想通过每 10 分钟将心跳记录到 SD 卡来做到这一点 - 所以每 10 分钟它会去 SD 并将当前时间/日期写入文件中。从长远来看,这会损害 SD 吗?

如果它只有 10 万个写入周期,那么它会在几年内出现坏块。但我读过有电路可以防止它 - 它会防止坏块吗?将日志分布在几个块中会更安全吗?

谢谢

4

1 回答 1

29

这个问题的一般答案是一个强有力的“它取决于”。(实际答案是你已经拥有的;如果你的文件系统参数没有错,那么在这种情况下你有很大的余量。)这取决于以下几点:

  • SD卡类型(SLC/MLC)
  • SD卡控制器(磨损均衡)
  • SD卡大小
  • 文件系统
  • 运气

如果我们看一下闪存芯片,它被组织成扇区。扇区是可以完全擦除的区域(实际上重置为只有 1 的状态),对于 SD 卡,通常为 128 KiB。零可以逐位写入,但写入 1 的唯一方法是擦除扇区。

扇区擦除的次数是有限的。每次在同一扇区上执行擦除操作都会花费更长的时间,并且写入每个单元的值存在更多不确定性。给卡的写入限制实际上是单个扇区的擦除次数。

为了避免过快达到这个限制,SD 卡有一个控制器来处理磨损均衡。基本思想是,卡对用户透明地改变了哪些扇区被使用。如果请求相同的内存位置,可能会在不同的时间映射到不同的扇区。基本思想是卡有一个空扇区列表,当需要一个时,它会使用最少使用的一个。

还有其他算法。控制器可以跟踪扇区擦除时间或扇区上发生的错误。不幸的是,卡制造商通常不会过多地介绍确切的算法,但有关概述,请参阅:

http://en.wikipedia.org/wiki/Wear_leveling

有不同类型的闪存芯片可用。SLC 芯片每个存储单元仅存储一位(0 或 1),MLC 单元存储两位或三位。自然,MLC 芯片对老化更为敏感。三位(八级)单元可能无法承受超过 1000 次写入。所以,如果你需要可靠性,尽管 SLC 卡价格更高,

由于磨损均衡将磨损分布在卡片上,因此较大的卡片比小卡片承受更多的扇区擦除,因为它们有更多的扇区。原则上,具有 100 000 次写入周期的 4 GiB 卡在其生命周期内将能够承载 400 TB 的数据。

但是为了让事情变得更复杂,文件系统与此有很大关系。当一小块数据被写入磁盘时,会发生很多不同的事情。至少将数据附加到文件中,并更改相关的目录信息(文件大小)。对于典型的文件系统,这意味着至少有两个 4 KiB 块写入,其中一个可能只是追加(不需要擦除)。但是可能会发生很多其他事情:写日记,块变满,等等。

有一些文件系统已经调整为与闪存设备一起使用(JFFS2 是最常见的)。据我所知,它们都针对原始闪存进行了优化,并负责磨损均衡并使用位或八位字节级别的原子操作。我不知道有任何针对 SD 卡优化的文件系统。(也许有学术兴趣的人可以创建一个考虑到卡的磨损均衡系统。这会产生一篇不错的论文,甚至一些。)幸运的是,通常的文件系统可以调整为更兼容(更快,领先磨损)与 SD 卡通过调整文件系统参数。


既然物理磁盘上有这两层,几乎不可能跟踪已经执行了多少次擦除。其中一层非常复杂(文件系统),另一层(磨损均衡)完全不透明。

所以,我们可以做一些粗略的估计。让我们猜测一个小的写入平均会使两个 4 KiB 块无效。这样每 10 分钟记录一次,每 160 分钟消耗 128 KiB 擦除扇区。如果卡是 8 GiB 卡,它有大约 64k 扇区,所以卡每 20 年通过一次。如果该卡能承受 1000 次写入周期,它将可以使用 20 000 年......

上面的计算假设完美的磨损均衡和非常有效的文件系统。但是,1 000 的安全系数应该足够了。

当然,这很容易被破坏。最简单的方法之一是忘记使用noatime属性安装磁盘。然后文件系统会更新文件访问时间,这可能导致每次访问(甚至读取)文件时都会写入。或者操作系统正在将虚拟内存交换到卡上。

最后但并非最不重要的因素是运气。现代 SD 卡不幸地倾向于死于其他原因。即使是相当知名的制造商的柠檬数量也不是很少。如果你杀了一张卡,那也不一定是因为磨损限制。如果卡磨损,它仍然可以读取。如果它完全死了,它是死于别的东西(静电,某处的小骨折)。

于 2014-06-23T07:11:52.273 回答