我们正在开发一个小型嵌入式 Linux 系统 (2.6.35-ish),具有用于操作系统和应用程序的小型内部 NAND 设备 (250-500Meg) 以及用于数据的带有 8Gb SDHC SD 卡的 SD 卡。
设备的电源可以随时切断。
系统必须将数据存储到SD卡上。这些数据非常重要......它是系统的全部目的。这些系统通常与远程位置的任何网络完全断开连接,并且每 4-8 周通过 slimenet 检索一次数据。
目前,我们只是在 SD 卡上添加了 VFAT。这主要是为了让第一批测试客户可以轻松地将数据手动复制到他们的 Win7 笔记本电脑上。
然而,我现在担心,错误的时间断电导致数据丢失只是时间问题。
配置此类系统以防止数据丢失的最佳方法是什么? JFFS2 听起来像是我想要的数据写入方式(并且性能需求根本不高),但使用 block2mtd 等听起来相当笨拙。我也不确定卡的磨损均衡将如何相互作用用它。
最好的方法是什么?
编辑
我现在正在考虑离开文件系统 VFAT 并一次分配一天大小的文件,并填充 0xFF,这应该会大大限制电源周期故障的风险。然后我只能在这些预先创建的块中附加记录,希望 SD 卡不会愚蠢到将擦除/磨损级别写入 0xFF 区域。
我可以使用 noatime,但是是否有等效的 VFAT nomtime 来防止写入修改的时间字段?我需要某种方法来阻止任何元数据更新,直到创建新的一天的文件。
编辑2
电子堆栈交换中的某人提醒我 NAND 上也有 ECC 数据,因此无法阻止擦除的需要。
那么,在这种情况下,通过 block2mtd 的 JFFS2 是否合适?
编辑3
情况比我想象的还要糟糕。即使您将完全相同的内容写入磁盘,我拥有的 SD 卡也会擦除数据块。擦除块为 64KB,这对于完全延迟写入来说太大了。我将在 NAND 闪存(我可以控制其写入行为)中以一种日志形式存储最多 128KB 的数据,然后将 128KB 块写入 SD 卡上 VFAT 分区中的 128KB 对齐文件(在如果其他 SD 卡有 128KB 擦除块)。
答案1
那么,解决这个问题的方法就是解决“随时可能断电”的问题。难道连一分钟的电池电量都无法补充吗?
或者,也许您可以使用两张 SD 卡。将数据写入一张卡,同步,写入另一张卡。每个数据块都需要一个校验和和块号,但即使出现一些非常不幸的电源故障,其中一张卡也应该是正确的。
你的基本问题是SD卡上的磨损均衡,据我所知这取决于卡供应商(甚至可能是批次,他们可以随时更改)。它可能无法正确处理断电。根据它的作用,这可能不仅仅意味着损坏您正在写入的块。
- 假设卡片很小——3 个(闪存)块。块 1 收到的写入次数多于 2 或 3 个。我将按数字调用物理块,并按字母调用逻辑块 A、B、C。现在,A=1,B=2,C=3。
- 您向块 A 发出写入。 SD 卡就像啊哈!我们在这里需要磨损均衡,否则块 1 将在 2 和 3 之前磨损。它决定交换块 1 和 2。
- 它将块 1 读入 RAM 位置 i(在 SD 卡上,而不是系统 RAM)。它会更新您想要更改的部分。
- 它将块 2 读入 RAM 位置 ii
- 它擦除块 1
- 它将 RAM 位置 ii 写入块 1。
- 它将映射表更新为 B=1
- 它擦除块 2。
- 它将 RAM 位置 i 写入块 2。
- 它更新映射表以表示 A=2
当然,“更新映射表”并不总是微不足道的。 5-10 的顺序可能不同(如果它们全部完成,那就没关系,当然,擦除必须在写入之前进行)。但是发生电源故障时,您不仅可能会损坏 A(如您所料),而且 B 也会损坏。或者,如果在映射更新期间发生电源故障,谁知道会导致什么样的损坏。
答案2
electronics.stackexchange.com 中讨论了类似的内容:如何保护 SD 卡免受意外断电的影响?
一个有效的侧面答案串联使用软件解决方案是查看硬件(ESE 上也有一个关于此的问题,但我现在找不到它;它并不严格与 SD 卡有关,只是与设备断电以及如何检测并采取行动有关)在上面)。
简而言之:您可能没有电池电源,但您的电源有一些相当大的电容器来平滑供电。基本上,电力不会凭空消失。电压逐渐减小。可能有一个欠压保护 IC/电路,当电压降至某个点以下时,它会在嵌入式系统上发出 RESET 信号。 PC 主板也有这些,它们响应来自 PSU 的“POWEROK”信号。这意味着,当断电时,计算机将在电压降至安全水平以下几毫秒之前强制停止。在此期间,SD 卡等外围设备仍处于通电状态,但计算机不再有任何交易。
SD 卡很可能有足够的时间来完成任何待处理的事务,包括磨损均衡、前它的电源断了。使用足够大的电容器或在 SD 卡附近使用一个电容器来改善电源可能有助于确保这一点,但您始终可以按原样使用您的平台进行试验。它很可能会在足够长的时间内保留电量。
如果问题的硬件方面不是问题,则可以解决纯软件方面的问题。德罗伯特使用两张卡进行冗余的想法还不错,并且使用 VFAT 这样的标准文件系统可以减少卡的磨损均衡算法混乱的风险。
不管怎样,你很可能不会遇到那么多问题。假设卡上的一个块可以在 100 次写入后存活下来(保守一点,但一定要尝试获得高质量的卡!),并且使用 8GB 卡,当第一个块失效时,您将写入 800GB(当然,从统计角度来说)。
答案3
我们遇到了 SD、ext2 根文件系统因意外断电而损坏的问题。首先,我们让系统以只读根挂载运行。由于我们需要一些可写存储(但我们没有数据记录),因此我们将第二个分区设置为可写。为了最大限度地减少意外断电时对 FS 的损坏,我们将其设置为 ext3 分区,尽管这将导致对卡的物理写入次数至少增加两倍。这种组合(但我承认与数据记录器相比,我们的第二个分区写入并不频繁)似乎运行没有问题。迄今为止。 (系统在专业设施中安装了约30个月)
答案4
对于可能断电的环境中的数据安全和整体数据安全,您应该考虑更多的要点。
不使用 MLC 单元进行存储,只有 SLC 具有足够的数据保留时间。那么那些SLC卡可以有智能固件,有些在任何状态下都不会因断电而损坏。他们通过测量来识别断电并确保最后一个块已完全写入。
这些卡比 MLC 单元更昂贵且速度稍慢。请参阅 swissbit 等供应商的卡。