我有两个硬盘分区,使用将它们组合成 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 来保存数据,除非我需要重新开始并清除所有内容。