如何从单个降级的 mdadm raid1 驱动器恢复文件?“不足以启动阵列”

Bry*_*yce 7 software-raid mdadm data-recovery

给定一个处于降级/重建状态的 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)
Run Code Online (Sandbox Code Playgroud)

在这种特殊情况下,该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)
Run Code Online (Sandbox Code Playgroud)

fro*_*utz 8

如果是 RAID 1,并且您知道数据偏移量(例如 2048 个扇区,通常可以通过 找出确切的数据偏移量mdadm --examine /dev/sdb1),那么您可以创建一个只读(为了安全)循环设备,如下所示:

# losetup --find --show --read-only --offset $((2048*512)) /dev/sdb1

/dev/loop7
Run Code Online (Sandbox Code Playgroud)

然后尝试检查然后安装打印的循环设备:

# fsck.ext3 -n -v /dev/loop7
# mount -o ro /dev/loop7 /mnt/recovery
Run Code Online (Sandbox Code Playgroud)

mount 可能可以直接使用-o ro,loop,offset=选项执行此操作,但我更喜欢手动创建循环设备,以确保它确实是只读的。

如果文件系统本身损坏,您应该使用 制作一个图像dd,并fsck在该图像上运行诸如此类的实验。或者,您可以使用 Linux 网络块设备在磁盘顶部放置一个写时复制层,这样您就可以在fsck该层上不实际写入任何内容到磁盘本身(nbd-server -c/ nbd-client,将创建一个/dev/nbdX供您使用的设备)。可能可以使用设备映射器执行相同的操作 - 但我从未尝试过。