我的理解是硬盘驱动器和 SSD 在驱动器内部实现了一些基本的错误纠正,并且大多数 RAID 配置(例如 mdadm)将依赖于此来决定驱动器何时无法纠正错误并需要脱机。但是,这取决于存储在其错误诊断中是否 100% 准确。事实并非如此,像两驱动器 RAID-1 镜像这样的常见配置将容易受到攻击:假设一个驱动器上的某些位被悄悄损坏并且驱动器没有报告读取错误。因此,像 btrfs 和 ZFS 这样的文件系统实现了自己的校验和,以免信任有问题的驱动器固件、故障 SATA 电缆等。
同样,RAM 也可能存在可靠性问题,因此我们有 ECC RAM 来解决这个问题。
我的问题是:在两盘配置(即使用主线内核驱动程序)上,保护 Linux 交换文件免受静默损坏/位腐烂没有被驱动器固件捕获的规范方法是什么?在我看来,这里缺少端到端保护的配置(例如 btrfs 提供的配置)在某种程度上否定了 ECC RAM 带来的安心。但我想不出一个好方法:
- btrfs 根本不支持交换文件。您可以从 btrfs 文件设置循环设备并对其进行交换。但这有问题:
- Linux 上的 ZFS 允许使用 ZVOL 作为交换,我想这可以工作:http: //zfsonlinux.org/faq.html#CanIUseaZVOLforSwap - 然而,从我的阅读来看,ZFS 通常对内存有要求,并让它在交换中工作-only 应用程序听起来像一些工作来解决它。我认为这不是我的第一选择。为什么你必须使用一些树外内核模块来获得可靠的交换是我无法理解的 - 在这个时代,肯定有一种方法可以用大多数现代 Linux 发行版/内核来实现这一点?
- Linux 内核邮件列表上实际上有一个线程,带有补丁可以在内存管理器本身内启用校验和,这正是我在这个问题中讨论的原因:http : //thread.gmane.org/gmane.linux.kernel/989246 -不幸的是,据我所知,由于我不知道的原因,补丁已经死了,并且再也没有进入上游。太糟糕了,这听起来像是一个不错的功能。另一方面,如果您将交换放在 RAID-1 上 - 如果损坏超出了校验和修复的能力,您会希望内存管理器在恐慌或其他之前尝试从另一个驱动器读取,这是可能超出了内存管理器应该做的范围。
总之:
- RAM 有 ECC 来纠正错误
- 永久存储上的文件有 btrfs 来纠正错误
- 交换有???<---这是我的问题