わかりました-あなたの問題について何かが私を悩ませていたので、私は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
、その後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>
いや!何故ですか?データはすべて揃っていますが、順序が間違っているためです。かつて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
元のビルドがそこにあるかどうかを確認してください。
だから、あなたがすべきことのリスト:
dd
何でもする前にディスクをバックアップしてください!!
fsck
現在アクティブなmdを試してください。以前と同じ順序でビルドしたことがあります。ファイルシステムのタイプを知っている場合、それは役に立ちます。その特定のfsck
ツールを使用します。いずれかのツールが何かを修正することを提案している場合、実際に有効なファイルシステムを見つけたことが確実でない限り、それらを許可しないでください!fsck
何かを修正することを申し出た場合は、コメントを残して、それが実際にデータを助けているのか、それともデータを破棄しようとしているのかを尋ねてください。
- 異なるパラメーターを使用して配列を作成してみてください。古いを持っている場合
/proc/mdstat
、それが示すものを真似することができます。そうでない場合、あなたはちょっと暗闇の中にいます-さまざまなドライブの順序をすべて試してみるのは合理的ですが、すべての可能な順序ですべての可能なチャンクサイズをチェックすることは無駄です。それぞれについて、fsck
有望なものが得られるかどうかを確認します。
それでおしまいです。小説を申し訳ありませんが、質問があればコメントを残してください。幸運を祈ります!
脚注:22,000文字未満。長さ制限の8k + shy