防止掉电时ext4 / Linux驱动器上的数据损坏


9

我有一些运行美国Megatrends bios的嵌入式板,并且以嵌入式linux作为操作系统。我的问题是,工业闪存的电源损耗会损坏。我将它们格式化为ext4。每当发生这种情况时,我通常都可以使用fsck修复闪存,但这在我们的部署中是不可能的。我听说禁用写缓存应该会有所帮助,但是我不知道该怎么做。另外,还有什么我应该做的?

更多信息

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

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

断电后,我通常无法完全通过启动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

Answers:


6

写缓存通常与BIOS无关,大多数情况下,那里没有切换磁盘缓存设置的选项。对于linux,使用hdparm -W 0应该会有所帮助。

该设置是永久性的,因此如果您的生产系统中没有hdparm可以使用,则应该能够在其他系统上禁用磁盘写缓存并重新插入磁盘。

顺便说一句,我第二个想法是不可写的根文件系统(这样,您的系统就可以以一种“恢复模式”启动,并且即使由于某种原因无法挂载可写文件系统也可以进行远程访问)。而且,如果可以更改硬件设计,请考虑使用mtd设备,而不要使用具有jffs2之类的闪存文件系统的IDE / SATA磁盘。多年来,我们一直将此组合与几种嵌入式设备(主要是本领域的VPN路由器解决方案)一起使用,并取得了良好的效果。

更新:问题的根源似乎是您正在运行禁用日记功能的ext4文件系统- has_journalFilesystem features列表中丢失。只需关闭所有服务,使用来检查是否还有打开的文件,使用来lsof +f -- /重新挂载您的根分区为只读mount -o remount,ro /,使用来启用日志,tune2fs -O has_journal /dev/sda1然后使用来将“有序”日志模式设置为默认挂载选项tune2fs -o journal_data_ordered /dev/sda1-您将必须重新运行fsck(最好从应急系统运行)并在此操作后重新挂载root /重新启动。

有了这些设置,即使在突然断电的情况下,也保证元数据可从日志中恢复。尽管您可能会在启动前断电几秒钟后看到数据,但实际数据也始终如一地写入磁盘。如果这是不可接受的,则可以考虑在tune2fs -o journal_data /dev/sda1文件系统中使用mount选项-这将包括写入日志的磁盘中的所有数据-这显然会为您提供更好的数据一致性,但会降低性能并降低磨损水平在您的SSD上。


那么写缓存是我的问题还是其他问题?
乔纳森·亨森

好吧,我怎么知道,这毕竟是您的系统:-)您应该提供一些有关所使用的文件系统挂载选项的详细信息(是否启用了扩展区?是哪种数据/日志模式?)以及您的损坏类型是什么?请参阅(最好使用fsck输出)进行更详细的分析。
the-wabbit 2011年

好,谢谢。我是一位无助的软件工程师,您知道:)。我会详细说明。我会在几分钟内添加一些详细信息。
乔纳森·亨森

我不知道范围是什么,也不知道什么是日记模式。
乔纳森·亨森

知道了 只需发布输出的第一行dumpe2fs /dev/sda1(或此系统的设备/分区名称将是)即可-它们应包含所有相关信息。并且/ etc / fstab中的根文件系统的挂载选项也应该有所帮助。
the-wabbit 2011年

5

写缓存建议是一个好的开始,但这听起来像是体系结构设计的缺陷。在嵌入式系统上,除非在极少数情况下,否则不应将内部闪存安装为R / W。您实际上应该在内存文件系统中完成大部分工作,并根据某些用户命令或定期间隔将更改同步回RW闪存。对于嵌入式系统,在正常操作期间以rw模式使用常规文件系统(例如ext4)的确很少见。如果在某些应用程序需求中需要大量存储空间,则应考虑使系统分区有所不同,并对其进行设计,以便在启动时可以对数据分区进行fsck -y操作。

如果您需要一些起点,我将介绍人们如何设置无盘Linux系统:

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

然后从那里开始。通常的想法是,系统二进制文件和数据可以只读方式挂载,因此文件系统不会损坏。但是,您需要能够写入某些区域,因此通常需要一些东西来存储文件系统/ tmp,/ var / tmp。即使某些事情需要写,您也只需创建一个脚本将分区挂载为r + w,然后提交更改,然后回到只读状态即可。

一个很好的例子就是Cyclades硬件,其嵌入式Linux,并且每当进行配置更改时,都必须执行保存脚本,该脚本实际上会重新打包配置并将其写到闪存中。


有些配置文件需要由应用程序以及/ etc / networks和主机名文件编辑。您能给我一个建议吗,例如,您需要一个具有这种类型的分区,而另一个分区用于另一种类型的配置文件,依此类推?我真的不知道这些事情。我正在编写软件,并且非常希望能确切地知道(不是我不足够编写* nix软件,但是我当然不像专门的系统人员那样了解)我的雇主应该如何使用硬件。
乔纳森·亨森

当然,我更新了答案以包含更多信息。这是一个相当复杂的主题,尽管它涉及许多Linux内部组件,但它只涉及一个问题。您可能想尝试与完成了无盘/ pxe /嵌入式系统的人员签约,以了解您的应用程序要求并设计一个可靠的解决方案。
多项式

最坏的情况是,您可以使用一个系统分区(永远不可写)和两个配置分区。如果主分区不可读或不完整,请从辅助分区启动,重新格式化主分区,然后将辅助分区复制到该分区中。在非重叠操作中更新主服务器和辅助服务器。
David Schwartz

好的,我更新了答案。我可能会听取您的建议,并从我的研究生课程中带给我的一位老教授。同时,是否有一种快速而又肮脏的方式,至少可以使我处于一个更好的位置,而不会把我的屁股放在平底锅里?
乔纳森·汉森

短期内关闭写缓存或定期运行“同步”可能会有所帮助。
多项式
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.