6 个月内两次 - 在三个 Ext4 磁盘上 - 其中一个是大约一年前的 Seagate - 我的文件系统发生了灾难性的损坏。似乎发生的情况是,在许多目录中,目录条目列表被截断,只留下“.”。和“..”,并且许多元数据结构都被直接 0xFF 覆盖。也就是说,一个块将仅由重复 4096 次的字节 0xFF 组成。我使用 Ubuntu Mate、18.04.3 LTS、4.15.0-72-generic #81-Ubuntu SMP。
在大约 6 个月前的第一个实例中,我从一台发生电源故障的机器中取出两个磁盘,将它们安装到另一台机器上,而没有对它们进行 fsck。我没有向磁盘写入任何数据,但由于我忽略将它们挂载为只读,因此元数据可能已写入。最终我对它们都运行了 fsck,并发生了上述损坏。具体来说,超级块、所有备份超级块、GDT 的所有副本以及 inode 表的大部分都被 0xFF 字节覆盖。通过编写代码来扫描磁盘以查找正确表之外的 inode 记录和目录文件,我能够将大部分文件系统重新拼凑在一起。我估计我在一个磁盘上恢复了大约一半的数据,在另一个磁盘上恢复了 75%。好吧,我很粗心地挂载了 RW 驱动器而没有在其上运行 fsck,即使我没有公开写入数据。我把这当作一个惨痛的教训,不能这么粗心。奇怪的是,我确实在磁盘上的错误位置发现了一些丢失的元数据。这就是我能够恢复超级块和相当多的索引节点表条目的方法。看起来好像系统在混乱中将它们写入了磁盘上的几个数据区域。通过校验和过滤它们,我在这些扫描中发现了 5-10 个部分项目的副本。
然而,就在几天前,类似的腐败事件再次发生(我希望也许没有那么严重)。我的数据磁盘上有一个 Ext4 分区(默认选项),但机器出现电源问题。机器不断自发关闭。该磁盘是使用仅一年的 4TB 希捷磁盘。终于换了一个电源,安装好,开机,发现数据盘损坏了。我进行了几次(5?)尝试启动,每次都进入紧急/安全模式。烦人的启动屏幕向我隐藏了启动尝试期间发生的情况。我终于意识到启动失败,因为我的数据磁盘已在 fstab 中列出,但无法安装。从 fstab 中删除它,系统启动正常。查看磁盘,发现它已损坏。超级块——确切地说是块 0 的全部——都是 0xFF。然而,备份子块和 GDT 都很好。在使用的 inode 条目中,大约 0.5% 也被直接 0xFF 覆盖 - 包括第一个 inode 块(inode 1-11)(也就是说,其中 99.5% 看起来很好)。 0xFF 覆盖始终是块边界上的整数个块。当我开始更详细地检查文件系统时,我发现目录文件的几乎所有 inode 条目都被 0xFF 覆盖 - 一次覆盖整个块。因此,虽然只有 0.5% 的 inode 正在使用,但它是最不方便丢失的 0.5%。此外,几个较高级别的目录文件看起来好像所有条目(“.”、“..”除外)都已被删除。也就是说,“..”条目的rec_len字段被扩展至块的末尾,并且目录文件的后续块将第一个条目的inode号设置为零。
所以,看起来好像当我尝试启动时,fsck 会自动运行。由于我不明白的原因,它删除了几个目录中的所有文件,然后用直接 0xFF 覆盖关键元数据块。它会自动完成此操作 - 无需征求我的批准此“修复”。
我有几个问题:
这可能是由于文件系统日志损坏,然后 fsck 疯狂尝试协调吗?如果不是,什么可能导致这种情况?
是否有某种原因导致具有日志功能的 Ext4 实际上比旧的 ext2 或 ext3 文件系统更容易通过这种故障模式丢失数据?
如何配置下一个数据磁盘文件系统以尽可能确保这种情况不再发生?我计划尽可能恢复最新的数据磁盘,然后设置启用校验和的 Ext4 文件系统。另外,我听说有一个选项可以启用日志的校验和 - 这是可取的吗?对我来说,可靠性比性能更重要 - 但我也没有资金建立大型 raid 阵列。对于我的目的来说,有比 Ext4 更好的文件系统吗?
我可以在 Ubuntu Mate 中设置一个选项来限制 fsck 尝试自动“修复”我的文件系统(在启动时或以其他方式)的操作吗?禁用日记对我来说会更好吗?我不希望 fsck 自动删除文件!事实上,我正在认真考虑删除 fsck 并编写自己的修复代码 - 但必须有一种更简单的方法。
我在网上google了一下,看看其他人是否也遇到过这种情况,但找不到任何其他案例。如果这种常见的故障模式在六个月内发生在我身上三次,那么它肯定会影响到其他许多人。但是,我在网上找不到该问题的任何其他描述。
答案1
不幸的是,除了“轻度极客”使用之外,我并不是 ext4 的专家。
为了避免这些事情再次发生,您可以采取一些步骤,例如:
切勿为了节省电源设备 (PSU) 而购买最便宜的电源设备,这可能会或可能不会发生故障。没有什么可说的。
可选地,如果您确实获得了可用资金,您可以购买不间断电源 (UPS),放置在墙壁插座和计算机的 PSU 之间。它将在停电时提供备用电池,此外,还将针对电网上可能发生的浪涌、尖峰和其他奇怪情况提供额外的保护。根据我的经验,我知道这是一项很好的投资。您可能需要一台 400W(或者更大,如果您的计算机和其他设备消耗更多功率)的 UPS,只是为了让您的计算机运行几分钟,以便您可以在需要时正常关闭它,而不是看到它一切立刻变得黑暗和安静。 UPS 也可能让您的 PSU 更满意。
创建现场救援系统。 Knoppix 是一个专门针对这个原因的发行版。我最近尝试了一些 MX Linux,它允许您在 USB 设备(如 16GB 闪存驱动器)上自定义 Live CD 环境并持久,这意味着设置和更改都会被保存。因此,您可以删除许多不需要的软件并添加一大堆可能对某种恢复有用的工具。重新掌握实时系统,并为小型备份(例如撤消文件)提供一些额外空间,然后就可以开始了。如果发生类似情况,只需运行实时系统,这样它就不会自动检查内部磁盘等上的任何文件系统。如果需要,实时系统还可以帮助访问在线资源以查找信息或其他帮助。
- 使用带菜单的引导加载程序(GRUB2 通常是一个不错的选择),它会等待几秒钟,然后再进入默认引导条目。正如您所描述的那样,它可以让您在直接进入潜在的自动化疯狂之前做其他事情。