适用于嵌入式Linux的防腐蚀SD卡文件系统?


36

最近,我们的客户遇到了一个非常不愉快的情况-用于显示遥感数据的基于Raspberry Pi的“信息亭”(比显示信息收集服务器中的自我更新网页的信息亭模式的浏览器更有趣)由于以下原因而无法启动文件系统损坏。Ext4,需要手动fsck,系统将成为明天重要演示的一部分,需要立即维修。当然,当晚上关闭系统时,我们不能要求客户很好地关闭系统。系统必须简单地承受这种虐待。

我希望将来避免此类情况,并且希望将操作系统移至可以防止这种情况的文件系统。有许多用于MTD设备的文件系统,要使其在SD卡(标准块设备)上运行,需要进行一些严重的跳动。还有一些其他文件系统(新闻发布系统等)具有良好的抵御腐败能力。我仍然需要对它们的优缺点进行一些合理的比较。

Linux中可用的哪种文件系统可以最好地抵御意外电源故障时的损坏,并且不需要为了安装到SD 而跳过像yaffs2这样的不可能的箍。

磨损平衡是一个加号,但不是必须的-SD卡通常具有其自身的机制,即使不够完美,尽管该系统应该是“温和的闪存”(例如NTFS之类的系统可以在一个月内谋杀SD卡)。


1
就个人而言,我会选择另一种方法,并在断电时进行安全关机,可能使用上限来提供足够的动量以进行关机。
Scott Seidman

我很乐意看到有人设计该模块,该模块提供的电源足以清洁关闭,并提供所需的系统支持来注意警告并真正关闭。似乎它应该成为Pi,BeagleBone和其他小型Linux机器的明智伴侣,但它似乎并没有作为针对这些机器用户的产品而存在。
RBerteig

@ScottSeidman:这是RPi,非常耗电-考虑在5V下800mA持续15s。除非您购买整个超级电容器电池,否则它不是电容器。
SF。

@RBerteig:一个装有可充电电池的盒子,可以使用适当的电子设备充电,稳定输出电压(可能是电池本身的升压),发送关闭信号,关闭完成后切断输出电源,自行关闭直到输入电源恢复-确保这一切都是可行的,但如果您不进行批量生产,则其成本大约是RPi的两倍(尽管在售货亭的情况下,电视机的价格要贵10倍...)
SF。

1
@SF。-请注意,针对powerfail文件系统的健壮性存在两个问题。首先是FS本身很健壮,其次是底层硬件不是将数据刷新到磁盘。我知道近年来旋转磁盘已被人们用来提高其明显的性能,因此,您需要确保SD卡的性能与以前不同。
迈克尔·科恩

Answers:


17

BTRFS在RAID1模式下将每个预定义的时间段内自动运行擦洗,从而在单个SD卡上提供最佳的抗破坏能力。

好处:

  1. 保留读写文件系统的能力
  2. 功能齐全的现代文件系统,具有用于RPi的非常有用的选项,例如透明压缩和快照
  3. 设计时要考虑闪存(除其他事项外)

这是操作方法:

我在ArchARM linux上运行RaspberryPi,并且卡在SD读取器中,因此请针对其他发行版和/ dev接口相应地修改这些说明。

这是一个示例分区布局:

/dev/mmcblk0p1: fat32 boot partition
/dev/mmcblk0p2: to be used as btrfs partition
/dev/mmcblk0p3: to be used as btrfs partition (mirrored with the above)
/dev/mmcblk0p4 (optional): swap

为了使btrfs进入RAID1,您可以这样创建文件系统:

mkfs.btrfs -m raid1 -d raid1 /dev/mmcblk0p2 /dev/mmcblk0p3

然后,rsync -aAXv将其备份到以前备份的系统中。

要使其从raid1中的BTRFS引导,您需要修改initramfs。因此,当您的系统仍在旧文件系统上运行时,需要执行以下操作。

Raspberry通常不使用mkinitcpio,因此您必须安装它。然后,您需要在mkinitcpio.conf中的MODULES数组中添加“ btrfs”,并使用以下命令重新创建initramfs

mkinitcpio -g /boot/initrd -k YOUR_KERNEL_VERSION

要知道键入什么而不是YOUR_KERNEL_VERSION,请运行

ls /lib/modules

如果更新内核,则必须在重新启动之前重新创建initramfs。

然后,您需要修改RPi的启动文件。

在cmdline.txt中,您需要

root=/dev/mmcblk0p2 initrd=0x01f00000 rootfstype=btrfs

并在config.txt中,您需要添加

initramfs initrd 0x01f00000

完成所有步骤并成功启动到btrfs RAID1系统后,剩下的唯一事情就是使用systemd timer(首选)或cron(dcron)设置定期清理(每3-7天),如下所示:

btrfs scrub start /

如果发现任何损坏,它将在您的文件系统上运行,比较所有文件的校验和并修复(替换为正确的副本)它们。

