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

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

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

我希望将来避免出现这种情况,并且我希望将操作系统移动到可以防止这种情况的文件系统。有很多用于 MTD 设备的文件系统,要让它们在 SD 卡(标准块设备)上运行需要一些严格的跳跃。还有一些其他文件系统(日志等)拥有良好的抗腐败能力。我仍然需要对它们的优缺点进行一些合理的比较。

Linux 中可用的文件系统可以最好地防止意外断电时的损坏,并且不需要跳过不可能的障碍,例如yaffs2以便安装到 SD。

磨损平衡是一个优点,但不是必需的 - SD 卡通常有自己的机制,即使不够完美,但系统应该“对闪存温和”(像 NTFS 这样的系统可以在一个月内毁掉 SD 卡)。

答案1

单张 SD 卡上的最佳防损坏能力是RAID1 中的 BTRFS具有自动清理功能的模式每隔预定义的时间段运行一次。

好处:

  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,因此您必须安装它。然后,您需要将“btrfs”添加到 mkinitcpio.conf 中的 MODULES 数组中,并使用以下命令重新创建 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 计时器(首选)或 cron (dcron) 设置定期清理(每 3-7 天),如下所示:

btrfs scrub start /

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

BTRFS RAID1、单一介质和 Raspberry Pi 的组合使得这个非常神秘的东西。我们花了一些时间和精力将所有的部分组合在一起,但它就在这里。

答案2

我会采取另一种方式,只使用只读文件系统。当我在 SD 卡上使用读写根文件系统时,我的树莓派永远不够稳定。您可以通过内核命令行 (ro) 启动 root,也可以使用包含完整系统的 initramfs。

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

答案3

出于多种原因,闪存存储比磁性存储更可取,但对于此应用程序,我想说主要是因为没有移动部件。话虽这么说,我认为不存在“防腐败”文件系统,但有一些强大的文件系统(ext4 就是其中之一),以及一些帮助减轻腐败的策略。

内存盘

如果 RPi 的图像没有改变,听起来好像没有,如果没有什么会尝试(或应该尝试)写入磁盘,那么尝试使用创建的根文件系统解压到RAM中。这里的想法是,你在启动时有一个压缩的根文件系统,它被解压缩到 RAM 中。所有更改都发生在 RAM 磁盘上,因此实际上对 SD 卡的写入为零,仅在启动时读取。这应该会减少驱动器的读/写次数,从而延长其使用寿命。这类似于您执行以下操作时所做的操作:从 CD 启动 Linux,并且是最先发生的事情之一当linux启动时

答案4

Linux 提供了许多文件系统。外部4是我更有信心的一个。如果有疑问,ext4 应该用于任何将以读写方式挂载的分区。

外部2文件系统要脆弱得多。对于能够以只读方式挂载或正确卸载它的系统来说,这是一个非常好的文件系统。但一旦停电,腐败极有可能发生外部2

可以考虑另一个选择杰夫斯即使 jfs 文件系统在某些 Linux 版本中并不可靠。腐败的可能性较小杰夫斯比与外部4杰夫斯它还具有快速的安装时间和文件系统检查时间。

相关内容