SD卡写入限制 - 数据记录

时间:2014-06-23 00:07:33

标签: raspberry-pi hardware sd-card fat

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

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

如果只有10万个写入周期,它会在几年内出现坏块。但是我已经读过它的电路来阻止它 - 它会阻止坏块吗?将日志分布在几个区块中会更安全吗?

由于

1 个答案:

答案 0 :(得分:20)

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

  • SD卡类型(SLC / MLC)
  • SD卡控制器(耗损均衡)
  • SD卡尺寸
  • 文件系统
  • 运气

如果我们看一下闪存芯片,它会被组织成扇区。扇区是可以完全擦除的区域(实际上复位到只有1&s的状态),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次写入周期,那么它将持续2万年......

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

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

最后但并非最不重要的因素是运气。现代SD卡存在着因其他原因而死亡的不幸倾向。即使是非常知名的制造商的柠檬数量也不是很少。如果你杀了一张牌,那不一定是因为磨损限制。如果卡已经磨损,它仍然可读。如果它已完全死亡,它已经死于其他东西(静电,某处的小裂缝)。