创建新阵列后恢复RAID 5数据,而不是重复使用


35

敬请市民提供协助-我是新手,头疼重重(完美的风暴情况)。

我在ubuntu 11.04上配置了3个1TB HDD,配置为软件RAID5。数据每周被复制到计算机硬盘驱动器的另一个硬盘上,直到完全失败并被丢弃。几天前,我们停电了,重新启动我的盒子后,该RAID无法挂载。我以无限的智慧进入

mdadm --create -f...

命令代替

mdadm --assemble

直到后来我才注意到我做的怪事。它开始使阵列降级,并继续构建和同步它,此过程耗时约10个小时。回到我后,我发现该阵列已成功启动并运行,但团队未

我的意思是单个驱动器已分区(分区类型f8),但md0设备未分区。惊恐地意识到我所做的一切,我试图找到一些解决方案。我只是祈祷--create没有覆盖硬盘驱动器的全部内容。

有人可以帮我解决这个问题吗-硬盘上的数据非常重要,并且具有约10年的照片,文档等独特信息。

通过以错误的顺序指定参与的硬盘驱动器是否有可能mdadm覆盖它们?当我做

mdadm --examine --scan 

我得到类似 ARRAY /dev/md/0 metadata=1.2 UUID=f1b4084a:720b5712:6d03b9e9:43afe51b name=<hostname>:0

有趣的是,过去曾经有足够的名字被“突袭”,而不是主机名后面附加了0 :。

这是“经过消毒的”配置条目:

DEVICE /dev/sdf1 /dev/sde1 /dev/sdd1

CREATE owner=root group=disk mode=0660 auto=yes

HOMEHOST <system>

MAILADDR root


ARRAY /dev/md0 metadata=1.2 name=tanserv:0 UUID=f1b4084a:720b5712:6d03b9e9:43afe51b


Here is the output from mdstat

cat /proc/mdstat 
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10] 
md0 : active raid5 sdd1[0] sdf1[3] sde1[1]
1953517568 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/3] [UUU]

unused devices: <none>


fdisk shows the following:

fdisk -l

Disk /dev/sda: 80.0 GB, 80026361856 bytes
255 heads, 63 sectors/track, 9729 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x000bf62e

Device Boot Start End Blocks Id System
/dev/sda1 * 1 9443 75846656 83 Linux
/dev/sda2 9443 9730 2301953 5 Extended
/dev/sda5 9443 9730 2301952 82 Linux swap / Solaris

Disk /dev/sdb: 750.2 GB, 750156374016 bytes
255 heads, 63 sectors/track, 91201 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x000de8dd

Device Boot Start End Blocks Id System
/dev/sdb1 1 91201 732572001 8e Linux LVM

Disk /dev/sdc: 500.1 GB, 500107862016 bytes
255 heads, 63 sectors/track, 60801 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00056a17

Device Boot Start End Blocks Id System
/dev/sdc1 1 60801 488384001 8e Linux LVM

Disk /dev/sdd: 1000.2 GB, 1000204886016 bytes
255 heads, 63 sectors/track, 121601 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x000ca948

Device Boot Start End Blocks Id System
/dev/sdd1 1 121601 976760001 fd Linux raid autodetect

Disk /dev/dm-0: 1250.3 GB, 1250254913536 bytes
255 heads, 63 sectors/track, 152001 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000

Disk /dev/dm-0 doesn't contain a valid partition table

Disk /dev/sde: 1000.2 GB, 1000204886016 bytes
255 heads, 63 sectors/track, 121601 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x93a66687

Device Boot Start End Blocks Id System
/dev/sde1 1 121601 976760001 fd Linux raid autodetect

Disk /dev/sdf: 1000.2 GB, 1000204886016 bytes
255 heads, 63 sectors/track, 121601 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0xe6edc059

Device Boot Start End Blocks Id System
/dev/sdf1 1 121601 976760001 fd Linux raid autodetect

Disk /dev/md0: 2000.4 GB, 2000401989632 bytes
2 heads, 4 sectors/track, 488379392 cylinders
Units = cylinders of 8 * 512 = 4096 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 524288 bytes / 1048576 bytes
Disk identifier: 0x00000000

Disk /dev/md0 doesn't contain a valid partition table

根据建议,我确实清理了超级块,并重新创建了带--assume-clean选项的阵列,但一点都不幸运。

是否有任何工具可以帮助我恢复至少一些数据?有人可以告诉我mdadm --create在同步以销毁数据时会做什么,以及如何做,以便我可以编写一个工具来撤消所做的一切?

重新创建团队之后,我运行fsck.ext4 / dev / md0,这是输出

root @ tanserv:/ etc / mdadm#fsck.ext4 / dev / md0 e2fsck 1.41.14(22-Dec-2010)fsck.ext4:超级块无效,正在尝试备份块... fsck.ext4:超级魔术字符错误尝试打开/ dev / md0时阻止

无法读取超级块或没有描述正确的ext2文件系统。如果设备有效并且确实包含ext2文件系统(而不是swap或ufs或其他东西),则超级块已损坏,您可以尝试使用备用超级块运行e2fsck:e2fsck -b 8193


我尝试过的Per Shanes的建议

root@tanserv:/home/mushegh# mkfs.ext4 -n /dev/md0
mke2fs 1.41.14 (22-Dec-2010)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=128 blocks, Stripe width=256 blocks
122101760 inodes, 488379392 blocks
24418969 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=0
14905 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks: 
    32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208, 
    4096000, 7962624, 11239424, 20480000, 23887872, 71663616, 78675968, 
    102400000, 214990848

并在每个备份块上运行fsck.ext4,但是全部返回以下内容:

root@tanserv:/home/mushegh# fsck.ext4 -b 214990848 /dev/md0
e2fsck 1.41.14 (22-Dec-2010)
fsck.ext4: Invalid argument while trying to open /dev/md0

The superblock could not be read or does not describe a correct ext2
filesystem.  If the device is valid and it really contains an ext2
filesystem (and not swap or ufs or something else), then the superblock
is corrupt, and you might try running e2fsck with an alternate superblock:
    e2fsck -b 8193 <device>

有什么建议么?

问候!


1
也许有一天人们会意识到为什么RAID5是一个糟糕的主意。在此之前,1)人们将丢失数据。2)我们会收到类似这样的问题。
汤姆·奥康纳

11
@Tom O'Connor ...因为显然,RAID5是用户错误的罪魁祸首。:rolleyes:
现实提取器

2
希望Shane的回答可以保存数据,但是,再次证明为什么单独RAID并非最适合存储。也需要备份。(但对于所产生的问题和史诗般的答案为+1)
tombull89'1

4
我知道它经常重复出现,但突袭不是备用解决方案。该消息确实需要开车回家。
Sirex

Answers:


89

