再利用する代わりに、新しいアレイを作成した後にRAID 5データを回復する


35

人々は助けてください-私は目前に大きな頭痛(完璧な嵐の状況)を持つ初心者です。

ubuntu 11.04には、ソフトウェアRAID 5として構成された3つの1tb hddがあります。データは、完全に失敗して破棄されるまで、コンピューターのハードドライブの別の別のドライブに毎週コピーされました。数日前に停電が発生し、ボックスを再起動した後、襲撃はマウントされませんでした。私の無限の知恵で私は入りました

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

興味深いことに、以前はホストRAIDに:0が付加された名前ではなく、「raid」でした。

「サニタイズされた」構成エントリは次のとおりです。

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がデータを破壊するために同期するときに何をどのように行うのかを誰かに教えてもらえますか?

RAIDの再作成後、fsck.ext4 / dev / md0を実行します。出力は次のとおりです。

root @ tanserv:/ etc / mdadm#fsck.ext4 / dev / md0 e2fsck 1.41.14(2010年12月22日)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
うまくいけば、シェーンの答えがデータを保存することができますが、再び、RAIDだけがストレージに最適ではない理由を証明します。バックアップも必要です。(ただし、結果として得られた質問と叙事詩の回答に対して+1)
-tombull89

4
私はそれが頻繁に繰り返されることを知っていますが、レイドはバックアップソリューションではありません。メッセージは本当に家に帰る必要があります。
Sirex

回答:


89

わかりました-あなたの問題について何かが私を悩ませていたので、私はVMを起動して、予期されるべき動作に飛び込みました。すぐに私を悩ませていたものに到達します。最初にこれを言わせてください:

何かを試みる前にこれらのドライブをバックアップしてください!!

再同期が行った以上のダメージをすでに受けている可能性があります。あなたが言ったときにあなたが意味したことを明確にすることができます:

提案ごとに、スーパーブロックをクリーンアップし、--assume-cleanオプションを使用して配列を再作成しましたが、まったく運がありませんでした。

を実行した場合は、mdadm --misc --zero-superblock問題ないはずです。

とにかく、いくつかの新しいディスクを清掃して、これらのディスクにこれ以上書き込みを行う可能性のある操作を行う前に、それらの正確な現在のイメージを取得します。

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

とはいえ、これらのものに保存されたデータは、途方もない再同期に対して衝撃的なほど回復力があるように見えます。読んで、希望があります、そして、これは私が答えの長さ制限に達する日かもしれません。


ベストケースシナリオ

VMを一緒に投げて、シナリオを再作成しました。ドライブは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

