MDレードからスーパーブロックが消えました。

MDレードからスーパーブロックが消えました。

Red Hat Linux 5の問題です。

間違った通信により、私たちの環境の2つのLUNが1.2TBから1.7TBに拡張されました。

再起動後、mdadmはアレイを再構築するためのスーパーブロックを見つけることができません。

共通フォーマット(バージョン0.90と呼ばれる)は4K長のスーパーブロックを持ち、デバイスの端に少なくとも64K、128K未満の64Kソートブロックを書き込みます(つまり、デバイスの周りのスーパーブロックアドレスを取得します)。デバイスのサイズは64Kの倍数に縮小し、64Kを減算します。

古い文書が見つかりました。

# mdadm -D /dev/md0
/dev/md0:
        Version : 0.90
  Creation Time : Tue Jul 10 17:45:00 2012
     Raid Level : raid1
     Array Size : 1289748416 (1230.00 GiB 1320.70 GB)
  Used Dev Size : 1289748416 (1230.00 GiB 1320.70 GB)
   Raid Devices : 2
  Total Devices : 2
Preferred Minor : 0
    Persistence : Superblock is persistent

    Update Time : Wed Apr 17 15:03:50 2013
         State : active
Active Devices : 2
Working Devices : 2
Failed Devices : 0
  Spare Devices : 0

           UUID : 2799bd51:67eb54d2:1fcd3c90:293311a1
         Events : 0.39

    Number   Major   Minor   RaidDevice State
       0     253       10        0      active sync   /dev/dm-10
       1     253       11        1      active sync   /dev/dm-11

# fdisk -l /dev/dm-10 /dev/dm-11

Disk /dev/dm-10: 1320.7 GB, 1320702443520 bytes
255 heads, 63 sectors/track, 160566 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

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

Disk /dev/dm-11: 1320.7 GB, 1320702443520 bytes
255 heads, 63 sectors/track, 160566 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

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

答え1

mdadm --build -l1 -n2 /dev/md0 /dev/dm-10 /dev/dm11データを回復するには実行してください。

これを行う前に、デバイスが正しいことを確認してください(または/ dev / mapperのエイリアスを使用してください)!

さらに、カーネルがすでにこれらのデバイスのいずれかを使用している場合(または使用中)、データは一貫性がありません。 2番目のデバイスを縮退1.2アレイに設定し、データをコピーしたら、新しい縮退RAIDの使用を開始し、ここに最初のディスクを追加する必要があります。現在バックアップがない場合は、これを試す前に何をすべきか教えてください。

(1.2 RAIDスーパーブロックがこの問題を回避するので、とにかく1.2に切り替えることをお勧めします。)

答え2

0.90スーパーブロックを備えたRAID 1の場合は、RAIDレイヤーをまったく使用せずに直接マウントできる必要があります。ディスクの先頭ではデータがオフセットされないため、問題はありません。場合に備えて、読み取り専用マウントオプションまたは読み取り専用ループデバイスを使用してみてください。

最も簡単な方法は、別のディスク(この問題を回避し、2TBの制限が適用されない1.2メタデータが望ましい)を使用して最初から新しいRAIDを作成し、データをコピーして完了することです。コピーしたディスクを新しいRAIDに追加するだけです。

答え3

デバイスを元のサイズに復元すると、RAIDデバイスのみが復元されます。

次のようにして確認できます。

losetup --sizelimit=$((1230*(2**30))) -r /dev/loop1 /dev/dm-10
mdadm -E /dev/loop1

mdadmサイズが正しい場合は、スーパーブロックを見つけることができます。その後、ディスクサイズをそのサイズに戻すことができます(-r上記の内容は読み取り専用であり、害はありません)。

本当にmd0配列を拡大して0.9メタデータを保存するには、次のいずれかを実行できます。

dmsetup create d1 --table "0 $((1230*(2**30)/512)) linear /dev/dm-10 0"
dmsetup create d2 --table "0 $((1230*(2**30)/512)) linear /dev/dm-11 0"

また、

mdadm -E /dev/mapper/d1

RAIDデバイスを表示する必要があります。

次のマッパーデバイスで配列をアセンブルします。

mdadm -A /dev/md0 /dev/mapper/d[12]

次に、デバイスのサイズを最大サイズに調整します。

dmsetup suspend d1
dmsetup suspend d2
dmsetup reload d1 --table "0 $(blockdev --getsize /dev/dm-10) linear /dev/dm-10 0"
dmsetup reload d2 --table "0 $(blockdev --getsize /dev/dm-11) linear /dev/dm-11 0"
dmsetup resume d1
dmsetup resume d2