好的-关于您的问题,有些问题困扰着我,因此我启动了一个VM,以深入研究应有的行为。一分钟后,我将了解困扰我的地方;首先让我这样说:

尝试任何操作之前,请备份这些驱动器!!

您可能已经造成的损害超出了重新同步的范围;您能否澄清您说的意思:

根据建议,我确实清理了超级块,并使用--assume-clean选项重新创建了数组,但是一点都不幸运。

如果您运行mdadm --misc --zero-superblock,则应该没问题。

无论如何,先清除一些新磁盘并获取它们的精确当前映像,然后再执行可能会对这些磁盘进行更多写操作的所有操作。

dd if=/dev/sdd of=/path/to/store/sdd.img

话虽如此……看起来这些东西上存储的数据具有惊人的弹性,可以灵活地进行重新同步。继续阅读,充满希望,也许这是我达到答案长度限制的那一天。


最佳情况

我整理了一个虚拟机来重新创建您的方案。驱动器只有100 MB,因此在每次重新同步时我都不会永远等待,但是否则这应该是一个非常准确的表示。

尽可能通用地构建阵列,并且默认设置为最大-512k块,左对称布局,字母顺序的磁盘..没什么特别的。

root@test:~# mdadm --create /dev/md0 --chunk=512 --level=5 --raid-devices=3 /dev/sdb1 /dev/sdc1 /dev/sdd1
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md0 started.
root@test:~# cat /proc/mdstat
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
md0 : active raid5 sdd1[3] sdc1[1] sdb1[0]
      203776 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/3] [UUU]

unused devices: <none>

到目前为止,一切都很好; 让我们制作一个文件系统,并在上面放置一些数据。

root@test:~# mkfs.ext4 /dev/md0
mke2fs 1.41.14 (22-Dec-2010)
Filesystem label=
OS type: Linux
Block size=1024 (log=0)
Fragment size=1024 (log=0)
Stride=512 blocks, Stripe width=1024 blocks
51000 inodes, 203776 blocks
10188 blocks (5.00%) reserved for the super user
First data block=1
Maximum filesystem blocks=67371008
25 block groups
8192 blocks per group, 8192 fragments per group
2040 inodes per group
Superblock backups stored on blocks:
        8193, 24577, 40961, 57345, 73729

Writing inode tables: done
Creating journal (4096 blocks): done
Writing superblocks and filesystem accounting information: done

This filesystem will be automatically checked every 30 mounts or
180 days, whichever comes first.  Use tune2fs -c or -i to override.
root@test:~# mkdir /mnt/raid5
root@test:~# mount /dev/md0 /mnt/raid5
root@test:~# echo "data" > /mnt/raid5/datafile
root@test:~# dd if=/dev/urandom of=/mnt/raid5/randomdata count=10000
10000+0 records in
10000+0 records out
5120000 bytes (5.1 MB) copied, 0.706526 s, 7.2 MB/s
root@test:~# sha1sum /mnt/raid5/randomdata
847685a5d42524e5b1d5484452a649e854b59064  /mnt/raid5/randomdata

好。我们有一个文件系统和一些数据(在中有“数据” datafile,并在其中包含5MB的随机数据,其中有SHA1哈希值randomdata);让我们看看进行重新创建时会发生什么。

root@test:~# umount /mnt/raid5
root@test:~# mdadm --stop /dev/md0
mdadm: stopped /dev/md0
root@test:~# cat /proc/mdstat
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
unused devices: <none>
root@test:~# mdadm --create /dev/md1 --chunk=512 --level=5 --raid-devices=3 /dev/sdb1 /dev/sdc1 /dev/sdd1
mdadm: /dev/sdb1 appears to be part of a raid array:
    level=raid5 devices=3 ctime=Sat Jan  7 21:07:06 2012
mdadm: /dev/sdc1 appears to be part of a raid array:
    level=raid5 devices=3 ctime=Sat Jan  7 21:07:06 2012
mdadm: /dev/sdd1 appears to be part of a raid array:
    level=raid5 devices=3 ctime=Sat Jan  7 21:07:06 2012
Continue creating array? y
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md1 started.
root@test:~# cat /proc/mdstat
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
md1 : active raid5 sdd1[2] sdc1[1] sdb1[0]
      203776 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/3] [UUU]

unused devices: <none>

这些小磁盘重新同步很快完成,但是确实发生了。所以这就是早些时候困扰我的东西;您的fdisk -l输出。md可以预期,设备上没有分区表根本不是问题。您的文件系统直接驻留在没有分区表的假块设备上。

root@test:~# fdisk -l
...
Disk /dev/md1: 208 MB, 208666624 bytes
2 heads, 4 sectors/track, 50944 cylinders, total 407552 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 524288 bytes / 1048576 bytes
Disk identifier: 0x00000000

Disk /dev/md1 doesn't contain a valid partition table

是的,没有分区表。但...

root@test:~# fsck.ext4 /dev/md1
e2fsck 1.41.14 (22-Dec-2010)
/dev/md1: clean, 12/51000 files, 12085/203776 blocks

重新同步后,完全有效的文件系统。这样很好;让我们检查一下我们的数据文件:

root@test:~# mount /dev/md1 /mnt/raid5/
root@test:~# cat /mnt/raid5/datafile
data
root@test:~# sha1sum /mnt/raid5/randomdata
847685a5d42524e5b1d5484452a649e854b59064  /mnt/raid5/randomdata

稳定-完全没有数据损坏!但这是完全相同的设置,因此两个RAID组之间没有任何不同的映射。在尝试破坏它之前,让我们先把它放下。

root@test:~# umount /mnt/raid5
root@test:~# mdadm --stop /dev/md1

退后一步

在尝试打破这一点之前,让我们先谈谈为什么很难打破这一点。RAID 5通过使用奇偶校验块来工作,该奇偶校验块可以保护与阵列中其他所有磁盘上的块大小相同的区域。奇偶校验不仅在一个特定的磁盘上,而且还在磁盘上均匀地旋转,以在正常操作中更好地将读取负载分散到整个磁盘上。

用于计算奇偶校验的XOR操作如下所示:

DISK1  DISK2  DISK3  DISK4  PARITY
1      0      1      1    = 1
0      0      1      1    = 0
1      1      1      1    = 0

因此,奇偶校验分布在磁盘之间。

DISK1  DISK2  DISK3  DISK4  DISK5
DATA   DATA   DATA   DATA   PARITY
PARITY DATA   DATA   DATA   DATA
DATA   PARITY DATA   DATA   DATA

更换已损坏或丢失的磁盘时通常会进行重新同步。还要mdadm create确保磁盘上的数据与RAID的几何形状对齐。在这种情况下,阵列规格中的最后一个磁盘是“已同步到”的磁盘-其他磁盘上的所有现有数据都用于同步。

因此,“新”磁盘上的所有数据将被清除并重建;或者从奇偶校验块中为应有的内容构建新的数据块,或者构建新的奇偶校验块。

