情况:
- 我正在使用 mdadm 创建一个新的 RAID1 阵列。
我不会使用额外的层,例如 LVM 或 dm-crypt。
我注意到元数据版本 1.2 现在是默认版本。我知道如果系统的所有其他部分(例如 grub2)都支持它,那么这是推荐的版本。我的情况就是这样。
- 从联机帮助页和其他几个来源中,我了解到元数据 1.2 意味着超级块存储在磁盘的开头。从一开始就是 4KiB。
- 在我之前创建的 RAID1 阵列上,我使用元数据版本 0.90,它将超级块存储在磁盘末尾。为了防止它被覆盖,我没有对磁盘的最后部分进行分区。
我的目的是使用 GPT 分区表对新的 RAID1 阵列进行分区,第一个分区从扇区 2048 开始。如果一个扇区是 512 字节,这意味着实际分区将从磁盘开头的 1024KiB 开始。
问题:
- 我是否应该采取任何预防措施来防止版本 1.2 超级块被覆盖,或者在扇区 2048 处启动第一个分区是否足以相对安全?
- 我想象 grub 会在磁盘的开头写入,但它可能只需要前 512 个字节。是否有其他程序在磁盘上的这些字节之后写入?
- 第一个扇区末尾之后的部分(直到扇区 2048)是磁盘的“受管制”部分吗?其他程序在开始写入之前是否检查是否存在其他数据?我找不到任何关于此的具体信息。
我知道 usingdd
可以破坏超级块;-) 也是如此mdadm --zero-superblock
。我更关心任何其他实用程序或文件系统层,例如 LVM,我可能不会立即意识到它们可能会覆盖存储超级块的磁盘的特定部分。
答案1
这都是关于层的。
你有一个磁盘(最底层)。在该磁盘上放置一个分区表。在此基础上,您放置了 RAID。在RAID中你放了LUKS。在 LUKS 上添加 LVM。在 LVM 上,最后是文件系统(最高层)。
Disk -> Partition -> RAID -> LUKS -> LVM -> Filesystem
您可以跳过或重新排序其中一些层。它通常以磁盘开始并以文件系统结束,中间的内容是可选的。
到目前为止没有问题。一切都应该很好。
只要尊重每一层,就不会有冲突。每个层都有元数据,但每个层仅提供可以使用且不会损坏元数据的内容。您无法创建从 开始的分区,sector 0
因为这会与分区表本身发生冲突。您无法md
通过写入md
设备来损坏元数据。您可以将文件系统填满,它不会损坏文件系统元数据,也不会损坏其下面的任何层,因为每一层都会照顾自己。
因此,您无需担心任何事情。
除非你不再尊重这些层次。
你提到了 RAID 和 GPT。您可以将 RAID 放在 GPT 分区上,或将 GPT 放在 RAID 上。只要一层在另一层上,就完全没有问题。但是假设您尝试同时并排使用两个层呢?您使用 GPT 对磁盘进行分区,同时使整个磁盘成为 RAID 的成员。
实在不行。
GPT 在开头和结尾都有元数据; RAID 在开始或结束时都有元数据(因为md
它取决于元数据版本)。 RAID 元数据可能会完全覆盖 GPT(反之亦然)。或者它实际上看起来可能有效,因为偏移量略有不同,但这仍然是一个可怕的情况。
假设您想同时使用另一层,您将其放在哪里?如果你把它放在RAID上,它可能会跨越创建分区的边界。如果您将其放在分区上,它将绕过 RAID 层,因此不会被镜像。当数据损坏时,RAID 相信自己是同步的。
突然之间,各层之间开始互相争斗,而他们本应合作和互补。
答案2
您不必担心这一切。卷中的数据不会与元数据重叠。不然管理起来会非常困难!例如,每个磁盘的外观如下(未按比例):
[--------------------- sda ------------------------]
[---][------------------ sda1 ---------------------]
[---][----------------------------------------]
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ one copy of the data in /dev/md0
^^^^ superblock
^^^^ partition table
分区表不包含在分区中,并且 RAID 元数据不包含在 RAID 卷内。当您将内容放入 RAID 卷时,该内容将占用元数据未占用的部分。您无需做任何特殊安排。