クラッシュしたLinux MD RAID5アレイを回復する方法は?


17

しばらく前に、私は自宅でRAID5システムを使用していました。4つのディスクの1つが故障しましたが、取り外して元に戻した後は問題ないように見えたため、再同期を開始しました。それが終わったとき、4枚のディスクのうち3枚が故障したことに、私の恐怖に気付きました。しかし、私はそれが可能だと信じていません。ディスクには複数のパーティションがあり、それぞれが異なるRAIDアレイの一部です。

  • md0は、sda1、sdb1、sdc1、およびsdd1で構成されるRAID1アレイです。
  • md1は、sda2、sdb2、sdc2およびsdd2で構成されるRAID5アレイです。
  • md2は、sda3、sdb3、sdc3、およびsdd3で構成されるRAID0アレイです。

md0とmd2はすべてのディスクを報告し、md1は3つの障害(sdb2、sdc2、sdd2)を報告します。私の理解では、ハードドライブが故障すると、真ん中のパーティションだけでなく、すべてのパーティションが失われるはずです。

その時点で、コンピューターの電源を切り、ドライブのプラグを抜きました。それ以来、私はそのコンピューターをより小さな新しいディスクで使用していました。

データを回復する希望はありますか?私のディスクが実際に動作していることをmdadmに何らかの形で納得させることはできますか?実際に問題がある可能性がある唯一のディスクはsdcですが、そのディスクも他のアレイによって報告されます。

更新

私はついに古いディスクを接続し、SystemRescueCdからこのマシンを起動する機会を得ました。上記はすべてメモリから書き込まれました。現在、いくつかのハードデータがあります。以下が出力ですmdadm --examine /dev/sd*2

/dev/sda2:
          Magic : a92b4efc
        Version : 0.90.00
           UUID : 53eb7711:5b290125:db4a62ac:7770c5ea
  Creation Time : Sun May 30 21:48:55 2010
     Raid Level : raid5
  Used Dev Size : 625064960 (596.11 GiB 640.07 GB)
     Array Size : 1875194880 (1788.33 GiB 1920.20 GB)
   Raid Devices : 4
  Total Devices : 4
Preferred Minor : 1

    Update Time : Mon Aug 23 11:40:48 2010
          State : clean
 Active Devices : 3
Working Devices : 4
 Failed Devices : 1
  Spare Devices : 1
       Checksum : 68b48835 - correct
         Events : 53204

         Layout : left-symmetric
     Chunk Size : 64K

      Number   Major   Minor   RaidDevice State
this     0       8        2        0      active sync   /dev/sda2

   0     0       8        2        0      active sync   /dev/sda2
   1     1       8       18        1      active sync   /dev/sdb2
   2     2       8       34        2      active sync   /dev/sdc2
   3     3       0        0        3      faulty removed
   4     4       8       50        4      spare   /dev/sdd2
/dev/sdb2:
          Magic : a92b4efc
        Version : 0.90.00
           UUID : 53eb7711:5b290125:db4a62ac:7770c5ea
  Creation Time : Sun May 30 21:48:55 2010
     Raid Level : raid5
  Used Dev Size : 625064960 (596.11 GiB 640.07 GB)
     Array Size : 1875194880 (1788.33 GiB 1920.20 GB)
   Raid Devices : 4
  Total Devices : 4
Preferred Minor : 1

    Update Time : Mon Aug 23 11:44:54 2010
          State : clean
 Active Devices : 2
Working Devices : 3
 Failed Devices : 1
  Spare Devices : 1
       Checksum : 68b4894a - correct
         Events : 53205

         Layout : left-symmetric
     Chunk Size : 64K

      Number   Major   Minor   RaidDevice State
this     1       8       18        1      active sync   /dev/sdb2

   0     0       0        0        0      removed
   1     1       8       18        1      active sync   /dev/sdb2
   2     2       8       34        2      active sync   /dev/sdc2
   3     3       0        0        3      faulty removed
   4     4       8       50        4      spare   /dev/sdd2
/dev/sdc2:
          Magic : a92b4efc
        Version : 0.90.00
           UUID : 53eb7711:5b290125:db4a62ac:7770c5ea
  Creation Time : Sun May 30 21:48:55 2010
     Raid Level : raid5
  Used Dev Size : 625064960 (596.11 GiB 640.07 GB)
     Array Size : 1875194880 (1788.33 GiB 1920.20 GB)
   Raid Devices : 4
  Total Devices : 4
Preferred Minor : 1

    Update Time : Mon Aug 23 11:44:54 2010
          State : clean
 Active Devices : 1
Working Devices : 2
 Failed Devices : 2
  Spare Devices : 1
       Checksum : 68b48975 - correct
         Events : 53210

         Layout : left-symmetric
     Chunk Size : 64K

      Number   Major   Minor   RaidDevice State
this     2       8       34        2      active sync   /dev/sdc2

   0     0       0        0        0      removed
   1     1       0        0        1      faulty removed
   2     2       8       34        2      active sync   /dev/sdc2
   3     3       0        0        3      faulty removed
   4     4       8       50        4      spare   /dev/sdd2