很棒的是,这两件事的过程完全相同:对来自其余磁盘的数据进行XOR操作。在这种情况下,重新同步过程的布局可能是某个块应该是一个奇偶校验块,并认为它正在构建一个新的奇偶校验块,而实际上它是在重新创建旧的数据块。因此,即使它认为正在构建它:

DISK1  DISK2  DISK3  DISK4  DISK5
PARITY DATA   DATA   DATA   DATA
DATA   PARITY DATA   DATA   DATA
DATA   DATA   PARITY DATA   DATA

...可能只是DISK5从上面的布局中重建而来。

因此,即使阵列构建错误,数据也可能保持一致。


在工程中扔猴子

(不是扳手;整个猴子)

测试1:

让我们以错误的顺序排列数组! sdc然后sdd,然后sdb..

root@test:~# mdadm --create /dev/md1 --chunk=512 --level=5 --raid-devices=3 /dev/sdc1 /dev/sdd1 /dev/sdb1
mdadm: /dev/sdc1 appears to be part of a raid array:
    level=raid5 devices=3 ctime=Sat Jan  7 23:06:34 2012
mdadm: /dev/sdd1 appears to be part of a raid array:
    level=raid5 devices=3 ctime=Sat Jan  7 23:06:34 2012
mdadm: /dev/sdb1 appears to be part of a raid array:
    level=raid5 devices=3 ctime=Sat Jan  7 23:06:34 2012
Continue creating array? y
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md1 started.
root@test:~# cat /proc/mdstat
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
md1 : active raid5 sdb1[3] sdd1[1] sdc1[0]
      203776 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/3] [UUU]

unused devices: <none>

好吧,一切都很好。我们有文件系统吗?

root@test:~# fsck.ext4 /dev/md1
e2fsck 1.41.14 (22-Dec-2010)
fsck.ext4: Superblock invalid, trying backup blocks...
fsck.ext4: Bad magic number in super-block while trying to open /dev/md1

The superblock could not be read or does not describe a correct ext2
filesystem.  If the device is valid and it really contains an ext2
filesystem (and not swap or ufs or something else), then the superblock
is corrupt, and you might try running e2fsck with an alternate superblock:
    e2fsck -b 8193 <device>

不!这是为什么?因为尽管数据全部存在,但是顺序错误;原来是512KB的A,然后是512KB的B,A,B等,现在已改组为B,A,B,A。磁盘现在对于文件系统检查器来说像是乱码,它将无法运行。的输出mdadm --misc -D /dev/md1提供了更多详细信息;看起来像这样:

Number   Major   Minor   RaidDevice State
   0       8       33        0      active sync   /dev/sdc1
   1       8       49        1      active sync   /dev/sdd1
   3       8       17        2      active sync   /dev/sdb1

何时应如下所示:

Number   Major   Minor   RaidDevice State
   0       8       17        0      active sync   /dev/sdb1
   1       8       33        1      active sync   /dev/sdc1
   3       8       49        2      active sync   /dev/sdd1

所以,一切都很好。这次我们用新的奇偶校验块覆盖了一大堆数据块。现在以正确的顺序重新创建:

root@test:~# mdadm --stop /dev/md1
mdadm: stopped /dev/md1
root@test:~# mdadm --create /dev/md1 --chunk=512 --level=5 --raid-devices=3 /dev/sdb1 /dev/sdc1 /dev/sdd1
mdadm: /dev/sdb1 appears to be part of a raid array:
    level=raid5 devices=3 ctime=Sat Jan  7 23:11:08 2012
mdadm: /dev/sdc1 appears to be part of a raid array:
    level=raid5 devices=3 ctime=Sat Jan  7 23:11:08 2012
mdadm: /dev/sdd1 appears to be part of a raid array:
    level=raid5 devices=3 ctime=Sat Jan  7 23:11:08 2012
Continue creating array? y
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md1 started.
root@test:~# fsck.ext4 /dev/md1
e2fsck 1.41.14 (22-Dec-2010)
/dev/md1: clean, 12/51000 files, 12085/203776 blocks

整洁,那里仍然有文件系统!仍然有数据?

root@test:~# mount /dev/md1 /mnt/raid5/
root@test:~# cat /mnt/raid5/datafile
data
root@test:~# sha1sum /mnt/raid5/randomdata
847685a5d42524e5b1d5484452a649e854b59064  /mnt/raid5/randomdata

成功!

测试2

好的,让我们更改块大小,看看是否使我们有些破损。

root@test:~# umount /mnt/raid5
root@test:~# mdadm --stop /dev/md1
mdadm: stopped /dev/md1
root@test:~# mdadm --create /dev/md1 --chunk=64 --level=5 --raid-devices=3 /dev/sdb1 /dev/sdc1 /dev/sdd1
mdadm: /dev/sdb1 appears to be part of a raid array:
    level=raid5 devices=3 ctime=Sat Jan  7 23:21:19 2012
mdadm: /dev/sdc1 appears to be part of a raid array:
    level=raid5 devices=3 ctime=Sat Jan  7 23:21:19 2012
mdadm: /dev/sdd1 appears to be part of a raid array:
    level=raid5 devices=3 ctime=Sat Jan  7 23:21:19 2012
Continue creating array? y
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md1 started.
root@test:~# fsck.ext4 /dev/md1
e2fsck 1.41.14 (22-Dec-2010)
fsck.ext4: Superblock invalid, trying backup blocks...
fsck.ext4: Bad magic number in super-block while trying to open /dev/md1

The superblock could not be read or does not describe a correct ext2
filesystem.  If the device is valid and it really contains an ext2
filesystem (and not swap or ufs or something else), then the superblock
is corrupt, and you might try running e2fsck with an alternate superblock:
    e2fsck -b 8193 <device>

是的,是这样设置的。但是,我们可以康复吗?

root@test:~# mdadm --stop /dev/md1
mdadm: stopped /dev/md1
root@test:~# mdadm --create /dev/md1 --chunk=512 --level=5 --raid-devices=3 /dev/sdb1 /dev/sdc1 /dev/sdd1
mdadm: /dev/sdb1 appears to be part of a raid array:
    level=raid5 devices=3 ctime=Sat Jan  7 23:21:51 2012
mdadm: /dev/sdc1 appears to be part of a raid array:
    level=raid5 devices=3 ctime=Sat Jan  7 23:21:51 2012
mdadm: /dev/sdd1 appears to be part of a raid array:
    level=raid5 devices=3 ctime=Sat Jan  7 23:21:51 2012
Continue creating array? y
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md1 started.
root@test:~# fsck.ext4 /dev/md1
e2fsck 1.41.14 (22-Dec-2010)
/dev/md1: clean, 12/51000 files, 12085/203776 blocks
root@test:~# mount /dev/md1 /mnt/raid5/
root@test:~# cat /mnt/raid5/datafile
data
root@test:~# sha1sum /mnt/raid5/randomdata
847685a5d42524e5b1d5484452a649e854b59064  /mnt/raid5/randomdata

