我的理解是,硬盘驱动器和SSD会在驱动器内部实现一些基本的错误纠正,而大多数RAID配置(例如mdadm)将依赖于此来决定何时驱动器无法纠正错误并需要脱机。但是,这取决于存储的错误诊断准确率100%。事实并非如此,并且像两个驱动器的RAID-1镜像这样的常见配置将很容易受到攻击:假设一个驱动器上的某些位被静默损坏,并且该驱动器未报告读取错误。因此,诸如btrfs和ZFS之类的文件系统将实现其自己的校验和,以便不信任有故障的驱动器固件,故障SATA电缆等。
同样,RAM也可能存在可靠性问题,因此我们拥有ECC RAM来解决此问题。
我的问题是:如何保护Linux交换文件免受两磁盘配置(即,使用主线内核驱动程序)上的驱动器固件捕获的静默破坏/位腐的静默破坏/位腐烂?在我看来,此处缺少端到端保护的配置(例如btrfs提供的配置)在某种程度上抵消了ECC RAM带来的省心。但是我想不出一个好方法:
- btrfs根本不支持交换文件。您可以从btrfs文件设置一个循环设备,然后在该设备上进行交换。但这有问题:
- 随机写入效果不佳:https://btrfs.wiki.kernel.org/index.php/Gotchas#Fragmentation
- 关于禁用写时复制的建议也将禁用校验和-从而破坏了本练习的重点。他们的假设是数据文件具有自己的内部保护。
- ZFS Linux上允许使用ZVOL作为交换,我想可以工作:http://zfsonlinux.org/faq.html#CanIUseaZVOLforSwap -然而,从我读书,ZFS通常苛刻的内存,并得到它的交换工作-仅应用程序听起来像一些工作来解决它。我认为这不是我的首选。为什么要为了可靠的交换而不得不使用树外内核模块,这超出了我的范围-在当今时代,对于大多数现代Linux发行版/内核,肯定有一种方法可以做到这一点?
- 有其实用的补丁,使内存管理器本身的校验,对于正是我在这个问题上讨论的原因,一个Linux内核邮件列表上的螺纹: http://thread.gmane.org/gmane.linux.kernel/989246 -不幸的是,据我所知,该补丁死了,并且从未出于我不知道的原因将其发布到上游。太糟糕了,听起来像是一个不错的功能。另一方面,如果将交换放在RAID-1上-如果损坏超出了校验和的修复能力,则希望内存管理器在出现紧急情况或其他原因之前尝试从其他驱动器读取数据。可能超出了内存管理器应做的工作范围。
综上所述:
- RAM具有ECC纠正错误
- 永久存储中的文件具有btrfs来更正错误
- 掉期有??? <---这是我的问题