/dev/sdd2:
          Magic : a92b4efc
        Version : 0.90.00
           UUID : 53eb7711:5b290125:db4a62ac:7770c5ea
  Creation Time : Sun May 30 21:48:55 2010
     Raid Level : raid5
  Used Dev Size : 625064960 (596.11 GiB 640.07 GB)
     Array Size : 1875194880 (1788.33 GiB 1920.20 GB)
   Raid Devices : 4
  Total Devices : 4
Preferred Minor : 1

    Update Time : Mon Aug 23 11:44:54 2010
          State : clean
 Active Devices : 1
Working Devices : 2
 Failed Devices : 2
  Spare Devices : 1
       Checksum : 68b48983 - correct
         Events : 53210

         Layout : left-symmetric
     Chunk Size : 64K

      Number   Major   Minor   RaidDevice State
this     4       8       50        4      spare   /dev/sdd2

   0     0       0        0        0      removed
   1     1       0        0        1      faulty removed
   2     2       8       34        2      active sync   /dev/sdc2
   3     3       0        0        3      faulty removed
   4     4       8       50        4      spare   /dev/sdd2

前回のブート以降、状況が変わったようです。これを正しく読んでいる場合、sda2、sdb2およびsdc2は動作しており、同期データが含まれており、sdd2はスペアです。3台のディスクが故障したことをはっきりと覚えていますが、これは朗報です。それでも、アレイはまだ機能していません。

Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10] 
md125 : inactive sda2[0](S) sdb2[1](S) sdc2[2](S)
      1875194880 blocks

md126 : inactive sdd2[4](S)
      625064960 blocks

md127 : active raid1 sda1[0] sdd1[3] sdc1[2] sdb1[1]
      64128 blocks [4/4] [UUUU]

unused devices: <none>

md0はmd127に名前が変更されたようです。md125とmd126は非常に奇妙です。それらは2つではなく1つの配列でなければなりません。以前はmd1と呼ばれていました。md2は完全に削除されましたが、それは私のスワップだったので気にしません。

私は異なる名前を理解できますが、それは実際には問題ではありません。しかし、3つの「アクティブ同期」ディスクを持つアレイが読み取れないのはなぜですか?そして、sdd2が別の配列になっているのはどうですか?

更新

スーパーブロックをバックアップした後、次のことを試しました。

root@sysresccd /root % mdadm --stop /dev/md125
mdadm: stopped /dev/md125
root@sysresccd /root % mdadm --stop /dev/md126
mdadm: stopped /dev/md126

ここまでは順調ですね。sdd2はスペアなので、まだ追加しません。

root@sysresccd /root % mdadm --assemble /dev/md1 /dev/sd{a,b,c}2 missing 
mdadm: cannot open device missing: No such file or directory
mdadm: missing has no superblock - assembly aborted

どうやらそれはできません。

root@sysresccd /root % mdadm --assemble /dev/md1 /dev/sd{a,b,c}2        
mdadm: /dev/md1 assembled from 1 drive - not enough to start the array.
root@sysresccd /root % cat /proc/mdstat 
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10] 
md1 : inactive sdc2[2](S) sdb2[1](S) sda2[0](S)
      1875194880 blocks

md127 : active raid1 sda1[0] sdd1[3] sdc1[2] sdb1[1]
      64128 blocks [4/4] [UUUU]

unused devices: <none>

それもうまくいきませんでした。すべてのディスクで試してみましょう。

mdadm --stop /dev/md1
mdadm: stopped /dev/md1
root@sysresccd /root % mdadm --assemble /dev/md1 /dev/sd{a,b,c,d}2
mdadm: /dev/md1 assembled from 1 drive and 1 spare - not enough to start the array.
root@sysresccd /root % cat /proc/mdstat                           
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10] 
md1 : inactive sdc2[2](S) sdd2[4](S) sdb2[1](S) sda2[0](S)
      2500259840 blocks

md127 : active raid1 sda1[0] sdd1[3] sdc1[2] sdb1[1]
      64128 blocks [4/4] [UUUU]

unused devices: <none>

運がありません。この答えに基づいて私は試してみる予定です:

mdadm --create /dev/md1 --assume-clean --metadata=0.90 --bitmap=/root/bitmapfile --level=5 --raid-devices=4 /dev/sd{a,b,c}2 missing
mdadm --add /dev/md1 /dev/sdd2

安全ですか?

更新

コメントでそのテーブルを作成するために使用したスーパーブロックパーサースクリプトを公​​開します。誰かが役に立つと思うかもしれません。ご助力いただきありがとうございます。


mdadm --re-addはあなたが探しているものではないと思います。最近、メモリテストをしましたか?アレイの障害に関連するログメッセージはありますか?
ジル 'SO-悪であるのをやめる'