再一次成功!

测试3

我认为这肯定会杀死数据-让我们做一个不同的布局算法!

root@test:~# umount /mnt/raid5
root@test:~# mdadm --stop /dev/md1
mdadm: stopped /dev/md1
root@test:~# mdadm --create /dev/md1 --chunk=512 --level=5 --layout=right-asymmetric --raid-devices=3 /dev/sdb1 /dev/sdc1 /dev/sdd1
mdadm: /dev/sdb1 appears to be part of a raid array:
    level=raid5 devices=3 ctime=Sat Jan  7 23:32:34 2012
mdadm: /dev/sdc1 appears to be part of a raid array:
    level=raid5 devices=3 ctime=Sat Jan  7 23:32:34 2012
mdadm: /dev/sdd1 appears to be part of a raid array:
    level=raid5 devices=3 ctime=Sat Jan  7 23:32:34 2012
Continue creating array? y
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md1 started.
root@test:~# cat /proc/mdstat
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
md1 : active raid5 sdd1[3] sdc1[1] sdb1[0]
      203776 blocks super 1.2 level 5, 512k chunk, algorithm 1 [3/3] [UUU]

unused devices: <none>
root@test:~# fsck.ext4 /dev/md1
e2fsck 1.41.14 (22-Dec-2010)
fsck.ext4: Superblock invalid, trying backup blocks...
Superblock has an invalid journal (inode 8).

可怕和糟糕-它认为发现了某些东西并想进行修复! Ctrl+ C

Clear<y>? cancelled!

fsck.ext4: Illegal inode number while checking ext3 journal for /dev/md1

好的,避免了危机。让我们看看以错误的布局重新同步后数据是否仍然完整:

root@test:~# mdadm --stop /dev/md1
mdadm: stopped /dev/md1
root@test:~# mdadm --create /dev/md1 --chunk=512 --level=5 --raid-devices=3 /dev/sdb1 /dev/sdc1 /dev/sdd1
mdadm: /dev/sdb1 appears to be part of a raid array:
    level=raid5 devices=3 ctime=Sat Jan  7 23:33:02 2012
mdadm: /dev/sdc1 appears to be part of a raid array:
    level=raid5 devices=3 ctime=Sat Jan  7 23:33:02 2012
mdadm: /dev/sdd1 appears to be part of a raid array:
    level=raid5 devices=3 ctime=Sat Jan  7 23:33:02 2012
Continue creating array? y
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md1 started.
root@test:~# fsck.ext4 /dev/md1
e2fsck 1.41.14 (22-Dec-2010)
/dev/md1: clean, 12/51000 files, 12085/203776 blocks
root@test:~# mount /dev/md1 /mnt/raid5/
root@test:~# cat /mnt/raid5/datafile
data
root@test:~# sha1sum /mnt/raid5/randomdata
847685a5d42524e5b1d5484452a649e854b59064  /mnt/raid5/randomdata

成功!

测试4

让我们仅证明超级块清零对实际的快速无害:

root@test:~# umount /mnt/raid5
root@test:~# mdadm --stop /dev/md1
mdadm: stopped /dev/md1
root@test:~# mdadm --misc --zero-superblock /dev/sdb1 /dev/sdc1 /dev/sdd1
root@test:~# mdadm --create /dev/md1 --chunk=512 --level=5 --raid-devices=3 /dev/sdb1 /dev/sdc1 /dev/sdd1
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md1 started.
root@test:~# fsck.ext4 /dev/md1
e2fsck 1.41.14 (22-Dec-2010)
/dev/md1: clean, 12/51000 files, 12085/203776 blocks
root@test:~# mount /dev/md1 /mnt/raid5/
root@test:~# cat /mnt/raid5/datafile
data
root@test:~# sha1sum /mnt/raid5/randomdata
847685a5d42524e5b1d5484452a649e854b59064  /mnt/raid5/randomdata

是的,没什么大不了的。

测试5

让我们丢掉我们所拥有的一切。之前所有4个测试的总和。

  • 设备顺序错误
  • 块大小错误
  • 布局算法错误
  • 零超级块(我们将在两个创建之间进行此操作)

向前!

root@test:~# umount /mnt/raid5
root@test:~# mdadm --stop /dev/md1
mdadm: stopped /dev/md1
root@test:~# mdadm --misc --zero-superblock /dev/sdb1 /dev/sdc1 /dev/sdd1
root@test:~# mdadm --create /dev/md1 --chunk=64 --level=5 --raid-devices=3 --layout=right-symmetric /dev/sdc1 /dev/sdd1 /dev/sdb1
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md1 started.
root@test:~# cat /proc/mdstat
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
md1 : active raid5 sdb1[3] sdd1[1] sdc1[0]
      204672 blocks super 1.2 level 5, 64k chunk, algorithm 3 [3/3] [UUU]

unused devices: <none>
root@test:~# fsck.ext4 /dev/md1
e2fsck 1.41.14 (22-Dec-2010)
fsck.ext4: Superblock invalid, trying backup blocks...
fsck.ext4: Bad magic number in super-block while trying to open /dev/md1

The superblock could not be read or does not describe a correct ext2
filesystem.  If the device is valid and it really contains an ext2
filesystem (and not swap or ufs or something else), then the superblock
is corrupt, and you might try running e2fsck with an alternate superblock:
    e2fsck -b 8193 <device>
root@test:~# mdadm --stop /dev/md1
mdadm: stopped /dev/md1

判决?

root@test:~# mdadm --misc --zero-superblock /dev/sdb1 /dev/sdc1 /dev/sdd1
root@test:~# mdadm --create /dev/md1 --chunk=512 --level=5 --raid-devices=3 /dev/sdb1 /dev/sdc1 /dev/sdd1
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md1 started.
root@test:~# cat /proc/mdstat
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
md1 : active raid5 sdd1[3] sdc1[1] sdb1[0]
      203776 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/3] [UUU]

unused devices: <none>

root@test:~# fsck.ext4 /dev/md1
e2fsck 1.41.14 (22-Dec-2010)
/dev/md1: clean, 13/51000 files, 17085/203776 blocks
root@test:~# mount /dev/md1 /mnt/raid5/
root@test:~# cat /mnt/raid5/datafile
data
root@test:~# sha1sum /mnt/raid5/randomdata
847685a5d42524e5b1d5484452a649e854b59064  /mnt/raid5/randomdata

哇。

因此,这些动作似乎都不以任何方式破坏数据。坦率地说,我对这个结果感到非常惊讶。我期望在块大小更改时出现数据丢失的可能性适中,而在布局更改时会出现一定的损失。我今天学到了一些东西。


