説明する
6つのSSDドライブを含むIMSM RAID 5アレイがあります。ドライブの1つが数ヶ月前に故障したため、まだ交換できませんでした。 (はい、私も時々怠惰であることを知っています。私を判断しないでください。)しかし、RAIDから削除しました。
しかし、昨日、別のドライブが失敗したことがわかりました。アレイは組み立てられていません。 BIOSでさえRAIDを構築できないため、何も起動できません。詳しく見てみると、ドライブには何の問題もないようです。私はそれにアクセスし、ddを使用してバックアップを作成できます。ところで、今は最初からMBRレコードがあったようです。一部のプロセスがMBRテーブルでRAIDスーパーブロックを上書きする可能性があります。この場合、データはまだ存在する必要があります。mdadm
正しいメタデータを伝えることができます。私が考えると、おそらく最初の「失敗した」ドライブでも同じことが起こったでしょう。まだ読めるからです。しかし、当時は調査には気にしませんでした。
それにもかかわらず、私は(可能であれば)データにアクセスするために配列を再構築する方法を見つけようとしています。ブロックサイズ、ドライブの正確な順序、RAIDレベルを知っています。この情報では十分ではありませんか?
いくつかの情報
dd
私が最初にしたことは、(named)を使用して残りの5つのドライブのイメージを作成することでしたsd[a-e].backup
。また、--examine
出力を使用して保存したすべてのドライブを確認しました。出力を読み取ることができます。この点。ご覧のとおり、mdadmはMBRヘッダーを読み取り、sdb
RAID情報を検出せずに次のドライブに進みます。他のすべてのドライブの場合、mdadmは正しいメタデータを印刷します。これにより、次のような結果が得られます。cat /proc/mdstat
Personalities:
md127 : inactive sda[3](S) sdd[2](S) sde[1](S) sdc[0](S)
13049 blocks super external:imsm
unused devices: <none>
私が試したこと
- 明らかに私は「オフにして再びオンにする」ことを試みました。
# mdadm --stop /dev/md127
mdadm: stopped /dev/md127
# mdadm --assemble /dev/md0 /dev/sdb missing /dev/sda /dev/sdc /dev/sde /dev/sdd
mdadm: Cannot assemble mbr metadata on /dev/sdb
mdadm: /dev/sdb has no superblock - assembly aborted
# mdadm --assemble --scan
mdadmを最後に呼び出した後、/proc/mdstat
出力は上記と同じように見えます。
その後、読み取り専用ループデバイスを作成しました。
# losetup --show -rf /mnt/backup/sdX.backup
[...]
# losetup -a
/dev/loop1: [...] (/mnt/backup/sda.backup)
/dev/loop2: [...] (/mnt/backup/sdb.backup)
/dev/loop3: [...] (/mnt/backup/sdc.backup)
/dev/loop4: [...] (/mnt/backup/sdd.backup)
/dev/loop5: [...] (/mnt/backup/sde.backup)
--build
次に、スーパーブロック情報を必要とせずにすべてのメタデータを手動で提供できるので、試してみました。
# mdadm --build /dev/md0 --raid-devices=6 --level=5 --chunk=32 /dev/loop2 missing /dev/loop1 /dev/loop3 /dev/loop5 /dev/loop4
mdadm: Raid level 5 not permitted with --build
--build
ただし、明らかにレベル5 RAID環境では使用できません。
--assemble
次に、RAIDに関するOROM情報を試しましたが、使用しませんでした。
# IMSM_NO_PLATFORM=1 mdadm --assemble /dev/md0 /dev/loop2 missing /dev/loop1 /dev/loop3 /dev/loop5 /dev/loop4
mdadm: Cannot assemble mbr metadata on /dev/loop2
mdadm: /dev/loop2 has no superblock - assembly aborted
それはとても簡単だと思います。 mdadmにこれがloop2
アレイの最初のデバイスであると仮定し、別のドライブのメタデータを使用するように指示できますか?
- 最後に試したのは、ループデバイスを読み書きで再インストールし、アレイを再作成することでした。しかし、私が見つけたすべての例は(このようにまたはこれ)配列がmdadmを使用して作成されたとします。しかしそれは真実ではない。もともとBIOSのユーティリティによって作成され、IMSMまたはIntel Rapid Storage Formatがあります。レイアウトやデータオフセットなどの詳細を知る必要があるようです。 IMSMのデフォルト設定が何であるか、どこで見つけることができるかわかりません。しかし、もっと重要なのは、mdadmのメタデータ形式がIMSMよりも多くのスペースと大きなスーパーブロックを使用し、メタデータを保存するとデータが上書きされることです。 IMSMを使用してアレイを再生成することもできますか?あるいは、メタデータを外部に保存することもできます。簡単に言えば、mdadmを使用してIMSM配列を手動で再作成する方法がわかりません。
StackExchangeに関するその他の質問
ベストアンサー1
ユーレカ - はじめに
だから私のデータに再びアクセスする方法を見つけました。残念ながら、私はそれを使用して配列を再作成することはできませんmdadm
。問題は、IMSMを使用する前にコンテナを作成する必要があることです。ただし、コンテナは紛失したデバイスを受け入れません。もともと6台のハードドライブが必要でしたが、今は5台しかありません。また、RAIDコントローラに接続する必要があるため、仮想ハードディスクは使用できません。また、mdadm
ボリュームを作成した後にドライブの同期を開始するかどうかとわかりません。しかし、私はすべてのファイルに再びアクセスする方法を見つけましたdmsetup
。
作業するドライブの複数回のバックアップ中に、アレイの一部ではなく、1つのドライブが時々IOエラーのために失敗することがわかりました。 3回目の呼び出しごとにこれらのエラーが発生したため、まだバックアップを作成できましたdd
。 IOエラーが発生するとすぐに、ドライブがIMSMによってアレイから除外され、そのメタデータがすべて削除されたと推測されます。
また、ドライブがアレイの最初のドライブであることに気づきました。 GPTテーブルがあり、アレイのデータが最初のセクタから始まるので、MBRで始まるのも論理的です。したがって、ドライブのスーパーセクタはMBRによって上書きされません。それはいつもそこにいました。
データの読み取り
ここでは、プロセスで使用されるすべてのコマンドを説明しながら、段階的なソリューションを提供しようとしました。これが誰かに役立つことを願っています。
(オプション)すべてのドライブのバックアップ
これは必ずしも必要ではありません。特に、後で読み取り専用ループデバイスを使用するからです。しかし、ストレージソリューションに重大なエラーが発生した後、私は特に妄想に陥りました。だから実際のデータを使用しないようにします。さらに、バックアップファイルを使用すると、この方法では生のハードドライブやBIOSがまったく必要ないことがわかります。必要なのはdd画像だけです。このセクションをスキップする場合は、実際には次のセクションでループデバイスを読み取り専用で作成する必要があります。そうしないと、データ品質がさらに低下し、永久に失われる危険があります。
ただし、ハードドライブをバックアップするコマンドは次のとおりです。すでにddに慣れているかもしれません。ただし、アレイ内のすべてのハードドライブに対してこのコマンドを実行しない場合:
# dd if=/dev/sdX of=/path/to/backups/sdX.img status=progress
# dd if=/dev/sdY of=/path/to/backups/sdY.img status=progress
# [...]
入力ファイルはif=/dev/sdX
ハードドライブです。などsdX
と交換してくださいsda
。sdb
出力ファイルはof=/path/to/backups/sdX.img
記録する画像を指します。適切にsdX
交換してください。status=progress
GNUバージョンのddに、現在の進行状況をstderrに印刷するように指示します。
ループデバイスの作成
次に、ループデバイスを作成します。バックアップイメージを使用すると、そのイメージはブロックファイルとして認識されます。これは必要ないかもしれません。ただし、とにかく読み取り専用フラグを使用するため、イメージは読み取りのみ可能です。-r
# losetup --show -rf /path/to/backups/sdX.img
# losetup --show -rf /path/to/backups/sdY.img
[...]
-r
:ファイルから読み取るだけで書きません。-f
A:自分で推測する必要がないように、ループデバイスの次の利用可能な番号を使用してください。--show
:実際に選択した名前を印刷します-f
。これはしばしば非常に便利です。とにかく、次のステップでこの値を印刷します。
作成したループデバイスをよりよく理解するには、次のコマンドを使用できます。
# losetup -a
/dev/loop1: [2129]:251265027 (/path/to/backups/sdX.img)
/dev/loop2: [2129]:251265027 (/path/to/backups/sdY.img)
[...]
どのループデバイスがどの画像に属しているかを思い出してください。
メタデータ収集
次に、RAIDに関するいくつかの情報を知る必要があります。具体的には、RAIDが始まるセクタ(特にマトリックスRAIDの場合)、拡張セクタの数、ブロックサイズとレイアウト、ドライブがアレイに追加される順序を調べる必要があります。
1つ以上のドライブがまだアレイの一部であり、メタデータが添付されている場合は、それを使用して必要なほとんどの情報を取得できます。sdX
それでもアレイの一部であるドライブで、次のコマンドを実行します。
# mdadm --examine /dev/sdX
/dev/sdX:
Magic : Intel Raid ISM Cfg Sig.
Version : 1.3.00
Orig Family : aa0b2c12
Family : 48d867fb
Generation : 0018f99c
Attributes : All supported
UUID : 0312fa14:fa8db3c2:2a76dc3f:299ed5b4
Checksum : 084869b8 correct
MPB Sectors : 6
Disks : 6
RAID Devices : 1
Disk02 Serial : S21PNSBG710576N
State : active
Id : 00000000
Usable Size : 488391936 (232.88 GiB 250.06 GB)
Bad Block Management Log:
Log Size : 2040
Signature : abadb10c
Entry Count : 254
[NameOfYourArray]:
UUID : 24b1e785:14f37ee5:41f6a4ab:d8b89e11
RAID Level : 5
Members : 6
Slots : [__UUUU]
Failed disk : 1
This Slot : 2
Sector Size : 512
Array Size : 2441959424 (1164.42 GiB 1250.28 GB)
Per Dev Size : 488392200 (232.88 GiB 250.06 GB)
Sector Offset : 0
Num Stripes : 7631124
Chunk Size : 32 KiB
Reserved : 0
Migrate State : idle
Map State : failed
Dirty State : clean
RWH Policy : off
出力は続行されますが、残りは無視できます。上記の出力は、次の重要な情報を生成します。
Sector Offset : 0 # Where the data starts
# (right at the first sector in my case)
Array Size : 2441959424 # Size of the volume (data) inside the array
Chunk Size : 32 KiB # Size of a single chunk
アレイ内の特定のドライブの位置を確認することもできます。
This Slot : 2
これは、そのドライブがアレイの3番目のドライブであることを意味します。 (スロット番号は0から始まります。)またはDisk## Serial : [...]
スロット番号も入力するように求められます。
Disk02 Serial : S21PNSBG710576N
すべてのドライブに対してこのコマンドを実行します。それでも有効な結果が出ている場合は、スロット番号をメモしてください。
別の方法を使用して、アレイの最初のドライブを決定できます。 RAIDはバイトではなくブロックとして書き込むため、最初の32kiBは最初のドライブにあります。 2番目のドライブの2番目の32kiBなどです。これは、最初のドライブにパーティションテーブルの先頭を含めるのに十分なセクタが必要であることを意味します。これは、開始するMBRが必要であることを意味します(保護MBRで始まるので、GPTを使用している場合でも)。mdadm --examine
メタデータなしでMBRを見つけたと伝えました。しかしfdisk -l
、。
私の場合、メタデータを使って4つのドライブのスロット番号を見つけることができました。 5番目のドライブにMBRが含まれていて、それが最初のドライブであることが自動的にわかったのは幸運です。 6台のドライブのうち5台であれば、アレイを起動するのに十分です。ドライブの正しいスロット番号が十分にわからない場合は、この方法が成功するまで別のアレイを試してみてください。
これは、私のドライブとルーピングデバイスの正しい順序が次のようになることを意味します。
コイン投入口 | 運転する | 循環装置 |
---|---|---|
マスターブートレコード(0) | /dev/sdb | /dev/loop2 |
1 | 失われた | - |
2 | /dev/sda | /開発/ループ1 |
サム | /dev/sdc | /dev/loop3 |
4 | /dev/sde | /dev/loop5 |
5 | /dev/sdd | /dev/loop4 |
最後に知っておくべきことはレイアウトです。残念ながら、mdadm
関連情報を提供していませんでした。しかし、私たちが見るときインテルのRAID定義RAID 5のレイアウトは常に非対称のようです。 IMSMアレイを別のレイアウトで構成できるかどうかはわかりませんが、私の考えではそうではありません。これらの方法のいずれも効果がない場合は、別のレイアウトを試すことができます。見るソースコードから他のレイアウトの詳細をご覧ください。
以下は、IMSM がサポートするすべての RAID レベルの概要です。 dmsetup キーワードは、次の章で使用されます。
RAIDレベル | ボールでリストしたもの | dmsetup構文 |
---|---|---|
0 | 該当なし | レイド0 |
1 | 該当なし | 襲撃1 |
5 | 左非対称 | 襲撃5_la |
10 | デフォルト(1Eまたはコピーなし) | レイド10 |
どのドライブでもメタデータを収集できない場合は、値を推測するか、他の組み合わせを試してください。これを支援するために、IMSMは次のようなさまざまなモードをサポートしています。
情報 | 可能な値 |
---|---|
RAIDレベル | 0、1、5、10 |
ブロックサイズ | 4kiB、8kiB、16kiB、32kiB、64kiB、128kiB |
開始セクタとサイズについて不明な場合は、アレイの最小のドライブのサイズにパリティを持たないドライブの数を乗算したゼロと仮定するのが最善です。次のコマンドを実行して、ドライブのセクタサイズを取得できます。
blockdev --getsize /dev/sdX
データが実際にゼロから始まらない場合でも、後で次のように正しいオフセットを得ることができます。パーティションヘッダーの検索それとも合格です。ファイルシステム検索。
dmsetupを使用したアレイの組み立て
残念ながらmdadm
。唯一の例外は使用可能なRAIDレベル0と1--build
:
mdadm --build /dev/md0 --raid-devices=2 --level=0 --chunk=32 /dev/loop0 /dev/loop1
ここでは幸運ではないので、他のツールを使用する必要があります。だから私たちはそれを代わりに使用しますdmsetup
。dmsetup
物理ドライブまたは他のソースにマップされた仮想ハードドライブを作成するコマンド。これらのマップは複数の部分で構成されており、各部分は異なるドライブにマップできます。私たちの場合、セクションは1つだけ必要であり、これを手動で提供するメタデータのRAIDにマッピングします。
しかし、まず数字について話す必要があります。以前に決めたように、私の場合のブロックサイズは32kiBです。しかし、dmsetup
部門は必要です。ほとんどすべての場合、1セクタは512バイトに等しくなります。安全な方法になるには、checkector sizeを使用できますblockdev --getss /dev/sdX
。私が知っている限り、それは32 kiB / (512 bytes/sector) = 64 sectors
。すでにセクタ配列のデータサイズを知っています(例:2441959424)。しかし、問題があります。 6つの装置があります。ストライプごとに1つのパリティブロックの場合、ブロック数は5で割る必要があります。ただし、セクタの数は5で割ることはできません。私の場合、少なくともブロックあたりのセクタ数で均等に分割できます。しかし、それが保証されているかどうかはわかりません。最後のストリップの途中でデータが停止したようです。残念ながら、dmsetupはこれを許可しません。これは、5つのドライブと64のセクタに分けることができる最も近い整数に丸める必要があることを意味します(この数を状況に合わせて調整します)。私の場合は2441959680です。これはfdisk
、誤ったドライブサイズと不足しているバックアップテーブルに不満がある可能性があることを意味します。ただし、dd イメージを切り取るとこの問題を解決できます。
table.txt
これで、1行のセクションを含むファイル(たとえば)を作成します。
<start> <size> raid <raid layout> 2 <chunk size> nosync <num devices>[ - /dev/loopN|-]*num_devices
まず、セクターの開始位置とサイズを指定する必要があります。次のパラメータは、これがRAIDであることを示します。 RAIDレイアウトについては、前のセクションの表を参照してください。次のパラメータの「2」は、RAIDの2つの特殊パラメータを表します。最初はブロックサイズです。 2番目は同期を防ぎます。次に、まずデバイスの数を指定し、各デバイスのメタデータとデバイスパスのペアを提供してドライブを説明する必要があります。メタデータを提供したくないので、ダッシュを使用してこれを示します。デバイスが欠落している場合は、メタデータまたはデバイスの両方が利用できないことを示す2つのダッシュを書き込みます。 RAIDレベルで許可する場合は、1つ以上のデバイスを維持することをお勧めします。ドライブに誤ったデータが含まれている可能性があると思われる場合は、そのドライブを選択してください。
たとえば、私の場合、ファイルは次のようになります。 2番目のデバイスはありません。
0 2441959680 raid raid5_la 2 64 nosync 6 - /dev/loop2 - - - /dev/loop1 - /dev/loop3 - /dev/loop5 - /dev/loop4
次に、次のコマンドを実行して、配列にマップされた新しいチャンクファイルを作成します。
# dmsetup create sdr /path/to/table.txt
これにより、多くのIOエラーが発生する可能性があります。この場合、セクタサイズがブロックサイズに均等に分割されない場合があります。以下を使用してブロックファイルを削除して、最後の手順を再実行できます。
# dmsetup remove sdr
それでは、新しく作成されたデバイスファイルを見てみましょう。走れば
# fdisk -l /dev/mapper/sdr
パーティションテーブルを表示できるはずです。 GPTテーブルがある場合は、これら2つのエラーについて心配しないでください。サイズが一致せず、バックアップテーブルが欠落しているのは、RAIDに選択したサイズが大きすぎるためです。
私の外観は次のとおりです。
Device Start End Sectors Size Type
/dev/mapper/sdr-part1 2048 923647 921600 450M Windows recovery environment
/dev/mapper/sdr-part2 923648 1128447 204800 100M EFI System
/dev/mapper/sdr-part3 1128448 1161215 32768 16M Microsoft reserved
/dev/mapper/sdr-part4 1161216 679840003 678678788 323.6G Microsoft basic data
/dev/mapper/sdr-part5 679841792 680902655 1060864 518M Windows recovery environment
/dev/mapper/sdr-part6 680904704 2295472127 1614567424 769.9G Linux filesystem
/dev/mapper/sdr-part7 2295472128 2441957375 146485248 69.9G Linux swap
このテーブルの開始列とセクタ列を使用して、これらのパーティションの一部をマウントすることもできます。すべての数字はセクタに属し、バイトに変換するには512を掛ける必要があります。
# mount -o ro,noload,loop,offset=348623208448,sizelimit=826658521088 /dev/mapper/sdr /mnt
これは、私のLinuxパーティションが/ mntにマウントされ、ro
読み取り専用モードですべてのファイルを閲覧できることを意味します。必要なnoload
ものext4が書き込み操作を実行しないようにする。
最後に、ddを使用してフルバックアップを実行します。
# dd if=/dev/mapper/sdr of=/path/to/backups/raid.img status=progress
もともと少し大きいRAIDを作成したことを覚えていますか?この機会を使用して、画像を正しいサイズにカットしてこのエラーを修正できます。セクタ数をバイトに変換する必要があります2441959424*512 = 1250283225088
。
# truncate -s 1250283225088 /path/to/backups/raid.img
現在、fdisk -l
サイズの不一致についての苦情はありません。