問題
mdadm ツールを使用して、2 つの device-mapper-multipath デバイスを使用してソフトウェア RAID ミラーを作成しました:
# /sbin/mdadm /dev/md0 --create --verbose --level=1 --raid-devices=2 /dev/mapper/ocrp1 /dev/mapper/ocrmirrorp1
その後、セットアップが確認されました:
# /sbin/mdadm --detail /dev/md0 ... Number Major Minor RaidDevice State 0 253 2 0 active sync /dev/dm-2 1 253 3 1 active sync /dev/dm-3
実際のマルチパス デバイス名 (/dev/dm-N) が表示されるため、よりわかりやすい名前 (/dev/mapped/ocrp1) のマッピングも検証されます。
# /bin/ls -l /dev/mpath/ lrwxrwxrwx 1 root root 7 Apr 23 11:15 ocrp1 -> ../dm-2 lrwxrwxrwx 1 root root 7 Apr 23 11:15 ocrmirrorp1 -> ../dm-3
# /bin/ls -l /dev/mapper/ brw-rw---- 1 root disk 253, 2 Apr 23 11:15 ocrp1 brw-rw---- 1 root disk 253, 3 Apr 23 11:15 ocrmirrorp1
これらの便利な名前は同じマルチパス デバイスにマップされるため、セットアップが正しいことが証明されています。再起動後、mdadm は以下を表示します:
# /sbin/mdadm --detail /dev/md0 ... Number Major Minor RaidDevice State 0 8 97 0 active sync /dev/sdg1 1 8 113 1 active sync /dev/sdh1
RAID はアクティブですが、期待どおりにマルチパス デバイスを使用していません。
解決策
これは実際にはタイミングの問題です。システムの起動中、/etc/rcN.d スクリプトは、マルチパス デバイスが検出され準備が整う前に mdadm を開始します。マルチパスデバイスの数が多いほど認識に時間がかかり、マルチパス処理が完了する前に mdadm が実行される可能性があるため、これは本質的に競合状態です。
解決策は、必要なファイル システム ハンドラとデバイスを /initrd に追加することです。 ファイルを作成して、これらがブート時にカーネルで利用できるようにします。これにより、カーネルはマルチパス デバイスの処理を早期に開始できます。
注意 :Linux カーネルの /vmlinuz ファイルは、いくつかの非常に基本的なデバイスのみをサポートするように構築されています。ファイル システム ハンドラと一般的なデバイス ドライバは個別にコンパイルされ、/initrd (初期 RAM ディスク) ファイルにパッケージ化されます。 GRUB または LILO ブートローダーは、最初に /initrd ファイルの内容をメモリに配置してから、カーネルをロードする必要があります。次に、カーネルは初期 RAM ディスクを使用して、ルート ファイル システムにアクセスするために必要なデバイス ドライバーを取得します。次に、カーネルは実際のルート ファイルシステムを使用するように切り替え、/initrd メモリ イメージで使用されているメモリを解放します。この巧妙なアプローチにより、1 つのカーネル イメージに各システムに合わせて調整されたデバイス ドライバー セットを提供できます。使用されないデバイス ドライバーとファイル システム ハンドラー コードを保持するためにシステム メモリを浪費する必要はありません。
マルチパス サポートを含むカスタム /initrd ファイルを作成するには、次の手法を使用します:
1. マルチパス、device-mapper-multipath、および HBA ドライバーを含む新しい initrd ファイルを作成します。
# /sbin/mkinitrd -v /root/initrd-mp.img 2.6.18-prep --with=multipath --with=dm-multipath --with=lpfc --omit-raid-modules
CentOS/RHEL 6 および 7 で同じことを行うには、以下の投稿をご覧ください。
CentOS/RHEL 6 および 7 でマルチパスを使用して「initramfs」を再構築する方法2. ファイル /etc/mdadm.conf を確認します RAID デバイス用に構成されています:
# /bin/cat /etc/mdadm.conf DEVICE /dev/mapper/* ARRAY /dev/md0 uuid=ccfe8a98:ea584ff2:2fad9d51:305ea2da devices=/dev/mapper/ocrp1,/dev/mapper/ocrmirrorp1 level=raid1
3. 新しい RAM ディスク イメージを、ブートローダーが期待するブート ロケーションにコピーします。
# /bin/cp /root/initrd-mp.img /boot/
4. ブートローダー構成ファイル /boot/grub/grub.conf に新しいエントリを追加して、新しい RAM ディスク イメージを使用します。
title MDADM-MP root (hd0,0) kernel /vmlinuz-2.6.18-8.el5 ro root=/dev/VolGroup00/LogVol00 rhgb quiet initrd /initrd-mp.img注意 :GRUB スタンザの例を適切に変更してください。カーネルのバージョンとルート デバイスは、この例とは確実に異なります。
CentOS/RHEL 7 および grub2 を使用する場合、正確な手順については以下の投稿を参照してください。
CentOS / RHEL 7 :GRUB2 引数を grubby で変更する方法5. システムを再起動し、GRUB メニューから MDADM-MP エントリを選択します。
ヒント :それでもマルチパス デバイスが使用されていない場合は、起動スクリプトを追加して、最後の起動ステップとして mdadm を実行する必要があります。これを行う 1 つの方法は、完全な /etc/init.d/ サービス スクリプトを記述したくない場合に、必要なコマンドを /etc/rc.local に追加することです。