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

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

给定一个处于降级/重建状态的 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处于活动状态。在复制数据之前,您可能应该将其安装为只读。

相关内容