永不损坏的文件系统(可接受数据丢失)

永不损坏的文件系统(可接受数据丢失)

有几个现有的主题围绕这个问题,但我寻求的略有不同。我在嵌入式 Linux 上有一张 SD 卡,它会断电。我也许能够在某个时候修改硬件,正确关闭等等。但现在,我只想找到一个可以在断电后正常运行的文件系统。数据丢失是可以接受的。我不想丢失比当前正在写入的文件更多的内容,但我仍然宁愿丢失所有文件,也不愿面临“无法安装”、“等待 10 分钟 fsck”或“无法创建新文件”的情况文件由于这个 inode 出现了一些错误'。计划必须继续下去!

我正在付出很多努力来确保这一点。我使用工业级组件,我有硬件看门狗,软件看门狗,内部,外部,init重新启动程序,守护进程不断检查内存,文件描述符等等,我有看门狗监视我的看门狗,而其他看门狗又监视我的看门狗...但我似乎无法保证SD卡能够安装和运行?

我现在最好的选择是在 SD 卡上使用 JFS,在我的安装中包含 fsck 和 fsck.jfs。 (增加 600kb+ 吃我的内存和闪存。这很糟糕。)并在每次启动时运行 fsck(可能会增加大量启动时间。这有点糟糕。)。不过似乎有点悲伤。

有谁知道更好的方法或更好的文件系统?

更新:e2fsprogs-libs(对 jfsutils 的依赖)似乎在我的发行版中编译起来非常困难。我会研究一下 ZFS(虽然它不是我的发行版原生的。而且它似乎做了很多我不需要的事情。)

UPDATE2:有关我的系统和测试的更多信息:SD 卡存储是辅助可选存储。 SD 卡为 2Gb-8Gb 工业级 microSD。 SD 卡是通过我的 rc 使用 mount -t 命令安装的。选项“noatime”但不是“sync”。我的发行版是定制的 Analog Device 风格的 uClinux,带有 3.10 内核和 1.21 busybox。我的主存储是带有 jffs2 的 spi 闪存。我对此从未有过任何问题。我什至不知道是否有 fsck.jffs2 可用。另一方面,Nand flash...但那是一个不同的故事。 SD 卡的用途是存储测量数据。 “监控”程序会将结果附加到文件中,并具有战略同步位置。当文件超过给定大小时,将创建一个新文件。当达到给定数量的文件时,最旧的文件将被删除。如果当前的测量文件因断电而丢失,也没有什么问题。文件通常为 50-100kb,1 个结果通常为 1kb。这只是最初的开发阶段。没有什么是固定的。这是我第一次处理嵌入式系统中的非闪存文件系统。 (我的 x86 服务器上有 ext4。)

我从 vfat 开始。默认文件系统。 (我认为工厂可能有选择它的理由。如果事情有效,我并不太关心。)我的嵌入式 vfat 设备从未见过任何断电问题。不过我在 WinCE 中遇到过 FAT 问题。然而,当我的“监控”程序达到 100-200 个文件时,它拒绝创建更多文件。 FAT 似乎在根目录中存在特殊的文件限制问题,在子目录中存在稍大的文件限制问题。我需要能够在 1 个目录中创建 500-1000 个文件。所以vfat不行。

然后我切换到ext2。不过我没有在启动时插入 fsck。 (不知道我必须这样做。)一天之内,由于“inode somesomething”错误,我的“监视器”程序无法创建更多文件。灾难!

我当前的解决方案是在启动时使用“e2fsck -y”的 ext2。到目前为止,这似乎很有希望。但 e2fsck 和“启动时 fsck”的整个概念一直困扰着我。 e2fsck 本身就占用了我的主闪存和内存超过 350kb。 (当它没有运行时。)这意味着它是我最大的程序。它比 busybox 还要大。它几乎可以与我的内核相媲美。

我一直在考虑ext3。它记录了元数据,这不会有什么坏处。我怀疑它会有多大帮助。有了我的小文件和受控同步,我想我应该被覆盖?它具有有序的写入顺序。这意味着数据也在某种程度上被记录下来。然而,这可能会导致非确定性滞后。这对我来说很糟糕。 (这可能不是问题。)它还有预定同步功能。例如。每 5 秒提交一次。我认为这会干扰我自己的同步。过多的写入对 SD 卡不利。甚至是工业用的。我找不到任何有关如何禁用此功能的文档。和 ext3仍然要求每次启动时运行 fsck!但 ext3 仍然是可能的。