所以..我如何获取我的数据?

尽可能多的关于旧系统的信息将对您非常有帮助。如果您知道文件系统类型,则是否拥有旧版本,/proc/mdstat以及有关驱动器顺序,算法,块大小和元数据版本的信息。您是否设置了mdadm的电子邮件警报?如果是这样,找到一个旧的;如果不是,请检查/var/spool/mail/root。检查您~/.bash_history的原始版本是否在其中。

因此,您应该做的事情清单:

  1. dd做任何事情之前都要备份磁盘!!
  2. 尝试fsck使用当前的活动md-您可能刚好以与以前相同的顺序进行构建。如果您知道文件系统类型,那将很有帮助;使用该特定fsck工具。如果有任何工具可以修复任何问题,除非确定它们确实找到了有效的文件系统,否则不要让它们使用!如果fsck有为您解决问题的提议,请随时发表评论以询问它是否真正在帮助或即将破坏数据。
  3. 尝试使用不同的参数构建数组。如果您有一个旧的/proc/mdstat,那么您可以模仿它所显示的内容。如果不是这样,那么您有点茫然-尝试所有不同的驱动器顺序是合理的,但是用每个可能的顺序检查每个可能的块大小是徒劳的。对于每一个,fsck它看看您是否有希望。

就是这样。对不起这本书,如果您有任何疑问,请随时发表评论,祝您好运!

脚注:22,000个字符以下;超出长度限制8k +


8
这是一个了不起的答案。
Antoine Benkemoun

3
我什至不知道该说些什么...布拉沃!感谢Shane Madden。我将备份磁盘并开始您的建议。谢谢,真的不是太感谢了!!!
Brigadieren

3
我只是...哇。辉煌的答案。我认为打破30,000个字符限制的唯一答案是Evan Andersons的“如何划分子网”论文。
tombull89 2012年

3
就我而言,关于SF的最佳答案。
斩波器

14
先生,您赢得了互联网。
Mark Henderson

5

如果幸运的话,使用可以读取损坏的RAID-5阵列的恢复软件将文件找回可能会取得一些成功。零假设恢复是我以前成功的一种方法。

但是,我不确定创建新数组的过程是否已经消失并破坏了所有数据,因此这可能是最后的尝试。


非常感谢Mark。我会试试看。您知道它是否修改了驱动器吗?如果是这样,我将制作磁盘副本并尝试使用其他工具。
Brigadieren

@Brigadieren-不,对不起,我对RAID5的复杂工作还不熟悉。
Mark Henderson

@Brigadieren根据mdadm文档,创建过程不会破坏数据,只是重新同步-但是,如果选择的几何与原始几何不匹配,则可能是由于编写新奇偶校验而破坏了数据。如果以后有空闲时间,可能会看到有关在VM中重新创建您的情况的信息,以查看是否可以添加任何见解。我建议先尝试获取驱动器的完整副本,然后再尝试执行所有写入磁盘的恢复步骤-您可能希望研究获得更多的驱动器来进行复制。
Shane Madden

我只是不确定是什么引起了同步-阵列首先由于电源故障而降级的事实还是其他原因?我想知道mdadm --create是否能区分我指定的驱动器顺序与最初给出的顺序不同吗?
Brigadieren

@Brigadieren同步始终在创建时发生。
Shane Madden

5

我有一个类似的问题:
软件RAID5阵列发生故障后,我mdadm --create没有提供它就被解雇了--assume-clean,无法再挂载该阵列。经过两个星期的挖掘,我终于恢复了所有数据。希望以下程序可以节省某人的时间。

长话短说

该问题是由以下事实造成的:mdadm --create制作了一个新阵列,它在两个方面与原始阵列不同:

  • 分区顺序不同
  • 不同的RAID数据偏移

正如Shane Madden出色的回答所表明的那样,mdadm --create在大多数情况下并不会破坏数据!找到分区顺序和数据偏移量后,我可以恢复数组并从中提取所有数据。

先决条件

我没有RAID超级块的备份,所以我只知道它是在安装Xubuntu 12.04.0期间创建的8个分区上的RAID5阵列。它有一个ext4文件系统。另一个重要的知识是文件副本,该文件也存储在RAID阵列中。

工具类

Xubuntu 12.04.1 live CD用于完成所有工作。根据您的情况,您可能需要以下一些工具:

允许指定数据偏移量的mdadm版本

sudo apt-get install binutils-dev git
git clone -b data_offset git://neil.brown.name/mdadm
cd mdadm
make

bgrep-搜索二进制数据

curl -L 'https://github.com/tmbinc/bgrep/raw/master/bgrep.c' | gcc -O2 -x c -o bgrep -

hexdump,e2fsck,安装和十六进制计算器 -来自回购协议的标准工具

从完整备份开始

设备文件/dev/sda2 /dev/sdb2等的命名不是永久性的,因此最好记下驱动器的序列号:

sudo hdparm -I /dev/sda

然后连接一个外部HDD并备份RAID阵列的每个分区,如下所示:

sudo dd if=/dev/sda2 bs=4M | gzip > serial-number.gz

确定原始RAID5布局

此处描述了各种布局:http : //www.accs.com/p_and_p/RAID/LinuxRAID.html
要查找在原始阵列上如何组织条带数据,您需要一个看起来随机的文件的副本存储在数组中。当前使用的默认块大小mdadm为512KB。对于N个分区的阵列,您需要一个大小至少为(N + 1)* 512KB的文件。JPEG或视频是好的,因为它提供了相对唯一的二进制数据子字符串。假设我们的文件名为picture.jpg。我们从100k到512k的增量在N + 1个位置读取32个字节的数据:

hexdump -n32 -s100k -v -e '/1 "%02X"' picture.jpg ; echo
DA1DC4D616B1C71079624CDC36E3D40E7B1CFF00857C663687B6C4464D6C77D2
hexdump -n32 -s612k -v -e '/1 "%02X"' picture.jpg ; echo
AB9DDDBBB05CA915EE2289E59A116B02A26C82C8A8033DD8FA6D06A84B6501B7
hexdump -n32 -s1124k -v -e '/1 "%02X"' picture.jpg ; echo
BC31A8DC791ACDA4FA3E9D3406D5639619576AEE2E08C03C9EF5E23F0A7C5CBA
...

然后,我们在所有原始分区上搜索所有这些字节串的出现情况,因此总共(N + 1)* N条命令,如下所示:

sudo ./bgrep DA1DC4D616B1C71079624CDC36E3D40E7B1CFF00857C663687B6C4464D6C77D2 /dev/sda2
sudo ./bgrep DA1DC4D616B1C71079624CDC36E3D40E7B1CFF00857C663687B6C4464D6C77D2 /dev/sdb2
...
sudo ./bgrep DA1DC4D616B1C71079624CDC36E3D40E7B1CFF00857C663687B6C4464D6C77D2 /dev/sdh2
/dev/sdh2: 52a7ff000
sudo ./bgrep AB9DDDBBB05CA915EE2289E59A116B02A26C82C8A8033DD8FA6D06A84B6501B7 /dev/sda2
/dev/sdb2: 52a87f000
...

