![将 RAID 超级块放在设备末端有什么风险?](https://linux22.com/image/793305/%E5%B0%86%20RAID%20%E8%B6%85%E7%BA%A7%E5%9D%97%E6%94%BE%E5%9C%A8%E8%AE%BE%E5%A4%87%E6%9C%AB%E7%AB%AF%E6%9C%89%E4%BB%80%E4%B9%88%E9%A3%8E%E9%99%A9%EF%BC%9F.png)
我想使用 mdadm 设置 RAID 1 阵列来存储备份(我将使用 rsnapshot 进行实际备份)。我读到使用元数据 0.9 或 1.0 格式的 RAID 1 很有优势,因为它们将超级块放在设备的末尾,这样即使不使用 mdadm 也可以读取文件系统。这对于备份应用程序来说似乎很有吸引力,因为这意味着如果发生 RAID 故障,我仍然可以从各个磁盘恢复数据。但是,Linux RAID 维基对这一主题发表了以下听起来令人恐惧的言论:
如果您对 raid 内容进行任何类型的自动安装/自动检测/自动激活,则将超级块放在设备末尾是危险的;在某些情况下(在 blkid 的情况下:如果超级块已损坏),raid 组件可能会被检测为有效的文件系统(或其他格式),其中可能包含过时的数据。这将使阵列不同步并危及数据。
有人能解释一下这是什么意思吗?我应该对此有多担心?这是否意味着如果我将超级块放在最后并在 fstab 中列出没有该noauto
选项的 RAID 设备,我会面临数据丢失的风险?或者这是指其他类型的自动化?
答案1
因此,这就是将 RAID 超级块放在设备末端的处理方式。当您使用 mdadm 设置 RAID 1 阵列进行备份时,使用元数据 0.9 或 1.0 格式很不错,因为它将超级块放在设备末端。这意味着您仍然可以读取文件系统而无需 mdadm,如果您的 RAID 出现问题并且您需要从各个磁盘恢复数据,这将非常方便。
但是,有一个问题。Linux RAID Wiki 中说将超级块放在末尾可能会有风险,这听起来很吓人。基本上,如果您正在运行任何自动安装或自动检测功能,您的 RAID 组件可能会被视为有效文件系统,即使它们已损坏。这可能会弄乱您的阵列并弄乱您的数据。
那么,你应该担心吗?嗯,这要视情况而定。如果你打算在 fstab 中列出 RAID 设备而不使用 noauto 选项,那么如果出现问题,你可能会面临数据丢失的风险。这有点像为某些不好的事情敞开大门。
但如果你不做任何花哨的自动安装操作,那么可能没问题。关键在于权衡自动设置的便利性与数据不同步和丢失的潜在风险。
希望这能让事情变得清楚一点!
答案2
无需 mdadm 即可读取文件系统任何状况之下如果您使用的是 RAID1。如果超级块在开头,则需要做一点工作才能读取它。在正常操作期间,这种需要永远不会发生;一旦您拥有 RAID,您就绝不能访问它周围的数据,因此无法意外安装它的优势非常重要。在正确构建的系统中,这种需要根本不会发生;例如,从我自己的经验来看,我几乎不记得有这种需要。
会发生什么?假设你从一个 RAID 支路挂载了文件系统,执行了一些写入操作。一些数据和元数据更改,但它不会反映在任何 RAID 元数据中,因此 RAID 层不可能知道媒体中发生了某些更改。然后,您再次组装 RAID 并尝试访问文件系统。对于 RAID 层来说,两条腿看起来是平等的;它会将读取分散到它们两者。但是,元数据不一致!如果这样使用,即使是最可靠的文件系统也很容易发生严重故障。因此,您必须防止意外直接访问 RAID 层周围的 RAID 启用媒体,以便它帮助您避免灾难 — 而不是导致灾难。
我不明白你在说什么“备份应用程序”。这种访问肯定是不是自动化是合理的。并且,RAID 不是备份,这已经说过很多次了,所以我不知道该说什么,我不明白为什么人们仍然这么想。
不要为可能需要绕过 RAID 层的情况设计存储子系统。不要为取证而设计。相反,进行适当的备份以便永远不需要恢复。例如,您可以定期将整个文件系统映像转储到备份存储(与此阵列分开)。或者定期复制文件。那可以实现自动化并成为备份。并且那可以(并且将会)使您免于首先恢复 RAID 周围的数据。