分机4。将修复很多 ext3 的性能问题。但我其实并不需要表演。我的发行版似乎没有内置的 mkfs.ext4 和 fsck.ext4。也许这不是问题。但也有可能。例如。 e2progs-libs(对 jfsutils 的依赖)似乎有很多编译问题。

JFS、XFS、BRFSS。所有这些都由我的内核支持。目前未包含在我的用户空间工具箱中。一切似乎都是相当庞大、复杂的系统。它们似乎都在启动时需要“fsck”等效项?

我也考虑过放弃我自己的文件系统:始终写入文件表的 2 个副本。遍历时,选择CRC正确且序列号最新的那个。进行 2 阶段写入序列。分配临时的,在提交时修复。无需 fsck。但恐怕这可能有点天真。

UPDATE3:顺便说一句,嵌入式系统(至少是这个)的本质是它们是自主的、无人值守的、遥不可及的,而且必须运行多年。像 fsck 这样的程序可能需要人际互动让我感到害怕。

答案1

你的故事有点不一致,或者至少是含糊不清:

我宁愿失去一切,也不愿面对“无法安装”、“等待 10 分钟 fsck”

暗示——尽管你实际上没有说出来——这是你实际遇到的问题。但是之后:

e2fsprogs-libs(对 jfsutils 的依赖)似乎在我的发行版中编译起来非常困难。

意义你根本没有任何 fsck,因为e2fsprogs-libs是 的依赖项,e2fsprogs其中提供了e2fsck。因此,也许您仍处于规划阶段,甚至还没有使用例如 来测试系统ext4,而是得出了应该从 JFS 开始的结论?这有什么特别的原因吗?

我在树莓派交换(树莓派的主存储也是 SD 卡)上注意到,相当多的用户似乎对此类问题感到非常沮丧,尽管大多数人(包括我自己)从未遇到过这种问题。全部。起初我以为这些人不知道系统应该被彻底关闭这一事实,但在解释时这并不是一个难以理解的问题,并且有人报告了这一点即使系统已正确关闭

你已经说过你需要这个才能容忍断电(这很公平),但我提到这一点是因为它意味着有一些pis,或某些SD卡,或两者的某种组合,由于拔出插头或重新插入插头时定期发生的某些事件(浪涌?),它们很容易损坏文件系统。我也有没有看到任何关于有人说他们已经改用 btrfs 或 jfs 或其他什么的报道,而且现在问题已经解决了,而且已经有足够的时间让很多人尝试了。

另一个神秘的事情是即使人们猛拉电源线,也不会经常导致文件系统无法使用。 当然,我已经用 pi 做过很多次了,用普通的 Linux 盒子也做过数百次(电源被切断,系统变得无响应,我疲惫不堪,生气等等)。虽然我见过轻微的数据丢失,但我从未见过文件系统在快速 fsck 后损坏到无法使用的程度。

再次,假设所有这些报告都是真实的(我不明白为什么很多人会对此撒谎),除了不彻底卸载之外还有更多的事情发生,但它似乎只影响一小部分用户,再次暗示某种常见的硬件缺陷。

在 pi 上,我在启动脚本中写入-y/forcefsck以便在下次启动时自动运行并修复任何问题,无论这是否有必要。在 700 Mhz 单核上,对于包含约 4 GB 数据的 12 GB 文件系统,这需要约 10 秒的时间。所以“10 分钟”听起来像是一个非常长的时间,尤其是因为你已经说过“这用于写入的小文件系统!”。

您也可以考虑sync定期打电话。

最后,您应该用更真实、更具体的问题细节来更新问题你实际遇到过,并且少一些夸张。否则看起来太早产了XY问题,这可能会很快被拥有丰富经验和为您提供潜在建议的人跳过。

答案2

计划必须继续下去!

这是一个常见的要求,在选择稳定的系统时,Linux 系统是最佳选择。

你的努力似乎也没有朝着正确的方向发展。但是,为了获得稳定的系统,你能做些什么呢?

在第一级中,您可以改进文件系统:

  • 在使用 . 创建或修改时,yournal_data_ordered在文件系统上使用。ext3/ext4tune2fs
  • 检查时配合JFS使用。--replay_journal_only
  • FSCKFIX=yes通过在 initscript 中设置启用自动修复。

如果这还不够,您可以在不安装有问题的磁盘的情况下引导系统。相反,ramdisk您可以在手动检查和修复有问题的磁盘时创建一个新磁盘。这也可以通过脚本自动化。

在下一个级别中,您需要离开嵌入式系统并阅读一些有关的主题高可用性

相关内容