这些命令可以针对不同的磁盘并行运行。扫描38GB分区大约需要12分钟。就我而言,在所有八个驱动器中,每个32字节字符串仅被发现一次。通过比较bgrep返回的偏移量,您可以获得如下图片:

| offset \ partition | b | d | c | e | f | g | a | h |
|--------------------+---+---+---+---+---+---+---+---|
| 52a7ff000          | P |   |   |   |   |   |   | 1 |
| 52a87f000          | 2 | 3 | 4 | 5 | 6 | 7 | 8 | P |
| 52a8ff000          |   |   |   |   |   |   | P | 9 |

我们看到了正常的左对称布局,这是的默认设置mdadm。更重要的是,现在我们知道了分区的顺序。但是,我们不知道哪个分区是数组中的第一个分区,因为它们可以循环移位。

还要注意找到的偏移量之间的距离。在我的情况下为512KB。块大小实际上可以小于此距离,在这种情况下,实际布局将有所不同。

查找原始块大小

我们使用同一文件picture.jpg以彼此不同的间隔读取32个字节的数据。从上面我们知道,偏移量为100k的数据位于/dev/sdh2,偏移量612k 的数据位于,而偏移量1124k 的数据/dev/sdb2位于/dev/sdd2。这表明块大小不大于512KB。我们确认它不小于512KB。为此,我们将字节字符串转储到偏移量356k处,并查看它位于哪个分区上:

hexdump -n32 -s356k -v -e '/1 "%02X"' P1080801.JPG ; echo
7EC528AD0A8D3E485AE450F88E56D6AEB948FED7E679B04091B031705B6AFA7A
sudo ./bgrep 7EC528AD0A8D3E485AE450F88E56D6AEB948FED7E679B04091B031705B6AFA7A /dev/sdb2
/dev/sdb2: 52a83f000

它与偏移量612k在同一分区上,这表明块大小不是256KB。我们以类似的方式消除了较小的块大小。我最终只有512KB的块。

在布局中查找第一分区

现在我们知道了分区的顺序,但是我们不知道哪个分区应该是第一个,以及使用了哪个RAID数据偏移量。为了找到这两个未知数,我们将创建具有正确块布局和较小数据偏移量的RAID5阵列,并在此新阵列中搜索文件系统的开始。

首先,我们创建一个具有正确分区顺序的数组,这在前面已经找到:

sudo mdadm --stop /dev/md126
sudo mdadm --create /dev/md126 --assume-clean --raid-devices=8 --level=5  /dev/sdb2 /dev/sdd2 /dev/sdc2 /dev/sde2 /dev/sdf2 /dev/sdg2 /dev/sda2 /dev/sdh2

我们通过签发确认订单得到遵守

sudo mdadm --misc -D /dev/md126
...
Number   Major   Minor   RaidDevice State
   0       8       18        0      active sync   /dev/sdb2
   1       8       50        1      active sync   /dev/sdd2
   2       8       34        2      active sync   /dev/sdc2
   3       8       66        3      active sync   /dev/sde2
   4       8       82        4      active sync   /dev/sdf2
   5       8       98        5      active sync   /dev/sdg2
   6       8        2        6      active sync   /dev/sda2
   7       8      114        7      active sync   /dev/sdh2

现在,我们确定RAID阵列中N + 1个已知字节串的偏移量。我在晚上运行脚本(Live CD不会在sudo上要求输入密码:):

#!/bin/bash
echo "1st:"
sudo ./bgrep DA1DC4D616B1C71079624CDC36E3D40E7B1CFF00857C663687B6C4464D6C77D2 /dev/md126
echo "2nd:"
sudo ./bgrep AB9DDDBBB05CA915EE2289E59A116B02A26C82C8A8033DD8FA6D06A84B6501B7 /dev/md126
echo "3rd:"
sudo ./bgrep BC31A8DC791ACDA4FA3E9D3406D5639619576AEE2E08C03C9EF5E23F0A7C5CBA /dev/md126
...
echo "9th:"
sudo ./bgrep 99B5A96F21BB74D4A630C519B463954EC096E062B0F5E325FE8D731C6D1B4D37 /dev/md126

输出带注释:

1st:
/dev/md126: 2428fff000 # 1st
2nd:
/dev/md126: 242947f000 # 480000 after 1st
3rd:                   # 3rd not found
4th:
/dev/md126: 242917f000 # 180000 after 1st
5th:
/dev/md126: 24291ff000 # 200000 after 1st
6th:
/dev/md126: 242927f000 # 280000 after 1st
7th:
/dev/md126: 24292ff000 # 300000 after 1st
8th:
/dev/md126: 242937f000 # 380000 after 1st
9th:
/dev/md126: 24297ff000 # 800000 after 1st

根据此数据,我们看到未找到第三个字符串。这意味着at处的块/dev/sdd2用于奇偶校验。这是新数组中奇偶校验位置的说明:

| offset \ partition | b | d | c | e | f | g | a | h |
|--------------------+---+---+---+---+---+---+---+---|
| 52a7ff000          |   |   | P |   |   |   |   | 1 |
| 52a87f000          | 2 | P | 4 | 5 | 6 | 7 | 8 |   |
| 52a8ff000          | P |   |   |   |   |   |   | 9 |

我们的目的是推导从哪个分区开始数组,以便将奇偶校验块移到正确的位置。由于奇偶校验应向左移动两个块,因此分区序列应向右移动两个步骤。因此,此数据偏移量的正确布局是ahbdcefg

sudo mdadm --stop /dev/md126
sudo mdadm --create /dev/md126 --assume-clean --raid-devices=8 --level=5  /dev/sda2 /dev/sdh2 /dev/sdb2 /dev/sdd2 /dev/sdc2 /dev/sde2 /dev/sdf2 /dev/sdg2 

此时,我们的RAID阵列包含正确格式的数据。您可能很幸运,因此RAID数据偏移量与原始阵列中的偏移量相同,然后您很有可能能够挂载该分区。不幸的是,这不是我的情况。

验证数据一致性

我们通过picture.jpg从数组中提取的副本来验证数据在条带上是否一致。为此,我们将32字节字符串的偏移量定位为100k:

sudo ./bgrep DA1DC4D616B1C71079624CDC36E3D40E7B1CFF00857C663687B6C4464D6C77D2 /dev/md126

然后,从结果中减去100 * 1024,并将获得的十进制值skip=用于dd。的count=是的大小picture.jpg以字节计:

sudo dd if=/dev/md126 of=./extract.jpg bs=1 skip=155311300608 count=4536208

