Mic*_*aff 9 linux software-raid raid10
在创建一个linux软件raid设备作为raid10设备时,我很困惑为什么必须对其进行初始化。实际上,同样的问题适用于 raid1 或 raid0。
最终,大多数人会在其上放置某种文件系统,并且该文件系统不应假设磁盘数据的任何状态。每次写入都会影响 raid10 或 raid1 设置中的两个磁盘,其中写入了 N 个镜像。应该没有任何理由最初初始化 raid10,因为它会随着时间的推移而发生。
我可以理解为什么对于需要奇偶校验的 raid5/6 设置,但即使如此,这似乎也可以懒惰地完成。
只是为了让人们感觉更好吗?
作为镜像的 Raid 1 依赖于镜像中的所有磁盘都是彼此的精确副本。拿你的随机硬盘和另一个随机硬盘,你可能有不同的数据,从而违反了这个假设。这就是为什么需要初始化。它只是将第一个驱动器的内容复制给其他驱动器。请注意,在某些情况下,您可以避免不初始化驱动器 - 通常出厂新设备已经到处都是零,因此您可以简单地忽略这一点。该mdadm选项--assume-clean执行此操作,但会警告您:
Run Code Online (Sandbox Code Playgroud)--assume-clean告诉 mdadm 该阵列预先存在并且已知是干净的。在尝试从重大故障中恢复时,它很有用,因为您可以确保除非您实际写入阵列,否则不会影响任何数据。如果您想避免初始重新同步,也可以在创建 RAID1 或 RAID10 时使用它,但是这种做法 - 虽然通常是安全的 - 不推荐。仅当您真正知道自己在做什么时才使用它。
如果你不这样做,驱动器之间就会有差异,它被读取,不知道驱动器会读取什么。您应该对文件系统非常安全(但请注意下面的内容),因为很可能您会在从该设备读取任何内容之前进行写入,然后您就清楚了。
请注意,至少 Linuxmdadm会在后台初始化数组。您可以在第一秒愉快地在其上创建 FS。在初始化完成之前,性能会受到影响,但这就是一切。
但:
a) 在执行mkfs一些实用程序时,请检查该驱动器上是否已经有东西。虽然这只涉及驱动器的几个众所周知的区域,但它会在您写入任何内容之前读取,从而使您处于危险之中。
b) 如果您对阵列进行定期重新同步,则 RAID 设备对您的 FS 一无所知。它只是从每个设备读取每个块并进行比较。如果您没有使用写时复制 FS(例如 ZFS 或 BTRFS)并且从不填充您的 FS,那么从 FS 的角度来看,块多年未初始化是完全合理的。
出于同样的原因,您与 RAID5 设备或任何其他级别(RAID0 除外)重新同步。它读取所有数据并比较/验证 RAID 校验和(在 RAID 5 或 6 中)。如果以任何方式翻转了一点(因为 HD 内存会自发翻转,因为你和你的 5 个邻居的手机只是不小心干扰了盘片的这个特定区域,无论如何)它会检测到不一致,但将无法帮你。如果,OTOH,其中一个硬盘驱动器只会报告“我无法读取该块”,这更有可能是驱动器出现故障,您只是在早期检测到故障,并减少了在降级模式下运行的时间(从驱动器故障,而不是从您注意到它时开始)。如果一个驱动器出现故障,Raid 将无济于事,如果您不这样做,一个月后另一个驱动器也会出现故障”
现在,对于 RAID10,以上所有内容都成立。毕竟 RAID10 只是告诉“我将我的两个 RAID1 设备放在一个 RAID0 对中”的一种聪明方式。
这都是未定义的行为。为什么我在 Linux 上检查过,使用mdadm其他软件 RAID 实现的行为可能会有所不同。mdadm除了我使用的其他版本的 Linux 内核和/或工具也可能表现不同。
请记住,RAID 1 是一个镜像,而 RAID 10 是一个镜像条带。
问题是,每个镜像的哪个磁盘上的数据是有效的?在新创建的阵列中,这是无法知道的,因为磁盘可能具有不同的数据。
还请记住,RAID 在非常低的级别上运行;它对文件系统或磁盘上可能存储的任何数据一无所知。有可能甚至是在使用一个文件系统。
因此,这些阵列中的初始化包括将来自每个镜像中一个磁盘的数据按原样复制到另一个磁盘。
这也意味着数组从创建的那一刻起就可以安全使用,并且可以在后台进行初始化;大多数 RAID 控制器(和 Linux mdraid)都有一个选项,或者自动执行。