给定一个处于降级/重建状态的 raid1 驱动器,是否可以强制安装它?我想在进行配对和重建的危险操作之前恢复所有文件。据我所知,驱动器状态良好,完好无损。该对驱动器部分发生故障。
如果驱动器未处于重建状态,我会确切地知道该怎么做。这是我尝试过的:
# mdadm --verbose --assemble /dev/md8 /dev/sdb1 --force
mdadm: looking for devices for /dev/md8
mdadm: /dev/sdb1 is identified as a member of /dev/md8, slot 1.
mdadm: no uptodate device for slot 0 of /dev/md8
mdadm: added /dev/sdb1 to /dev/md8 as 1
mdadm: /dev/md8 assembled from 0 drives and 1 rebuilding - not enough to start the array.
# cat /proc/mdstat
md8 : inactive sdb1[1](S)
976759808 blocks super 1.2
md0 : active raid1 sdc1[0]
976759672 blocks super 1.2 [2/1] [U_]
# mdadm --stop /dev/md8
mdadm: stopped /dev/md8
# mount /dev/sdb1 /mnt/temp2
mount: unknown filesystem type 'linux_raid_member'
# mount -o ro -t ext3 -b 2048 /dev/sdb1 /mnt/temp1
mount: wrong fs type, bad option, bad superblock on /dev/sdb1.
# foremost -i /dev/sdb -o /tmp/foo (this results in perfectly good files)
在这种特殊情况下,该foremost
命令会恢复文件,因此如果我只能获得正确的超级块偏移量,那么驱动器上肯定有东西。
在这种特殊情况下,组装数组的两半会导致内核崩溃(!),因此这无论如何都不是一个真正的选择(除了安全问题)。
更新:添加了 mdadm 的输出
# mdadm --examine /dev/sdb1
/dev/sdb1:
Magic : a92b4efc
Version : 1.2
Feature Map : 0x2
Array UUID : e00a291e:016bbe47:09526c90:3be48df3
Name : ubuntu:0
Creation Time : Wed May 11 12:26:39 2011
Raid Level : raid1
Raid Devices : 2
Avail Dev Size : 1953519616 (931.51 GiB 1000.20 GB)
Array Size : 1953519344 (931.51 GiB 1000.20 GB)
Used Dev Size : 1953519344 (931.51 GiB 1000.20 GB)
Data Offset : 2048 sectors
Super Offset : 8 sectors
Recovery Offset : 0 sectors
State : clean
Device UUID : 41346f44:ccacbbf7:0c17c133:eb7b341f
Update Time : Sat Apr 13 00:02:08 2013
Checksum : 483a0a44 - correct
Events : 402833
Device Role : Active device 1
Array State : AA ('A' == active, '.' == missing)
答案1
如果是 RAID 1,并且您知道数据偏移量(例如 2048 个扇区,通常可以通过 找到确切的数据偏移量mdadm --examine /dev/sdb1
),那么您可以创建一个只读(为了安全起见)循环设备,如下所示:
# losetup --find --show --read-only --offset $((2048*512)) /dev/sdb1
/dev/loop7
然后尝试检查然后安装打印的循环设备:
# fsck.ext3 -n -v /dev/loop7
# mount -o ro /dev/loop7 /mnt/recovery
mount 可能可以直接使用-o ro,loop,offset=
选项来执行此操作,但我更喜欢手动创建循环设备,只是为了确保它确实是只读的。
如果文件系统本身损坏,您应该使用 制作一个镜像,并在该镜像上dd
运行诸如此类的实验。fsck
或者,您可以使用 Linux 网络块设备在磁盘顶部放置一个写时复制层,这样您就可以fsck
在该层上实际写入任何内容而不需要在磁盘本身上写入任何内容(nbd-server -c
/ nbd-client
,将创建一个/dev/nbdX
设备供您使用)。也许可以使用设备映射器执行相同的操作 - 但我从未尝试过。
答案2
您应该能够使用以下命令将阵列中的 raid 设备数量设置为 1:
mdadm /dev/md8 --grow --raid-devices=1 --force
之后查看/proc/mdstat
是否md8
处于活动状态。在复制数据之前,您可能应该将其安装为只读。