检查extract.jpg是否与相同picture.jpg

查找RAID数据偏移

旁注:mdadm版本3.2.3的默认数据偏移为2048个扇区。但是此值已随时间更改。如果原始数组使用的数据偏移量小于当前数组的数据偏移量mdadmmdadm --create则不--assume-clean可以覆盖文件系统的开头。

在上一节中,我们创建了一个RAID阵列。通过发出某些单个分区来验证其具有哪个RAID数据偏移量:

sudo mdadm --examine /dev/sdb2
...
    Data Offset : 2048 sectors
...

2048个512字节扇区为1MB。由于块大小为512KB,因此当前数据偏移为两个块。

如果此时您有两个块的偏移量,则它可能足够小,您可以跳过此段。
我们创建一个RAID5阵列,其数据偏移量为512KB块。提前开始一个块将奇偶校验向左移动一级,因此我们通过将分区序列向左移动一级来进行补偿。因此,对于512KB的数据偏移,正确的布局是hbdcefga。我们使用的版本mdadm支持数据偏移量(请参见“工具”部分)。它需要偏移量(以千字节为单位):

sudo mdadm --stop /dev/md126
sudo ./mdadm --create /dev/md126 --assume-clean --raid-devices=8 --level=5  /dev/sdh2:512 /dev/sdb2:512 /dev/sdd2:512 /dev/sdc2:512 /dev/sde2:512 /dev/sdf2:512 /dev/sdg2:512 /dev/sda2:512

现在,我们搜索有效的ext4超级块。超级块结构可以在以下位置找到:https : //ext4.wiki.kernel.org/index.php/Ext4_Disk_Layout#The_Super_Block
我们扫描数组的开头以发现幻数的s_magic出现,然后是s_states_errors。要查找的字节串是:

53EF01000100
53EF00000100
53EF02000100
53EF01000200
53EF02000200

示例命令:

sudo ./bgrep 53EF01000100 /dev/md126
/dev/md126: 0dc80438

幻数从0x38字节开始进入超级块,因此我们减去0x38以计算偏移量并检查整个超级块:

sudo hexdump -n84 -s0xDC80400 -v /dev/md126
dc80400 2000 00fe 1480 03f8 cdd3 0032 d2b2 0119
dc80410 ab16 00f7 0000 0000 0002 0000 0002 0000
dc80420 8000 0000 8000 0000 2000 0000 b363 51bd
dc80430 e406 5170 010d ffff ef53 0001 0001 0000
dc80440 3d3a 50af 0000 0000 0000 0000 0001 0000
dc80450 0000 0000                              

这似乎是有效的超级块。s_log_block_size0x18处的字段为0002,表示块大小为2 ^(10 + 2)= 4096字节。s_blocks_count_lo在0x4处是03f81480块,即254GB。看起来不错。

现在,我们扫描超级块前几个字节的出现,以查找其副本。请注意,与hexdump输出相比,字节翻转:

sudo ./bgrep 0020fe008014f803d3cd3200 /dev/md126
/dev/md126: 0dc80400    # offset by 1024 bytes from the start of the FS        
/dev/md126: 15c80000    # 32768 blocks from FS start
/dev/md126: 25c80000    # 98304
/dev/md126: 35c80000    # 163840
/dev/md126: 45c80000    # 229376
/dev/md126: 55c80000    # 294912
/dev/md126: d5c80000    # 819200
/dev/md126: e5c80000    # 884736
/dev/md126: 195c80000
/dev/md126: 295c80000

这与备份超级块的预期位置完全一致:

sudo mke2fs -n /dev/md126
...
Block size=4096 (log=2)
...
Superblock backups stored on blocks: 
    32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208, 
    4096000, 7962624, 11239424, 20480000, 23887872

因此,文件系统从偏移量0xdc80000开始,即距分区起始位置225792KB。由于我们有8个分区,其中一个分区用于奇偶校验,因此我们将偏移量除以7。这将在每个分区上提供33030144字节的偏移量,正好是63个RAID块。并且由于当前RAID数据偏移量是一个块,因此我们得出结论,原始数据偏移量是64个块或32768KB。hbdcefga向右移动63次可得到布局bdcefgah

我们终于建立了正确的RAID阵列:

sudo mdadm --stop /dev/md126
sudo ./mdadm --create /dev/md126 --assume-clean --raid-devices=8 --level=5  /dev/sdb2:32768 /dev/sdd2:32768 /dev/sdc2:32768 /dev/sde2:32768 /dev/sdf2:32768 /dev/sdg2:32768 /dev/sda2:32768 /dev/sdh2:32768
sudo fsck.ext4 -n /dev/md126
e2fsck 1.42 (29-Nov-2011)
Warning: skipping journal recovery because doing a read-only filesystem check.
/dev/md126: clean, 423146/16654336 files, 48120270/66589824 blocks
sudo mount -t ext4 -r /dev/md126 /home/xubuntu/mp

瞧!


优秀的演练。请注意-53EF00000100似乎不是EXT4标头的有效锚点。根据ext4.wiki.kernel.org/index.php/Ext4_Disk_Layout#The_Super_Block,53EF之后的两个字节只能是0100、0200或0400。–
matt

0

我有一个类似的问题。我使用全新安装的Ubuntu 12.04格式化并重新安装了OS / boot驱动器,然后运行了mdadm --create ...命令,无法挂载它。

它说它没有有效的超级块或分区。

此外,当我停止mdadm突袭时,我无法再挂载常规设备。

我能够使用mke2fs和e2fsck修复超级块:

root@blackbox:~# mke2fs -n /dev/sdc1
mke2fs 1.42 (29-Nov-2011)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
91578368 inodes, 366284000 blocks
18314200 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=4294967296
11179 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks: 
  32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208, 
  4096000, 7962624, 11239424, 20480000, 23887872, 71663616, 78675968, 
  102400000, 214990848

然后运行:

e2fsck -b 32768 -y /dev/sdc1

那恢复了超级块,所以我可以安装和读取驱动器。

为了在不破坏超级块或分区的情况下使阵列正常工作,我使用了build:

mdadm --build /dev/md0 --level=mirror --assume-clean --raid-devices=2  /dev/sdc1 missing 

验证数据后,我将添加另一个驱动器:

mdadm --add /dev/md0 /sdd1

0

我只是在更新前面给出的一些信息。当我的主板坏了时,我有一个3磁盘的raid5阵列可以正常工作。该阵列将/ dev / md2作为/ home分区1.2TB,将/ dev / md3作为/ var分区300GB。

我有两个“重要”内容的备份,以及我从互联网的各个地方抢来的一堆随机的东西,这些东西我本来应该经过并有选择地丢弃。大多数备份被分解为25GB或更小的.tar.gz文件,并且还备份了/ etc的单独副本。

文件系统的其余部分保存在两个38GB的小raid0磁盘上。

