为什么 mdadm --zero-superblock 会保留文件系统信息?

为什么 mdadm --zero-superblock 会保留文件系统信息?

我有两个硬盘分区,使用将它们组合成 RAID1 mdadm,并在生成的设备上创建了 ext4 文件系统。

当我mdadm --zero-superblock将这两个分区重新创建为 RAID 时,原始的 ext4 元数据就神奇地保存了下来。

这是为什么?

并且我怎样才能知道mdadm要给我一个真正新的、未初始化的 MD?


细节

如何创建 RAID1 和文件系统:

ls /dev/sdc2  # partition 1
ls /dev/sdd2  # partition 2
mdadm --create --run --verbose /dev/md1 --level=1 --raid-devices=2 /dev/sdc2 /dev/sdd2
mkfs.ext4 -L mylabel /dev/md1

擦除 RAID1:

mdadm --stop /dev/md1
mdadm --zero-superblock /dev/sdc2
mdadm --zero-superblock /dev/sdd2

重新创建 RAID1:

mdadm --create --run --verbose /dev/md1 --level=1 --raid-devices=2 /dev/sdc2 /dev/sdd2

显示设备信息(注意,wipefs没有该-a标志不会擦除任何内容,而只是显示信息):

# wipefs /dev/md1
offset               type
----------------------------------------------------------------
0x438                ext4   [filesystem]
                     LABEL: mylabel
                     UUID:  3d230d31-fb82-46ef-a4e0-e9473e05825c

LABEL: mylabel表明 ext4 标签在 mdadm 超级块擦除和 RAID 重建过程中“幸存”。

怎么可能?

我认为在超级块擦除和重新创建之后,mdadm 应该向我提供该设备的“干净”视图(即全零),除非给出关闭该功能的标志(例如--assume-clean,我没有给出)。

答案1

因为将 mdadm 超级块归零只会删除描述 raid 阵列的元数据,而不会删除有关磁盘其余部分实际内容的信息。这实际上是一件好事,因为这意味着当阵列本身由于某些不幸的原因无法组装时,您可能能够恢复卷。

需要明确的是:因为您使用卷而不是整个磁盘创建阵列,所以分区表不受 mdadm 的影响,因此将 raid 超级块归零不会影响驱动器标签和分区结构。

答案2

还没有看到“彻底删除 raid 元数据”的明确答案吗?

这是我的(检测到之前的 RAID 时的 raid 创建脚本片段):

DISK=drive with partition (eg: /dev/sdc3)
DRIVE=drive without partition (eg: /dev/sdc)
DRIVE_SECTORS=$(fdisk -l $DRIVE | grep Disk | grep sectors | cut -f7 -d ' ')
RAID_OFFSET=$(wipefs $DISK | grep linux_raid_member | sed 's/  */ /g' | cut -d ' ' -f2)
wipefs -o $RAID_OFFSET $DISK
# Zero last 4M of DISK
dd bs=512 if=/dev/zero of=$DRIVE count=8182 seek=$(($DRIVE_SECTORS - 8192))

希望它能节省别人花在我解决这个问题上的时间。

答案3

我也尝试过这个,使用 raid-1 进行数据克隆。 --zero-superblock 之后的数据保存只能在 metadata=0.90 或 1.0 上进行,我猜这是一个错误。因为 metadata=0.90 或 1.0 将超级块放在设备末尾(而 1.1 和 1.2 放在开头),如果您自动激活 raid 内容,那么将超级块放在设备末尾可能会很危险,这将使阵列不同步并危及数据。因此,在 --zero-superblock 之后,我将仅将磁盘用作常规磁盘,并且不再在同一磁盘中使用 raid 来保存数据,除非我需要重新开始并清除所有内容。

相关内容