从单磁盘 raid1 阵列恢复数据

从单磁盘 raid1 阵列恢复数据

我曾想过使用 RAID 阵列中的多个外部磁盘驱动器来构建 Raspberry Pi 文件服务器。首先,我只有一个 1TB 磁盘,因此我在该磁盘上设置了一个 raid1 阵列,以便以后添加其他驱动器。

最后,这被证明是一个坏主意,并且不太适合我的用例,所以现在我想将磁盘转换回“正常”磁盘。我已按照此操作https://superuser.com/questions/971549/how-to-convert-a-software-raid-1-partition-to-non-raid-partition我觉得这正是我想要的。我猜不是,因为现在我的磁盘似乎无法挂载。

我现在有什么选择?有办法恢复我的数据吗?

我将在这里粘贴在将超级块归零之前运行的各种命令的输出。

$ sudo cat /proc/mdstat
Personalities : [raid1]
md0 : active raid1 sda1[0]
      976595904 blocks super 1.2 [1/1] [U]
      bitmap: 0/8 pages [0KB], 65536KB chunk

unused devices: <none>
$ sudo mdadm --detail /dev/md0
/dev/md0:
           Version : 1.2
     Creation Time : Sat Sep  5 14:02:15 2020
        Raid Level : raid1
        Array Size : 976595904 (931.35 GiB 1000.03 GB)
     Used Dev Size : 976595904 (931.35 GiB 1000.03 GB)
      Raid Devices : 1
     Total Devices : 1
       Persistence : Superblock is persistent

     Intent Bitmap : Internal

       Update Time : Mon Apr 19 11:46:30 2021
             State : clean
    Active Devices : 1
   Working Devices : 1
    Failed Devices : 0
     Spare Devices : 0

Consistency Policy : bitmap

              Name : raspberrypi:0  (local to host raspberrypi)
              UUID : a1cd3f87:6165ec4a:d68c7589:708a0fe3
            Events : 74

    Number   Major   Minor   RaidDevice State
       0       8        1        0      active sync   /dev/sda1
$ sudo fdisk -l
...
Disk /dev/sda: 931.48 GiB, 1000170586112 bytes, 1953458176 sectors
Disk model: Elements 2621
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: C70BB0D7-644F-4911-B379-A3729BB61C3D

Device     Start        End    Sectors   Size Type
/dev/sda1   2048 1953458142 1953456095 931.5G Linux filesystem


Disk /dev/md0: 931.35 GiB, 1000034205696 bytes, 1953191808 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
$ sudo mdadm --stop /dev/md0
mdadm: stopped /dev/md0

$ sudo mdadm --zero-superblock /dev/sda1

$ sudo mount /dev/sda1 /mnt/ext
mount: /mnt/ext: wrong fs type, bad option, bad superblock on /dev/sda1, missing codepage or helper program, or other error.

答案1

由于 RAID 超级块最初是在磁盘开始处创建的,因此真正的数据是在之后才开始的。

通常,这就是您想要的,因为它可以确保对磁盘的任何访问都通过 RAID,并且集合保持一致,但这也意味着 RAID 的块 0 不是磁盘的块 0。

所以这意味着需要移动数据。这可以就地完成,dd因为您要将块从后面移动到前面,但如果该过程被中断,您可能会丢失数据,而且这是不可逆的,因为dd不能以相反的顺序工作,您需要将块移向磁盘的末端。

此时我会问自己是否值得付出努力。单磁盘 RAID1 的开销是内核在经过良好优化的代码路径中为每个请求添加偏移量。对您来说,最简单的解决方法是使用该--assume-clean选项重新创建 RAID。

答案2

最后,我设法使用 TestDisk 程序恢复了我的 ext4 分区。 https://www.cgsecurity.org/wiki/TestDisk

我没有恢复 RAID 设置,但所有数据都已保存。

相关内容