我想追踪/注册我的系统(一个树莓派)何时被关闭,通常是由于突然断电导致。
我想通过每10分钟记录一次心跳到SD卡来实现它-所以每10分钟它都会去SD卡并在文件中写入当前的时间/日期。这样做长期会损坏SD卡吗?
如果只有100k个写入循环次数,那么几年后就会有坏块。但我已经读到有防止它的电路-它会防止坏块吗?将日志分布在几个块中是否更安全?
谢谢
我想追踪/注册我的系统(一个树莓派)何时被关闭,通常是由于突然断电导致。
我想通过每10分钟记录一次心跳到SD卡来实现它-所以每10分钟它都会去SD卡并在文件中写入当前的时间/日期。这样做长期会损坏SD卡吗?
如果只有100k个写入循环次数,那么几年后就会有坏块。但我已经读到有防止它的电路-它会防止坏块吗?将日志分布在几个块中是否更安全?
谢谢
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分钟记录一次日志就会消耗128 KiB擦除扇区,每160分钟一次。如果卡是8 GiB卡,则大约有64k个扇区,因此每20年卡都会被使用一次。如果卡耐受1000次写入循环,则可用时间为20,000年...
上述计算假定了完美的磨损平衡和非常高效的文件系统。但是,安全系数1,000应该足够。
当然,这很容易被破坏。最简单的方法之一是忘记使用noatime属性挂载磁盘。然后文件系统将更新文件访问时间,这可能导致每次访问文件(即使只读)时进行一次写操作。或者操作系统正在将虚拟内存交换到卡上。
最后一个因素也是运气。现代SD卡有不幸死亡的倾向。即使是相当知名的制造商也有很多问题。如果您杀死了一张卡,它不一定是因为达到了磨损极限。如果卡已经磨损,仍然可以读取。如果完全死亡,则是由于其他原因(静电,某个地方的小裂纹)。