随时断电可安全使用SD卡


10

我们正在开发一个小型嵌入式Linux系统(2.6.35英寸),该OS具有一个较小的内部NAND设备用于OS和应用程序(250-500Meg),以及一个带有8Gb SDHC SD卡的SD卡用于数据存储。

可以随时切断设备电源。

系统必须将数据存储到SD卡。这些数据非常重要……这是系统的全部目的。系统通常与远程位置的任何网络完全断开连接,并且每隔4-8周通过运动网检索一次数据。

目前,我们只是在SD卡上安装了VFAT。这主要是因为第一个测试客户端可以轻松地将数据手动复制到他们的Win7笔记本电脑上。

但是,我现在担心在错误的时间断电导致数据丢失只是时间问题。

配置这样的系统以防止数据丢失的最佳方法是什么?JFFS2听起来像我想要的数据写入方式(并且对性能的要求根本不高),但是使用block2mtd听起来很笨拙,等等。我也不确定卡的损耗平衡如何相互作用用它。

最好的方法是什么?

编辑

我现在正在考虑离开文件系统VFAT,并一次分配大小为0xFF的日大小文件,这应该大大限制了关机后再启动的风险。然后,我只能将记录追加到这些预先创建的块中,并且希望SD卡不是那么愚蠢,以至于它们会将擦除/耗损级别写入到0xFF区域中。

我可以使用noatime,但是是否有等效的VFAT nomtime来防止写入修改后的时间字段?我需要某种方法来阻止任何元数据更新,直到创建新的一天的文件为止。

编辑2

电子堆栈交换上的某人提醒我,NAND上也有ECC数据,因此无法防止擦除。

那么,通过block2mtd进行JFFS2在这种情况下是否合适?

编辑3

