在有其他分区的磁盘上使用 mdadm --zero-superblock

在有其他分区的磁盘上使用 mdadm --zero-superblock

我有三个磁盘,它们曾经用于存放 MD RAID5 阵列。我后来删除了(或者说我认为是删除了)这个阵列,并为 btrfs 和交换空间创建了分区。重新启动机器时,MD 仍然绑定了用于存放旧阵列的设备,导致新文件系统无法挂载。

有人告诉我,RAID 阵列的旧超级块可能被遗留,导致 MD 认为它是一个真正的阵列,从而绑定磁盘。建议的解决方案是使用 mdadm --zero-superblock 清除受影响磁盘上的超级块。但是,我真的不知道这会对磁盘产生什么影响。由于此磁盘包含分区,我并不想盲目地开始将其部分归零。

那么我应该遵循什么程序才能安全地清除 MD 超级块而不损坏驱动器上的其他分区和文件系统?

这个问题本质上问的是同一件事,但是对于在重新分区的设备上执行 mdadm --zero-superblock 是否真的应该是安全的,并没有明确的答案:mdadm 超级块隐藏/阴影分区

答案1

https://raid.wiki.kernel.org/index.php/RAID_superblock_formats

超级块长度为 4K,写入 64K 对齐块,该块从设备末尾开始至少 64K 且少于 128K(即获取超级块的地址,将设备大小四舍五入为 64K 的倍数,然后减去 64K)。每个设备的可用大小是超级块之前的空间量,因此当设备合并到 MD 阵列中时,64K 到 128K 之间的空间会丢失。

所以,已经太晚了并且可能不安全使用--zero-superblock,因为我们不知道是否有任何数据 - 您必须调整/收缩当前分区到-128Kx-RAID 分区的末尾,然后擦除该部分并重新扩大分区。

其他选项 1:写入大文件以填满整个磁盘,它将覆盖 RAID 超级块,并且 mdadm 无法识别它。

其他选项2:与1类似:https://unix.stackexchange.com/questions/44234/clear-unused-space-with-zeros-ext3-ext4

答案2

wipefs --all /dev/sd[4ppropr14t3][123](当然要为你的驱动器/分区设置 glob!)

答案3

这就是我解决这个问题的方法(它可能与我的情况很相关,但我会尽量使它具有普遍性)。

(当我谈到设备时,我指的是组成 raid 卷的设备,而不是 raid 阵列本身)

我曾经mdadm -E $DEVICE弄清楚过阵列使用的是哪种元数据格式。然后我去raid.wiki.kernel.org查找有关超级块格式的一些信息。在我的例子中,这是版本 0.90。

此格式将超级块存储在设备末端。这就是我的情况。我的旧阵列是直接在驱动器上创建的,没有分区。因此,我知道超级块应该位于设备的最末端。我的新分区在末尾包含一个交换分区。因此,超级块所在的位置不会丢失太多数据。

我读了一些资料,得出的结论是,这只mdadm --zero-superblock会将超级块本身清零,因此对我来说应该是安全的。我继续删除了所有三个设备上的超级块:

mdadm --stop $ONE_OF_THE_DEVICES

根据需要重复此行

mdadm --zero-superblock $DEVICE

一些额外的评论/猜测:

一般来说,如果新分区/文件系统需要空间,那么它应该已经被覆盖。因此,如果超级块仍然存在,将其清零不会损害分区/文件系统。但是,我不确定 MD 如何处理超级块已经在一个或多个设备上被覆盖(但不是全部)的情况。手册页说,如果超级块无效,则需要使用 -f 将超级块清零,但请记住这一点。

相关内容