防止ext4 / Linux驱动器在断电时数据损坏

我有一些运行American Megatrends biosembedded式Linux的embedded式板作为操作系统。 我遇到的问题是,工业闪存ide将损坏功率损失。 我把它们格式化为ext4。 每当发生这种情况,我通常可以使用fsck来修复闪存,但这在我们的部署中是不可能的。 我听说禁用写caching应该有所帮助,但我不知道如何去做。 另外,还有什么我应该做的?

更多信息

该驱动器是一个4GB IDE闪存模块。 我有一个分区是ext4。 操作系统安装在该分区上,grub是我的引导程序。

fdisk -l以/ dev / sda1作为我的主分区显示/ dev / sda作为我的闪存模块。

断电后,我通常不能完全通过启动init脚本。

当我在另一台PC上安装驱动器时,我运行fsck / dev / sda1。 它总是显示消息

"zero datetime on node 1553 ... fix (y)?" 

我修复它们,它靴子很好,直到下一个电力损失。

当我明天到办公室时,我会发布fdisk -l的实际输出

这就是我所知道的系统工作原理。 我不是系统工程师,我是一名软件工程师,有一种习惯是陷入工作描述之外的困境。 我知道如何格式化驱动器,安装引导加载程序,编写软件,并在操作系统上进行破解。

这是dumpe2fs的输出

 #sudo dumpe2fs /dev/sda1 dumpe2fs 1.41.12 (17-May-2010) Filesystem volume name: VideoServer Last mounted on: / Filesystem UUID: 9cba62b0-8038-4913-be30-8eb211b23d78 Filesystem magic number: 0xEF53 Filesystem revision #: 1 (dynamic) Filesystem features: ext_attr resize_inode dir_index filetype extent flex_bg sparse_super large_file huge_file uninit_bg dir_nlink extra_isize Filesystem flags: signed_directory_hash Default mount options: (none) Filesystem state: not clean Errors behavior: Continue Filesystem OS type: Linux Inode count: 245760 Block count: 977949 Reserved block count: 48896 Free blocks: 158584 Free inodes: 102920 First block: 0 Block size: 4096 Fragment size: 4096 Reserved GDT blocks: 239 Blocks per group: 32768 Fragments per group: 32768 Inodes per group: 8192 Inode blocks per group: 512 Flex block group size: 16 Filesystem created: Fri Feb 4 15:12:00 2011 Last mount time: Sun Oct 2 23:48:37 2011 Last write time: Mon Oct 3 16:34:01 2011 Mount count: 2 Maximum mount count: 26 Last checked: Tue Oct 4 07:44:50 2011 Check interval: 15552000 (6 months) Next check after: Sun Apr 1 07:44:50 2012 Lifetime writes: 21 GB Reserved blocks uid: 0 (user root) Reserved blocks gid: 0 (group root) First inode: 11 Inode size: 256 Required extra isize: 28 Desired extra isize: 28 Default directory hash: half_md4 Directory Hash Seed: 249d2b79-1e20-49a3-b324-6cb631294a63 Journal backup: inode blocks 

    写caching通常与BIOS没有关系,大多数情况下没有select切换那里的磁盘caching设置。 在linux下,使用hdparm -W 0应该有所帮助。

    该设置是持久的,所以如果您没有hdparm在您的生产系统中玩耍,您应该能够在另一个系统上禁用磁盘写入caching并重新插入磁盘。

    顺便说一句:我想第二个不可写的根文件系统的想法(所以你的系统可以启动一种“恢复模式”,并允许远程访问,即使可写文件系统由于某种原因不可挂载)。 如果您可以更改硬件devise,请考虑使用mtd设备而不是IDE / SATA磁盘,并使用支持闪存的文件系统(如jffs2) 。 我们已经将这种组合与几个embedded式设备(主要是现场的VPN路由器解决scheme)结合使用了好几年,取得了良好的效果。

    更新:你的问题的根源似乎是你正在运行一个ext4文件系统禁用has_journalhas_journalFilesystem features列表中缺less。 只要closures所有服务,使用lsof +f -- /检查是否还有任何打开的文件,使用mount -o remount,ro /重新挂载根分区,只读使用tune2fs -O has_journal /dev/sda1和使用tune2fs -o journal_data_ordered /dev/sda1设置“ordered”日志模式作为默认挂载选项 – 您将不得不重新运行fsck(最好从救援系统中)并在此操作后重新挂载root / reboot。

    通过这些设置,即使在突然断电的情况下,元数据也能保证从日志中恢复。 实际的数据也一致写入磁盘,尽pipe在启动时停电之前你可能会看到几秒钟的数据。 如果这是不可接受的,你可能会考虑在你的文件系统中使用tune2fs -o journal_data /dev/sda1挂载选项 – 这将包括写在日志中的所有数据 – 这显然会给你更好的数据一致性,但代价是性能损失和更高的磨损级别。

    写cachingbuild议是一个好的开始,但这听起来像是一个build筑devise缺陷。 在embedded式系统中,内部闪存可能不应该安装在R / W上,除非在极less数情况下。 你应该真的在做一个内存文件系统的大部分工作,并根据某些用户命令或定期的时间间隔将变化同步到RW闪存。 embedded式系统在rw模式下正常运行时使用常规文件系统(如ext4)是非常罕见的。 如果有一些应用程序需求需要大量存储空间,那么应该考虑让系统分区不同,并devise它,使得数据分区可以作为启动的一部分。

    如果你需要一些起点,我会看看人们如何设置无盘Linux系统:

    http://frank.harvard.edu/~coldwell/diskless/

    并从那里开始。 一般的想法是,你的系统二进制文件和数据可以挂载为只读,这样你的文件系统就不会被损坏。 但是,您需要能够写入某些区域,所以您通常需要记住文件系统/ tmp,/ var / tmp。 即使某些事情需要写入,你只需创build一个脚本来挂载分区为r + w,然后提交更改,然后回到只读。

    一个非常好的例子就是Cyclades的硬件,它的embedded式linux,每当你进行configuration改变时,你都必须执行一个保存脚本,这个脚本实际上会重新configuration这些脚本并将它们写入到闪存中。