比我想的还要糟。即使您将完全相同的内容写入磁盘,我拥有的SD卡也会擦除数据块。擦除块为64KB,太大,无法完全延迟写入。我将在一种日志中将多达128KB的数据存储在NAND闪存(我可以控制其写入行为)中,然后将128KB的块写入SD卡上VFAT分区中的128KB对齐的文件中(在(如果其他SD卡具有128KB擦除块)。


1
“希望SD卡不是那么愚蠢……” <--- ROFLOL。不见得!
derobert

在找到解决问题的完整解决方案之前,请sync在每次写入SD卡后使用命令,它会在更改/创建位后立即将位直接写入而不将其存储在RAM中,因此您所做的更改至少应存储在卡上并且不会因功率损耗而消失。
Hanan N.

sync这可能会使情况变得更糟,因为这会增加元数据更新中的时间。
Ben Voigt 2013年

Answers:


5

好了,解决此问题的方法是解决“随时可以断电”的问题。补充一分钟的电池电量是不可能的吗?

另外,也许您可​​以使用两个SD卡。将数据写入一张卡,同步,再写入另一张卡。您的数据的每个块都需要一个校验和和块号,但是即使出现一些非常不幸的电源故障,其中一张卡也应该是正确的。

您的基本问题将是SD卡的耗损平衡,而AFAIK取决于SD卡的供应商(甚至可能是批次,他们可以随时更改它)。它可能无法正确处理断电。并且取决于它的功能,这可能不仅仅意味着破坏您正在写入的块。

  1. 假设普通卡很小-3个(闪存)块。块1收到的写次数多于2或3。我将按编号称物理块,并按字母称呼逻辑块A,B,C。现在,A = 1,B = 2,C = 3。
  2. 您发出写入以阻止A。SD卡就像啊哈!我们需要在此处进行损耗平衡,否则块1将在2和3之前磨损。它决定交换块1和2。
  3. 它将块1读入RAM位置i(在SD卡上,而不是系统RAM上)。它会更新您要更改的零件。
  4. 它将块2读入RAM位置ii
  5. 擦除块1
  6. 它将RAM位置ii写入块1。
  7. 它更新映射表说B = 1
  8. 擦除块2。
  9. 它将RAM位置i写入块2。
  10. 它更新映射表说A = 2

当然,“更新映射表”并不总是那么简单。而且5到10的顺序可能会有所不同(如果它们全部完成,没关系,当然,擦除必须在写入之前进行)。但是发生电源故障,您不仅可能损坏了A(如您所料),而且还损坏了B。或者,如果在映射更新过程中发生电源故障,谁知道会导致哪种损坏。


1
这些电池必须在相对恶劣的环境中生活许多年,安装后它们将被运送到我们不希望使用电池的各个国家。在使用电池之前,我们可能会放弃MMC / SD并构建自己的NAND闪存解决方案。
darron 2011年

好吧,在我们的案例中,“解决“可以随时切断电源”的解决方案”归结为“阻止卡车司机睡在方向盘上并进入我们的设备。” 实际上,“一辆卡车撞坏了”实际上是最常见的故障模式。
SF。

1
不需要一分钟的电池电量。安全卸下SD卡所需的电量应该在电容器可以存储的范围内。
Ben Voigt 2013年

4

在electronics.stackexchange.com中讨论了类似的问题:如何保护SD卡免于意外的电源故障?

这在工作的侧身回答串联与软件解决方案是看硬件(有上ESE这个问题太,但现在我不能找到它,它是不严格有关SD卡,只是有关设备失去权力以及如何检测到它并对其采取行动)。

简短的故事是:您可能没有电池电源,但是电源中有一些相当大的电容器来平滑电源。基本上,电源不只是熄灭。电压逐渐减小。可能有一个掉电保护IC /电路,当电压降至某一点以下时,该信号会在嵌入式系统上发出RESET信号。PC主板也有这些主板,它们会响应来自PSU的“ POWEROK”信号。这意味着,当电源关闭时,计算机将在电压下降到安全水平以下之前被强制停止几毫秒。在这段时间内,SD卡等外围设备仍处于开机状态,但是计算机不再进行任何事务。

SD卡很可能电源关闭之前有足够的时间来完成任何待决事务,包括损耗均衡。用足够大的电容器或在SD卡附近使用一个电容器来改善电源,可以帮助确保这一点,但是您始终可以按原样尝试使用平台。它很可能会保留足够长的时间。

如果问题的硬件方面没有问题,则可以解决仅软件方面的问题。derobert使用两张卡进行冗余的想法也不错,并且使用像VFAT这样的标准文件系统,不会出现混淆卡损耗平衡算法的风险。

无论如何,很可能您不会遇到太多问题。假设卡上的一个块可以保存100次写入(保守-但是要设法获得高质量的卡!),并且使用8GB卡,则在第一个块消失时您将写入800GB(当然,从统计上来说)。


之所以开始提出这个问题,是因为在关闭电源事件中我已经严重损坏了SD卡。实际上,很多时候。也许20个电源故障事件中就有1个是灾难性的,可能4个中有1个至少造成了一些损坏。我最终改变为将一天的数据存储在内部NAND闪存中,并在午夜(大约1秒钟的操作)复制到SD。我希望将来能有所改善。我已经在导轨上安装了价值400uF的盖帽……显然,这还不够……也许电源不足的处理不正确。
darron 2012年

发生率很高!方法,现在该该拿示波器示波器的探头了,看看实际情况。尽管您可能可以在软件中解决它,但是就功耗而言,最好的方法是确保您没有硬件故障。也许您可以对冲您的赌注,也可以在electronics.stackexchange.com上提问?
Alexios 2012年

@darron,您最终针对SD卡存储问题采用了什么解决方案?您是否仍在写NANDFlash,然后每天复制一次?我有一个使用SD卡作为主要RFS(没有单独的NANDFlash)的设计,并且在有或没有突然断电的情况下都遇到数据损坏问题。
fred basset 2014年

4

我们的SD,ext2根文件系统因意外电源损坏而出现问题。首先,我们使系统在只读根目录下运行。由于我们需要一些可写的存储(但不是数据记录),因此我们将第二个分区设置为可写。为了最大程度地减少因意外电源故障而造成的FS损坏,我们将其制作为ext3分区,即使这会导致对该卡进行至少两次物理写入。这种组合(但我承认,与数据记录器相比,第二分区的写入很少),似乎没有问题。至今。(系统在专业设施中安装约30个月)


3

对于具有断电和整体数据安全性的环境中的数据安全性,您应该考虑更多的要点。

不使用MLC单元进行存储,只有SLC的数据保留时间足够。这样,那些SLC卡就可以具有智能固件,某些在任何状态下都不能因断电而损坏。他们通过测量来识别掉电,并确保最后一块被完全写入。

这些卡比MLC单元更贵,速度也更慢。看到像swissbit这样的卡商。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.