/ on / dev / md0のカーネルRAID自動検出と、他の/ dev / mdのスーパーブロックv1.2を同時に使用する問題、または更新後にサーバーをドロップ(およびレイズ)する方法



見出しを読んでくれてありがとう。 それはテストでした。



今日、お気に入りのGentooサーバーでの次の更新と予防的な再起動の後、賢明なカーネルの言葉で突然/ dev / md1から落ちました:sdc1には有効なv0.90スーパーブロックがなく、インポートされていません!



ショック! パニック! まあ、それはコアではありません...



実際、問題は何ですか?



まず、問題の本質とその解決方法を理解しやすくするためのサーバー構成について説明します。 そのため、RAID自動検出を有効にしたカーネル3.10.7と2つのRAID1(ミラー)ドライブ。



ルートは、/ dev / md1データベース(Percona)の/ dev / md0にマウントされます。

db13 ~ # cat /etc/fstab | grep md /dev/md0 / ext3 noatime 0 1 /dev/md1 /mnt/db reiser4 noatime 0 0
      
      





そして、/ boot / grub / grub.confの一部:

 title Gentoo Linux 3.10.7 md0 root (hd0,0) kernel /boot/kernel-3.10.7 root=/dev/md0
      
      





したがって、ブート中にカーネルがmdデバイスを正常にアセンブリするには、次の2つの条件を満たしている必要があります。

  1. RAIDが構築されているパーティションには0xFDと入力します
  2. mdadmを使用して作成されたデバイス/ dev / mdのスーパーブロックフォーマットバージョン0.90


条項1の場合 私の構成ではすべてが順調でしたが、判明したように、スーパーブロック形式は1.2でした。新しいバージョンのmdadmが到着した後、/ dev / md1を作成したと思われます。 その結果、コアはひどい言葉で誓います:
dmesg | grep md
  [0.000000]コマンドライン:root = / dev / md0 raid = / dev / md0
 [0.000000]カーネルコマンドライン:ルート= / dev / md0 raid = / dev / md0
 [1.063603] md:レベル1に登録されたraid1パーソナリティ
 [1.266420] md:すべてのデバイスが利用可能になるのを待ってから自動検出する
 [1.266494] md:raidを使用しない場合は、raid = noautodetectを使用します
 [1.266781] md:RAIDアレイの自動検出。
 [1.293670] md:sdc1の無効なraidスーパーブロックマジック
  [1.294210] md:sdc1には有効なv0.90スーパーブロックがなく、インポートされていません!
 [1.312482] md:sdd1の無効なraidスーパーブロックマジック
 [1.312556] md:sdd1には有効なv0.90スーパーブロックがなく、インポートされていません! 
 [1.312579] md:4つのデバイスをスキャンし、2つのデバイスを追加しました。
 [1.312595] md:自動実行...
 [1.312610] md:sdb3の検討...
 [1.312626] md:sdb3を追加しています...
 [1.312641] md:sda3を追加しています...
 [1.312657] md:md0を作成しました
 [1.312665] md:バインド<sda3>
 [1.312754] md:バインド<sdb3>
 [1.312770] md:実行中:<sdb3> <sda3>
 [1.313064] md / raid1:md0:2つのミラーのうち2つでアクティブ
 [1.313166] md0:0から7984840704への容量変化を検出
 [1.313262] md:...自動実行が完了しました。
 [1.320413] md0:不明なパーティションテーブル
 [1.338528] EXT3-fs(md0):順序付けられたデータモードでマウントされたファイルシステム
 [2.581420] systemd-udevd [861]:バージョン208以降
 [3.122748] md:バインド<sdc1>
 [4.896331] EXT3-fs(md0):内部ジャーナルを使用




Googleが役に立たないとき



選択肢は非常に少なく、カーネル内の配列の自動検出を無効にするか(grub.confでの再コンパイルと編集)、スーパーブロックの形式を変更します(フルデータバックアップとその後の復元によるミラーキリング)。 どちらのオプションも本質的に破壊的であり、データの損失につながる可能性があるため、「オプションではありません」。多くの時間がかかる場合があります(ソリューションの検索中に判明したため、 カーネルの自動検出は機能が低下しています



ところで、sevreraの開始後、/ dev / md1は次のコマンドで正常に開始します。
  mdadm --manage / dev / md1 --run 
。 もちろん、この行をrcスクリプトのどこかに書くことは可能ですが、ご存知のように、これはスポーツではありません。



ユーレカ!



解決策は表面にありましたが、すぐには出ませんでした-必要なのは、/ dev / md1のディスクから0xFDタイプ(0x83に置き換える)を削除することだけです。そうすると、カーネルはこの配列の収集を成功せずに試行し、udevdがその作業を実行できなくなります。 実際、fdiskを使用して両方のミラーのパーティションのタイプを変更し、サーバーを再起動すると、すべてが奇跡的に起動しました。

dmesg | grep md
 [0.000000]コマンドライン:root = / dev / md0 raid = / dev / md0
 [0.000000]カーネルコマンドライン:ルート= / dev / md0 raid = / dev / md0
 [1.063924] md:レベル1に登録されたraid1パーソナリティ
 [1.248078] md:すべてのデバイスが利用可能になるのを待ってから自動検出する
 [1.248201] md:raidを使用しない場合は、raid = noautodetectを使用します
 [1.248504] md:RAIDアレイの自動検出。
 [1.265058] md:2つのデバイスをスキャンし、2つのデバイスを追加しました。
 [1.265243] md:自動実行...
 [1.265258] md:sda3の検討...
 [1.265274] md:sda3を追加しています...
 [1.265290] md:sdb3の追加...
 [1.265305] md:md0を作成しました
 [1.265321] md:バインド<sdb3>
 [1.265331] md:バインド<sda3>
 [1.265428] md:実行中:<sda3> <sdb3>
 [1.265865] md / raid1:md0:2つのミラーのうち2つでアクティブ
 [1.265891] md0:容量の変化が0から7984840704に検出されました
 [1.266068] md:...自動実行が完了しました。
 [1.276627] md0:不明なパーティションテーブル
 [1.294892] EXT3-fs(md0):順序付けられたデータモードでマウントされたファイルシステム
  [2.713383] systemd-udevd [860]:バージョン208以降
 [3.128295] md:バインド<sdc1>
 [3.159107] md:バインド<sdd1>
 [3.170320] md / raid1:md1:2つのミラーのうち2つでアクティブ
 [3.170333] md1:容量の変更が0から17170300928に検出されました
 [3.178113] md1:不明なパーティションテーブル
 [4.911712] EXT3-fs(md0):内部ジャーナルを使用
 [5.027077] reiser4:md1:ディスクフォーマット4.0.0が見つかりました。




このテキストを見つけたGoogleが、同様の状況に陥ったワークショップの同僚にそれを見せてくれたら嬉しいです。



All Articles