OK。ファイルシステムといくつかのデータ(の「データ」datafile、およびそのSHA1ハッシュを含む5MBのランダムデータ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

固体-データ破損はまったくありません!ただし、これはまったく同じ設定であるため、2つのRAIDグループ間で異なるマッピングは行われませんでした。壊そうとする前に、このことを落としましょう。

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

一歩後退

これを壊そうとする前に、なぜそれが壊れにくいのかについて話しましょう。RAID 5は、アレイ内の他のすべてのディスク上のブロックと同じサイズの領域を保護するパリティブロックを使用して機能します。パリティは特定の1つのディスク上にあるだけでなく、通常の操作でディスク全体に読み取り負荷を分散させるために、ディスクを均等に回転します。

パリティを計算する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、その後sddsdb..

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>

いや!何故ですか?データはすべて揃っていますが、順序が間違っているためです。かつてAの512KBだったもの、次にB、A、Bなどの512KBであったものが、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 + shy


8
それは驚くべき答えです。
アントワーヌベンケムン

3
何て言えばいいのかわからない...ブラボー!!! シェーン・マッデンに称賛。ディスクをバックアップし、提案を開始します。本当にありがとう
Brigadieren

3
ただ...すごい。素晴らしい答え。30,000文字の制限を破る唯一の答えは、Evan Andersonsの「How Do Subnetting Work」エッセイだと思います。
-tombull89

3
SFに関する限り、SFに関する最善の答えです。
Chopper3

14
あなた、あなたはインターネットに勝ちます。
マークヘンダーソン

5

よければ、壊れたRAID-5アレイを読み取ることができる回復ソフトウェアでファイルを取り戻すことに成功するかもしれません。ゼロアサンプションリカバリは、私が以前に成功したことの1つです。

ただし、新しい配列を作成するプロセスがすべてのデータを失い、破壊したかどうかはわかりません。そのため、これが最後のチャンスになるかもしれません。


マーク、どうもありがとう。試してみます。ドライブを変更するかどうか知っていますか?その場合は、ディスクコピーを作成し、他のツールも試してみます。
Brigadieren

@Brigadieren-いいえ、申し訳ありませんが、私はRAID5がどのように機能するかについての複雑さに十分に精通していません。
マークヘンダーソン

@Brigadieren mdadmのドキュメントによると、作成プロセスはデータを破壊せず、再同期するだけですが、元のジオメトリと一致しないジオメトリを選択した場合、新しいパリティの書き込みでデータが破壊された可能性があります。後で空き時間がある場合は、VMで状況を再現し、洞察を追加できるかどうかを確認します。ディスクに書き込みを行うリカバリ手順を試みる前に、ドライブの完全なコピーを取得することをお勧めします。コピーを作成するために追加のドライブを取得することを検討してください。
シェーンマッデン

何が同期の原因なのかわかりません-アレイが最初に(停電のために)劣化したという事実か何か?mdadm --createは、ドライブの順序を最初に指定した順序とは異なるように指定しているかどうかを区別するのでしょうか?
Brigadieren

@Brigadieren Syncは常に作成時に発生します。
シェーンマッデン

5

同様の問題
がありました。ソフトウェアRAID5アレイに障害が発生した後、mdadm --create提供せずに起動し--assume-clean、アレイをマウントできなくなりました。2週間の掘削の後、私は最終的にすべてのデータを復元しました。以下の手順が誰かの時間を節約することを願っています。

ロングストーリーショート

この問題はmdadm --create、次の2つの点で元の配列とは異なる新しい配列を作成したことが原因で発生しました。

  • パーティションの異なる順序
  • 異なるRAIDデータオフセット

それが見事に示されていたようシェーン・マッデンによって答えはmdadm --createほとんどの場合、データを破壊しません!パーティションの順序とデータオフセットを見つけたら、アレイを復元し、そこからすべてのデータを抽出できます。

前提条件

RAIDスーパーブロックのバックアップはなかったので、Xubuntu 12.04.0のインストール中に作成された8つのパーティション上のRAID5アレイであることしかわかりませんでした。ext4ファイルシステムがありました。もう1つの重要な知識は、RAIDアレイにも保存されているファイルのコピーです。

道具

Xubuntu 12.04.1ライブ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、mountおよび16進計算機 -リポジトリの標準ツール

完全バックアップから開始

デバイスファイル/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
...

次に、すべてのrawパーティションでこれらのすべてのバイト文字列の出現を検索します。合計で(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バイト文字列は8つのドライブすべてで1回しか見つかりませんでした。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の位置に/dev/sdb2あり、1124kの位置にあることがわかり/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データオフセットを使用したかはわかりません。これら2つの未知のものを見つけるために、正しいチャンクレイアウトと小さなデータオフセットで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

このデータに基づいて、3番目の文字列が見つからなかったことがわかります。これは、のチャンク/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 |

私たちの目的は、パリティチャンクを適切な場所にシフトするために、どのパーティションからアレイを開始するかを推測することです。パリティは左に2チャンクシフトする必要があるため、パーティションシーケンスは右に2ステップシフトする必要があります。したがって、このデータオフセットの正しいレイアウトは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を減算し、取得した10進値をの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セクターです。ただし、この値は時間の経過とともに変更されています。元の配列が小さいデータは、現在よりもオフセットを使用した場合mdadm、その後、mdadm --createなしには--assume-clean、ファイルシステムの先頭を上書きすることができます。

前のセクションでは、RAIDアレイを作成しました。いくつかの個々のパーティションに対して発行することにより、どのRAIDデータオフセットがあったかを確認します。

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

2048 512バイトセクターは1MBです。チャンクサイズは512KBであるため、現在のデータオフセットは2つのチャンクです。

この時点で2チャンクのオフセットがある場合は、おそらく十分に小さいため、この段落をスキップできます。
1つの512KBチャンクのデータオフセットでRAID5アレイを作成します。1つのチャンクを早く開始すると、パリティが1ステップ左にシフトします。したがって、パーティションシーケンスを1ステップ左にシフトすることで補正します。したがって、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_stateandが続いているかどうかを調べs_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_lo0x4での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データオフセットは1つのチャンクであるため、元のデータオフセットは64チャンク、つまり32768KBであると結論付けました。hbdcefga63回右にシフトすると、レイアウトが得られます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の後の2バイトは0100、0200、または0400のみである可能性があります。–
マット

0

同様の問題がありました。Ubuntu 12.04のクリーンインストールでOS /ブートドライブをフォーマットして再インストールした後、mdadm --create ...コマンドを実行してマウントできませんでした。

有効なスーパーブロックまたはパーティションがないと言いました。

さらに、mdadm raidを停止すると、通常のデバイスをマウントできなくなりました。

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

これでスーパーブロックが復元され、ドライブをマウントして読み取ることができました。

ビルドで使用したスーパーブロックまたはパーティションを破壊せずにアレイを機能させるには:

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

データを確認した後、他のドライブを追加します。

mdadm --add /dev/md0 /sdd1

0

先ほどの情報の一部を更新しています。マザーボードが故障したとき、3ディスクraid5アレイは正常に動作しました。アレイは、/ devパーティション1.2TBとして/ dev / md2を、/ varパーティション300GBとして/ dev / md3を保持していました。

「重要な」もののバックアップを2つと、インターネットのさまざまな部分から取得したランダムなものがたくさんありました。ほとんどのバックアップは25GB以下の.tar.gzファイルに分割され、/ etcの別のコピーもバックアップされました。

ファイルシステムの残りは、38GBの2つの小さなraid0ディスクに保持されていました。

私の新しいマシンは古いハードウェアに似ていたので、5台すべてのディスクを接続して古い汎用カーネルを選択するだけで、マシンを稼働させました。だから私はきれいなファイルシステムを備えた5つのディスクを持っていましたが、ディスクが正しい順序であると確信できなかったので、必要に応じてマシンをアップグレードできるようにDebian Jessieの新しいバージョンをインストールする必要がありました問題。

2台の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 / md2、/ sde1の最後のドライブではなく、/ dev / sdc1で作業することでした。mdadmが問題があると思うときはいつでも、それが追い出されるか、再同期される最後のドライブです。

その後、mdadmはスーパーブロックを見つけることができず、e2fsck -nも見つけることができませんでした。

このページを見つけた後、ドライブのシーケンスを見つける(完了)、有効なデータを確認する(9MBファイルの6MBを検証する)、正しいシーケンスのディスクを取得する、cdeを取得してuuidを取得する手順を実行しました/ md2と/ md3を古い/etc/mdadm.confから取得して、アセンブルを試みました。

さて、/dev/md3開始し、mdadm --misc -D /dev/md33つの正常なパーティションと正しい順序のディスクを示しました。/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への変更を除いて、すべてが問題ないように見えました。そこで、さらにいくつかのチェックを行った後、600 GBのバックアップデータを/ 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のコメント化されていない1行

# 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

イッピー!

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.