--growその後、追加のスペースを使用できます。

mdadm /dev/md0 --grow --size max

余分なスペースが再同期するのを待ち、アレイを停止し、超過DMデバイスをクリーンアップし、元のデバイスから再組み立てします。

mdadm --stop /dev/md0
dmsetup remove d1
dmsetup remove d2
mdadm -A /dev/md0 /dev/dm-1[01]

屋根ふきデバイスを使用して事前テストしてプロセスを確認できます。以下は、機能していることを確認するために行った操作のスクリーンショットです。

~# truncate -s 1230G a
~# truncate -s 1230G b
~# losetup /dev/loop1 a
~# losetup /dev/loop2 b
~# lsblk /dev/loop[12]
NAME  MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
loop1   7:32   0   1.2T  0 loop
loop2   7:64   0   1.2T  0 loop
~# mdadm --create /dev/md0 --metadata 0.9 --level 1 --raid-devices 2 --assume-clean /dev/loop[12]
mdadm: array /dev/md0 started.
~# lsblk /dev/md0
NAME MAJ:MIN RM   SIZE RO TYPE  MOUNTPOINT
md0    9:0    0   1.2T  0 raid1
~# truncate -s 1700G a
~# truncate -s 1700G b
~# losetup -c /dev/loop1
~# losetup -c /dev/loop2
~# lsblk /dev/loop[12]
NAME  MAJ:MIN RM   SIZE RO TYPE  MOUNTPOINT
loop1   7:32   0   1.7T  0 loop
└─md0   9:0    0   1.2T  0 raid1
loop2   7:64   0   1.7T  0 loop
└─md0   9:0    0   1.2T  0 raid1
~# mdadm -E /dev/loop1
mdadm: No md superblock detected on /dev/loop1.
(1)~# mdadm --stop /dev/md0
mdadm: stopped /dev/md0
~# dmsetup create d1 --table "0 $((1230*(2**30)/512)) linear /dev/loop1 0"
~# dmsetup create d2 --table "0 $((1230*(2**30)/512)) linear /dev/loop2 0"
~# mdadm -A /dev/md0 /dev/mapper/d[12]
mdadm: /dev/md0 has been started with 2 drives.
~# lsblk /dev/mapper/d[12]
NAME       MAJ:MIN RM   SIZE RO TYPE  MOUNTPOINT
d1 (dm-19) 253:19   0   1.2T  0 dm
└─md0        9:0    0   1.2T  0 raid1
d2 (dm-20) 253:20   0   1.2T  0 dm
└─md0        9:0    0   1.2T  0 raid1
~# dmsetup suspend d1
~# dmsetup suspend d2
~# dmsetup reload d1 --table "0 $(blockdev --getsize /dev/loop1) linear /dev/loop1 0"
~# dmsetup reload d2 --table "0 $(blockdev --getsize /dev/loop2) linear /dev/loop2 0"
~# dmsetup resume d1
~# dmsetup resume d2
~# lsblk /dev/mapper/d[12]
NAME       MAJ:MIN RM   SIZE RO TYPE  MOUNTPOINT
d1 (dm-19) 253:19   0   1.7T  0 dm
└─md0        9:0    0   1.2T  0 raid1
d2 (dm-20) 253:20   0   1.7T  0 dm
└─md0        9:0    0   1.2T  0 raid1
~# mdadm /dev/md0 --grow --assume-clean --size max
mdadm: component size of /dev/md0 has been set to 1782579136K
~# lsblk /dev/md0
NAME MAJ:MIN RM   SIZE RO TYPE  MOUNTPOINT
md0    9:0    0   1.7T  0 raid1
~# cat /proc/mdstat
Personalities : [raid1]
md0 : active raid1 dm-19[0] dm-20[1]
      1782579136 blocks [2/2] [UU]

unused devices: <none>
~# mdadm --stop /dev/md0
mdadm: stopped /dev/md0
~# dmsetup remove d1
~# dmsetup remove d2
~# mdadm -A /dev/md0 /dev/loop[12]
mdadm: /dev/md0 has been started with 2 drives.
~# lsblk /dev/md0
NAME MAJ:MIN RM   SIZE RO TYPE  MOUNTPOINT
md0    9:0    0   1.7T  0 raid1
~# uname -rs
Linux 3.7-trunk-amd64

関連情報