我的新机器类似于旧硬件,只需插入所有五个磁盘并选择一个旧的通用内核,即可启动并运行该机器。所以我有五个带有干净文件系统的磁盘,尽管我不能确定磁盘的顺序是否正确,并且需要安装Debian Jessie的新版本以确保可以在需要时升级计算机,并进行其他整理。问题。

在两个Raid0磁盘上安装了新的通用系统之后,我开始将这些阵列放在一起。我想确保以正确的顺序安装磁盘。我应该做的是发出:

mdadm --assemble /dev/md3 -o --no-degraded --uuid=82164ae7:9af3c5f1:f75f70a5:ba2a159a

但是我没有。似乎mdadm非常聪明,并且提供了uuid,可以确定哪些驱动器可以到达哪里。即使BIOS将/ dev / sdc指定为/ sda,mdadm也会正确将其放在一起(不过是YMMV)。

相反,我发出了: mdadm --create /dev/md2 without the --assume-clean,并允许/ dev / sde1上的重新同步完成。我犯的下一个错误是在/ dev / sdc1上工作,而不是在/ dev / md2上的最后一个驱动器/ sde1上工作。每当mdadm认为有问题时,它就是最后被踢出或重新同步的驱动器。

之后,mdadm找不到任何超级块,而e2fsck -n也找不到。

找到此页面后,我经历了以下过程:尝试找到驱动器的序列(完成),检查有效数据(已验证9MB文件中的6MB),按正确的顺序获取了磁盘,CDE,抓住了uuid的来自旧的/etc/mdadm.conf的/ md2和/ md3,并尝试组装。

好了,/dev/md3开始了,并mdadm --misc -D /dev/md3显示了三个健康的分区以及磁盘的正确顺序。/dev/md2看起来还不错,直到我尝试挂载文件系统。

# mdadm --create /dev/md2 --raid-devices=3 --level=5 --uuid=c0a644c7:e5bcf758:ecfbc8f3:ee0392b7 /dev/sdc1 /dev/sdd1 /dev/sde1
mdadm: /dev/sdc1 appears to be part of a raid array:
       level=raid5 devices=3 ctime=Wed Feb  3 14:05:36 2016
mdadm: /dev/sdd1 appears to contain an ext2fs file system
       size=585936896K  mtime=Thu Jan  1 01:00:00 1970
mdadm: /dev/sdd1 appears to be part of a raid array:
       level=raid5 devices=3 ctime=Wed Feb  3 14:05:36 2016
mdadm: /dev/sde1 appears to contain an ext2fs file system
       size=585936896K  mtime=Thu Jan  1 01:00:00 1970
mdadm: /dev/sde1 appears to be part of a raid array:
       level=raid5 devices=3 ctime=Wed Feb  3 14:05:36 2016
Continue creating array? y
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md2 started.

文件系统拒绝挂载,并且e2fsck找不到任何超级块。此外,当如上所述检查超级块时,发现的总块计数为a880 0076或a880 0076或5500 1176,与我的mdadm报告的磁盘容量大小1199.79不匹配。同样,“超级块”的位置都没有与以上文章中的数据对齐。

我备份了所有的/ var,并准备擦除磁盘。要查看是否有可能仅擦除/ md2,(此时我没有其他损失),我将执行以下操作:

root@ced2:/home/richard# mdadm --create /dev/md2 --raid-devices=3 --level=5 --uuid=c0a644c7:e5bcf758:ecfbc8f3:ee0392b7 /dev/sdc1 /dev/sdd1 /dev/sde1
mdadm: /dev/sdc1 appears to be part of a raid array:
       level=raid5 devices=3 ctime=Wed Feb  3 14:05:36 2016
mdadm: /dev/sdd1 appears to contain an ext2fs file system
       size=585936896K  mtime=Thu Jan  1 01:00:00 1970
mdadm: /dev/sdd1 appears to be part of a raid array:
       level=raid5 devices=3 ctime=Wed Feb  3 14:05:36 2016
mdadm: /dev/sde1 appears to contain an ext2fs file system
       size=585936896K  mtime=Thu Jan  1 01:00:00 1970
mdadm: /dev/sde1 appears to be part of a raid array:
       level=raid5 devices=3 ctime=Wed Feb  3 14:05:36 2016
Continue creating array? y
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md2 started.
# mkfs.ext3 /dev/md2
mke2fs 1.42.12 (29-Aug-2014)
Creating filesystem with 292902912 4k blocks and 73228288 inodes
Filesystem UUID: a54e252f-78db-4ebb-b7ca-7dcd2edf57a4
Superblock backups stored on blocks: 
    32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208, 
    4096000, 7962624, 11239424, 20480000, 23887872, 71663616, 78675968, 
    102400000, 214990848

Allocating group tables: done                            
Writing inode tables: done                            
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done 


# hexdump -n84 -s0x00000400 -v /dev/md2
0000400 6000 045d 5800 1175 7799 00df 6ff0 112e
0000410 5ff5 045d 0000 0000 0002 0000 0002 0000
0000420 8000 0000 8000 0000 2000 0000 10d3 56b2
0000430 10d3 56b2 0002 ffff ef53 0001 0001 0000
0000440 0c42 56b2 0000 0000 0000 0000 0001 0000
0000450 0000 0000                              
0000454

#  ./bgrep 00605D0400587511 /dev/md2
/dev/md2: 00000400
/dev/md2: 08000000
/dev/md2: 18000000
/dev/md2: 28000000
/dev/md2: 38000000
/dev/md2: 48000000
/dev/md2: c8000000
/dev/md2: d8000000
/dev/md2: 188000000
/dev/md2: 288000000
/dev/md2: 3e8000000
/dev/md2: 798000000
/dev/md2: ab8000000
etc

除了更换uuid之外,其他一切似乎还不错。因此,在进行了几次检查之后,我将600GB的备份数据写入了/ dev / md2。然后,卸载并尝试重新安装驱动器:

# mdadm --assemble /dev/md2 uuid=c0a644c7:e5bcf758:ecfbc8f3:ee0392b7
mdadm: cannot open device uuid=c0a644c7:e5bcf758:ecfbc8f3:ee0392b7: No such file or directory
mdadm: uuid=c0a644c7:e5bcf758:ecfbc8f3:ee0392b7 has no superblock - assembly aborted

你在跟我开玩笑吗?那我的文件600GB呢?

# mdadm --assemble /dev/md2 
mdadm: /dev/md2 not identified in config file.

啊-容易修复。/etc/mdadm.conf中没有注释的一行

# mdadm --assemble /dev/md2 
mdadm: /dev/md2 has been started with 3 drives.

# e2fsck -n /dev/md2
e2fsck 1.42.12 (29-Aug-2014)
/dev/md2: clean, 731552/73228288 files, 182979586/292902912 blocks

耶皮!

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.