从损坏的 RAID1 中恢复文件系统

Jak*_*kub 2 raid ext4 mdadm data-recovery synology

TL;DR 如何ext4从损坏的 RAID1 分区恢复文件系统?

我的情况

我有一个属于 Synology DiskStation 上的 RAID1 阵列的故障磁盘,另一个丢失了。使用ddrescue我已将大部分相关数据复制到新磁盘。分区表幸免于难,但是一些对 RAID 设置必不可少的块已损坏。

# fdisk -l /dev/sdd
Disk /dev/sdd: 3000.6 GB, 3000592982016 bytes
255 heads, 63 sectors/track, 364801 cylinders, total 5860533168 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disk identifier: 0x0003f44a

   Device Boot      Start         End      Blocks   Id  System
/dev/sdd1             256     4980735     2490240   fd  Linux raid autodetect
/dev/sdd2         4980736     9175039     2097152   fd  Linux raid autodetect
/dev/sdd3         9437184  3907024064  1948793440+  fd  Linux raid autodetect
Run Code Online (Sandbox Code Playgroud)

实际数据在第三个分区上/dev/sdd3,但mdadm无法组装阵列。

# mdadm --examine /dev/sdd
/dev/sdd:
   MBR Magic : aa55
Partition[0] :      4980480 sectors at          256 (type fd)
Partition[1] :      4194304 sectors at      4980736 (type fd)
Partition[2] :   3897586881 sectors at      9437184 (type fd)


# mdadm --examine /dev/sdd3
mdadm: No md superblock detected on /dev/sdd3.
Run Code Online (Sandbox Code Playgroud)

结果我无法挂载分区。数据就在那里,它被诸如foremost.

我也尝试过使用extundelete,但它在没有适当的 ext 超级块的情况下失败。

# extundelete --superblock /dev/sdd3
extundelete: failed to read-only open device "/dev/sdd3": Error code 2133571347
Run Code Online (Sandbox Code Playgroud)

问题

如何从损坏的 RAID1 分区中恢复文件和目录?

有没有办法重新创建md superblock, 而不丢失现有数据?

是否可以忽略 md 部分,将分区视为损坏的ext4分区并以这种方式恢复?

Ter*_*nen 5

您可以使用循环挂载将磁盘映像中的分区挂载为设备。创建循环设备时,您提供一个偏移量,使循环设备从分区中的那个位置开始。

这样你就可以跳过丢失的 MD 超级块,并使循环设备在 ext4 分区或可能的 LVM 的开头启动。

现在,我们需要知道 MD 超级块的大小,以便在创建循环设备时提供适当的偏移量。

MD 手册文章中,可以看到不同 MD 版本的超级块大小和位置。

0.9 和 1.0 版本在设备的末尾有超级块,因此文件系统从设备的开头开始,您的 mount 命令应该已经成功。因此,您的 RAID Superblock 必须是其他版本。

1.1 版本在设备启动时有超级块,1.2 版本在设备启动后 4k 有超级块。

但是,为以后可能的超级块扩展保留了足够的空间。一位消息人士告诉我,文件系统会在设备启动后启动一兆字节。在这种情况下,您可以尝试以下命令:

losetup /dev/loop0 /dev/sdd3 -o 1048576
mount /dev/loop0 /mnt
Run Code Online (Sandbox Code Playgroud)

第一个命令设置一个循环设备,该设备从/dev/sdd3分区开始的一兆字节偏移处开始。然后,这个循环设备安装在/mnt.

偏移量可以是别的东西,不幸的是,我找不到偏移量实际可能是什么的好来源。