mdadmを使用して、2つのRAID1ディスクから失われたスーパーブロックを回復します。

mdadmを使用して、2つのRAID1ディスクから失われたスーパーブロックを回復します。

私のRAID1アレイは正常に動作します/dev/md128が、再起動後は完全に消え、両方のmdadmディスクにスーパーブロックがないことを報告します。私の質問はこの問題を解決する方法です。

背景:CentOS 7を実行しているシステム。 2つのSSD(sdasdb)と2つのHDD(sdc、)がありますsdd。 RAID1アレイが必要です/dev/md128が、何も表示されません。カーネルを更新するために再起動するまで正常に実行されました。sdcsdd

リストにないアレイ/etc/mdadm.conf

# cat /etc/mdadm.conf
# mdadm.conf written out by anaconda
MAILADDR root
AUTO +imsm +1.x -all
ARRAY /dev/md/boot level=raid1 num-devices=2 UUID=a2f6b6fe:31c80062:67e7a858:a21502a9
ARRAY /dev/md/boot_efi level=raid1 num-devices=2 UUID=ffbc39c9:ff982933:b77aece5:b44bec5f
ARRAY /dev/md/root level=raid1 num-devices=2 UUID=b31f6af6:78305117:7ca807e7:7691d745
ARRAY /dev/md/swap level=raid0 num-devices=2 UUID=f31db9e8:e136e642:1ae8f2d0:7178c956

手動でアレイを組み立ててみてください。

# mdadm --verbose --assemble /dev/md128 /dev/sdc1 /dev/sdd1
mdadm: looking for devices for /dev/md128
mdadm: no recogniseable superblock on /dev/sdc1
mdadm: /dev/sdc1 has no superblock - assembly aborted
# mdadm -E /dev/sdc1
mdadm: No md superblock detected on /dev/sdc1.
# mdadm -E /dev/sdd1
mdadm: No md superblock detected on /dev/sdd1.

確認する必要があるその他:smartctlエラーは表示されず(両方のドライブが約3ヶ月経過してほとんど使用されません)、デバイスmdadm -E /dev/sdcレベルにスーパーブロックは表示されません。変更なしで以前のカーネルに戻りました。他の結果を追加することを嬉しく思います。質問を不必要に長くしないでください。

どんなアイデアにも感謝します!その間、dd両方のハードドライブを使用可能な状態に保つ予定です。

答え1

私はこの問題を解決し、他の人の利益のためにこれが私に役立ちました。私はアレイ外にRAID1ディスクをマウントしてこれを行いました。慎重に始める前に、ディスクのコピーを作成してください。私の場合、RAID1にLVM物理ボリュームが含まれています。

  1. ディスクの1つを使用して新しいアレイを作成します。
mdadm --create /dev/md128 --raid-devices=2 --level=1 /dev/sdc1 missing
  1. LVM構造を再作成します。これを手動で実行したり、自動バックアップから復元したりできます。
pvcreate vg00 /dev/md128
vgcfgrestore --list vg00
vgcfgrestore --force -f /etc/lvm/backup/vg00 vg00
  1. ボリュームグループの名前変更(一時):
vgrename yyyyyy-9OHC-OlB2-izuQ-dyPi-jw2S-zzzzzz vg00new
  1. 別のディスクでファイルシステムの先頭を探します。そんな情報がなくて/etc/mdadm.conf簡単にわかりませんね。だから私はファイルシステムの署名を探します。
grep -a -b -o LABELONE /dev/sdd1

署名については後述する。LVM仕様、ファイルは次の場所に保存されていることを知らせます。第二部門。私のセクタは512バイトなので、上記で返された数字から512を引いて読み取り専用ループデバイスを作成します。

losetup -f /dev/sdd1 --read-only -o 134217728
  1. ループデバイスからLVMデータをスキャンします。
vgscan
lvscan

lsblk今や同じコマンドは、のボリュームをlvdisplay表示するはずです。デバイスがあることを確認しない場合は、ボリュームを有効にしてください。vg00vg00new/dev/vg00lvchange -a y vg00/<volname>

  1. データをRAID1にコピーします。これはおよびをインストールすることによって行うことができますcp
mkdir /data/old
mount -t <fstype> /dev/vg00/<volname> /data/old
cp -pr /data/old/* /data/current/

あるいは、データに応じて、dd各論理ボリュームに対して以下を使用することもできます。

dd if=/dev/vg00/vol1 of=/dev/vg00new/vol1 bs=1M conv=sparse

これはconv=sparseスペースを完全に割り当てないため、シンプロビジョニングされたLVにとって重要です。

  1. これで循環装置を取り外すことができます。
lvchange -a n vg00/<volname>
losetup -d loop0
  1. vg00newその後、オンにする必要があります。/dev/md128で確認してくださいlsblk。 VGの名前を元の名前に戻します。
vgrename yyyyyy-9OHC-OlB2-izuQ-dyPi-jw2S-zzzzzz vg00

最後に、すべてがコピーされ、正常に動作することを100%確信し、必要fsckなすべての作業を完了したら、/dev/sdd1RAID1アレイに再度追加します。

mdadm --manage /dev/md128 --add /dev/sdd1

解決策の性質は@frostschutzに帰属し、以下にあります。https://unix.stackexchange.com/a/98803/384096

それでも問題がどのように発生したのかわからないので、少し心配ですが、少なくともこれを行うと問題が再び機能します。

関連情報