我不小心用垃圾覆盖了所有 RAID1 超级块。我认为发生这种情况是因为当 Ubuntu 将我置于某种硬盘恢复模式时,我按 ALT-CTRL-DEL 启动了。我的显示器无法工作,我“盲目”地这样做了。
查看我的 RAID 分区,我看到以下内容:
# mdadm --examine /dev/sdc2
/dev/sdc2:
Magic : a92b4efc
Version : 0.90.00
UUID : 00000000:00000000:00000000:00000000
Creation Time : Fri Nov 1 18:59:05 2013
Raid Level : -unknown-
Raid Devices : 0
Total Devices : 1
Preferred Minor : 127
Update Time : Fri Nov 1 18:59:05 2013
State : active
Active Devices : 0
Working Devices : 1
Failed Devices : 0
Spare Devices : 1
Checksum : 6b1f0d22 - correct
Events : 1
Number Major Minor RaidDevice State
this 0 8 34 0 spare /dev/sdc2
0 0 8 34 0 spare /dev/sdc2
很明显,超级块已被垃圾完全覆盖。两个磁盘(sdb2、sdc2)看起来相同,信息是垃圾,uuid 全部为零,raid 级别:未知,raid 设备:0 等。
我最好的选择是:
mdadm --create --assume-clean --metadata=0.90 /dev/md0 --level=1 --raid-devices=2 /dev/sdb2 /dev/sdc2
我可以像这样使用 mdadm --create 重新创建 RAID 阵列吗?
在 RAID 堆栈上,我有一个 LVM2 物理卷。我能否以某种方式从各个磁盘或备份磁盘映像访问我的 LVM2 数据?
GRUB 能够从磁盘找到我的 initrd 和内核映像,/boot 位于 LVM2 之上的 ext4 根分区文件系统上,它不是一个单独的分区。所以我相信数据基本完好,超级块已经消失了。
编辑:将 --assume-clean 添加到 mdadm 命令行
答案1
如果它是0.90
超级块格式,您应该能够直接使用成员(如果您愿意,可以在只读模式下)。这样您就可以访问数据,然后您可以仅使用另一个磁盘创建一个新的 RAID-1,复制数据,然后将原始磁盘添加到 RAID。
如果是其他东西(例如1.2
元数据),您首先必须找到实际分区的偏移量,然后才能安装它。例如,如果是 LVM,您将得到如下偏移量:
# grep -a -b --only-matching LEVELONE /dev/disk
1049088:LABELONE
减去 512,因为 PV 上的第一个扇区是空闲的;如果它实际上是0.90
或1.0
元数据,那么 grep 应该显示 512: 相反,这意味着0
;的实际偏移量。如果你得到更大的东西,你的 RAID 正在使用其他格式。
在这种情况下,您可以创建具有正确偏移量的循环设备:
# losetup -f --show --read-only --offset $((1049088-512)) /dev/disk
/dev/loop0
# file -s /dev/loop0
LVM2 ...
这应该是你的 PV 和vgscan
/vgchange -a y
应该处理其余的事情。
至于mdadm --create
,如果你知道自己在做什么,就可以做到。你必须非常非常小心地对待它。这只是最后的手段。
如果偏移量是0
确保您使用0.90
元数据(如果您确定这就是您正在使用的);如果偏移量是其他的,请确保mdadm --create
将再次使用相同的偏移量。它mdadm
的默认值通常不会随着时间的推移而改变。因此,直接在命令行上使用 指定它--data-offset
。
另外,只使用一个磁盘创建它。将另一个磁盘保留为missing
。这是一种更好的方法,--assume-clean
因为您可以先检查创建是否成功(设备上的数据是否/dev/md?
可用?),然后正确同步另一个磁盘。