BTRFS RAID1,单一介质和Raspberry Pi的组合使这些东西非常神秘。将所有组件组合在一起需要花费一些时间和精力,但现在就来了。


我是否还应该在每次启动后添加“ scrub”?
SF。

@SF。不,没有必要。每X天定期擦洗就足够了。最好在最少使用的时间内。
洛克希德2015年

抱歉,我无法理解-如果我保留胖/boot分区,是否还需要修改initramfs?
Bex

Bex,是的。它与btrfs的raid1功能有关,而不与fat / boot分区有关。
洛克希德

@@@更新:@@@到目前为止,人们可以尝试使用dup模式而不是RAID1:“ mkfs.btrfs --data dup --metadata dup”,但我不确定100%地确定它是否与RAID1一样有弹性。在单个驱动器上。
洛克希德

10

出于多种原因,很好的闪存存储比磁性存储更可取,但是对于此应用程序,我主要要说的是没有移动部件。话虽如此,我认为那里没有“防腐败”文件系统,但是那里有一些健壮的文件系统(ext4是其中之一),以及一些有助于减轻腐败的策略。

RAM盘

如果RPI的图像不会变化,这听起来像没有,如果没有将尝试(或者应该尝试)写入磁盘,然后尝试使用创建为一个根文件系统解压到内存中。这里的想法是您在启动时有一个压缩的根文件系统,该文件系统被解压缩到RAM中。所有更改都发生在RAM磁盘上,因此实际上对SD卡的写入为零,仅在引导时读取。这样可以减少对驱动器的读/写操作,从而延长驱动器的使用寿命。这类似于从CD引导linux时所做的事情,并且是linux启动时发生的第一件事。


10

我会采用另一种方式,只使用只读文件系统。在sdcard上使用读写根文件系统时,我的树莓派永远都不够稳定。您可以只通过内核cmdline(ro)引导您的根目录,也可以使用带有背back式的initramfs(包括整个系统)。

两者都可以使用我的自制构建系统OpenADK来创建。(http://www.openadk.org


RO文件系统可以帮助...但不能完全解决问题。
Piskvor

7

好吧,您这里遇到的问题是,使用诸如ext *之类的“现代”文件系统可能会使SD卡磨损;根据我在一年内或第二年发生的经验(如果您选择更高端)。

问题是现代文件系统总是在移动块以防止数据碎片。在旋转磁盘上,这是一件好事,在磁盘上您希望在将所有数据加载到缓存时进行整理。不利的一面是,由于没有太多I / O发生时正在整理工作,因此它正在执行更多无法缓存的写入操作。

当您处理大量日志时也可能发生这种情况,调试嵌入式设备时可能要这样做。日志记录写入是最糟糕的一种写入,因为它定期发生许多微小的写入,这会产生很多碎片。

正如您所说的那样,系统也正在处理传感器的数据,很有可能将它们存储在闪存中。它们和日志数据一样糟糕。

我遇到了您遇到的相同问题,这是我的结论。我试图寻找可以“更强大”地出售的SD卡,即,能够处理比其他卡更多的写入,但是与SSD上的基准不同,我发现市场上没有针对此的基准。由于它们都只专注于速度,因此无法知道每个存储块的写入次数以及SDCard中使用的技术。

不过,我注意到“工业”级Sandisk的寿命比没有名字的更长。毫不奇怪,当您支付更多时,您会得到更多。

但是最后,启用密集日志记录后,我发现没有SD卡的使用寿命超过几年,而其中的一年是死亡最多的一年。

我想出的解决方案是@BigHomie和@wbx的解决方案:使用只读extX文件系统(由于不再需要日记功能,所以您甚至可以使用旧的ext2)。而且,如果要将日志保留在会话中或写入临时文件,则可以始终使用RAMDISK。

仅存在教程和脚本可帮助在ramdisk中填充只读部分中的数据,以便您可以在会话中对其进行编辑。

注意:我的经验是在20个传感器设备的试运行中,在Beaglebone上使用Angstrom Linux。使用systemd的日志系统,该系统的日志记录非常冗长。


4

Linux提供了许多文件系统。EXT4是一个我更有信心。如果有疑问,EXT4应该用于将被安装读写任何分区。

EXT2文件系统更加脆弱。对于能够以只读方式安装或正确卸载的系统来说,它是一个非常好的文件系统。但是ext2的电源故障极有可能导致损坏。

即使jfs文件系统在某些Linux版本中不可靠,也可以考虑使用jfs。与ext4相比,使用jfs进行破坏的可能性较小。Jfs还具有快速挂载时间和文件系统检查时间。


2
是的,ext4很棒,我在大多数服务器上都使用它。但是这个问题是关于SD卡上的根系统的文件系统。这是一个不同的环境。您的建议是一般建议,还是真的建议使用ext4卡?
guettli
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.