@Gilles:障害が発生したアレイに保存されていたため、クラッシュ前のログはありません。そして、標準のmdadmインターフェースでは修正できないと思います。4台のディスクのうち1台では、再同期を伴うあらゆる種類の操作は不可能です。3つの「故障した」ディスクには、すべてを復元するのに十分な情報が含まれていると思います。例えば、私はddでそれらを読むことができます。「良い」ものは同期していない可能性があります。memtestを実行しますが、そのマシンは新しいディスクで完全に動作しています。
-stribika

2
mdadm -A /dev/md1 /dev/sd{b,c,d}2(おそらく--force)でアレイを停止し、新しいアレイを再構築しようとしましたか?(あなたは、最初のスーパーブロックをバックアップしていない場合。)
ジル「SO-停止されて悪」

@Gilles:質問を最新の情報で更新しました。正確にバックアップするには何が必要ですか?ディスクの最初の数ブロック、またはこのための特定のツールはありますか?
-stribika

@stribika:スーパーブロックは、パーティション上の64kB境界に配置された最後の完全な64kBブロックです。と/dev/sdd2同じUUIDを持っているにも関わらず、どのようにして別の配列に入れることができるのか分かりませんsd{a,b,c}2
ジル 'SO-悪であるのをやめる'

回答:


12

最初にディスクを確認し、スマートセルフテストを実行してください

for i in a b c d; do
    smartctl -s on -t long /dev/sd$i
done

完了するまでに数時間かかる場合がありますが、各ドライブのテストステータスを数分ごとに確認します。つまり、

smartctl -l selftest /dev/sda

読み取りエラーが原因でディスクのステータスが完了していないと報告された場合、このディスクはmd1の再アセンブリにとって安全でないと見なされるはずです。セルフテストが終了したら、アレイの再組み立てを開始できます。必要に応じて、さらに慎重にしたい場合は、続行する前にディスクを別のマシンに移動してください(ラム/コントローラ/などが不良の場合に備えて)。

最近、私はまさにこのようなケースがありました。1台のドライブが故障し、アレイに再度追加しましたが、再構築中に4台のドライブのうち3台が完全に故障しました。/ proc / mdadmの内容はあなたのものと同じでした(同じ順序ではないかもしれません)

md1 : inactive sdc2[2](S) sdd2[4](S) sdb2[1](S) sda2[0](S)

しかし、私は幸運で、これでアレイを再組み立てしました

mdadm --assemble /dev/md1 --scan --force

あなたが提供した--examineの出力を見ることで、次のシナリオが起こったことを知ることができます:sdd2が失敗し、それを削除して再追加しました。しかし、sda2の再構築が失敗し、その後sdb2が失敗しました。そのため、アレイ内の最後のアクティブドライブであるsdc2とsdd2のイベントカウンターは大きくなります(ただし、sddには再構築する機会がなかったため、最も古くなっています)。イベントカウンタが異なるため、-forceが必要になります。だからあなたもこれを試すことができます

mdadm --assemble /dev/md1 /dev/sd[abc]2 --force

結論として、上記のコマンドが失敗した場合、次のように配列を再作成する必要があると思います。

mdadm --create /dev/md1 --assume-clean -l5 -n4 -c64 /dev/sd[abc]2 missing

を行う場合--create、このmissing部分は重要です。4番目のドライブをアレイに追加しようとしないでください。構築が開始され、データが失われるためです。欠落しているドライブでアレイを作成しても、その内容は変更されず、他の場所でコピーを取得する機会があります(raid5はraid1と同じようには機能しません)。

それでもアレイが起動しない場合は、こちらのソリューション(perlスクリプト)を試してくださいアレイの再作成

最終的にアレイを起動できた場合、ファイルシステムは汚れており、おそらく破損しています。再構築中に1つのディスクに障害が発生すると、アレイが停止し、他のディスクへの書き込みを行わずにフリーズすることが予想されます。この場合、2つのディスクに障害が発生したため、システムが完了できない書き込み要求を実行していた可能性があります。そのため、データが失われる可能性はわずかですが、気付かない可能性もあります:-)

編集:いくつかの説明が追加されました。


mdadm --assemble /dev/md1 /dev/sd[abc]2 --force働いた。ありがとうございました。あなたは私のデータを保存しました!:)最初の3つは以前に考えたほど良くないので、4番目のディスクを追加しようとはしません。セルフテストでは、それぞれに10〜20の読み取り不能ブロックがあることが明らかになりました。最初にこれをチェックしないのは愚かだと思います。
-stribika

包括的な回答をありがとう。私から50人の担当者に報われました。
0xC0000022L

Permute_array.plは私にとって非常にうまく機能しました。他のユーザーへの注意:表示されると予想されるデバイスアレイには、削除した可能性のあるデッドドライブを含むすべてのドライブが含まれます。

「--createを行う場合、不足している部分が重要です。4番目のドライブをアレイに追加しようとしないでください。構築が開始され、データが失われるためです。」— BS 指定した場合--assume-clean(指定した場合)は指定しません。
poige

1

使用中に多くの問題が発生しましたmdadmが、データが失われることはありませんでした。--forceすべてのデータが失われる可能性があるため、このオプションを避けるか、非常に慎重に使用する必要があります。あなたの投稿してください/etc/mdadm/mdadm.conf

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