これまで、OpenMediaVault 5 (以後 OMV5) 、OpenMediaVault 6 (以後 OMV6) を使って RAID Z 、RAID Z2 を実現し、使ってまいりましたが、ディスクの使用容量が増えるにしたがって、動作に問題が生じて来ました。読み出し時に一瞬止まるのです。主に動画で再生時に詰まった様な動作になるのです。一時間の再生動画で 1-2 回以上は一瞬止まります。RAID Z, RAID Z2 はメモリー食いなのでメモリー不足なのかも知れません。それに、大容量のディスク装置も結局は殆ど NAS として使っているだけなので、今一 RAID Z, RAID Z2 の機能が生かしきれていません。・・で、ディスクの容量増大に伴って、軽いシステムである RAID5, RAID6 を OpenMedia 7 (以後 OMV7) で実現、全面的に移行します。
この記事では、PC2台を連携して 18TB x 6台 (=108TB) + 2台(エラー訂正ディスク) の RAID6 システムを実現します。なお、 OpenMediaVault7 (OMV7) で作る PC1台 54TB RAID5 システム【Part 1】 【Part 2】を先にお読みください。読まれている事を前提にしていますので、既にそちらで説明しているものは、説明もなく項目だけ 列挙する事があります。
【追加説明 2025年3月22日】この記事は過去に記事にしたものを全面的に修正、再編成してあります。システム作成中の方針変更が何度か有り、私自身の理解不足も多々あり、記事作成後に全体を読み直した所、内容がわかりずらくなっていました。幾つか修正後 作成システムは満足いく動作を得られています、今後は順次すべてのNASを置き換えます。【Part 1】で RAID用ソフト mdadmの動作、iSCSI 用ソフト tgtd の動作、その他ツールの作成等 、予め理解しておくべき事柄説明しています。【Part 2】でシステムを作成。【Part 3】は、過去の失敗の備忘録? 【Part 4】で、追加項目+メンテナンス構成を随時追加します。私自身の備忘録を兼ねておりますので、作成自体に直接関係しない事も記録してあります。Part1, Part2, Part4 の順でお読みください。興味のある人だけ Part3 も.. 【現在 Part4 作成中 追加説明 ここまで】
全体構成・動作説明
全体構成を上図に示します。master 側から見ると Disk 8台の RAID6 システムとして動きます。Disk 8台中、4台は iSCSI ディスクとして slave 側に配置します。それぞれ全体の IP も決まっていますので、記入してあります。平常運転時の master 側の eno1 の帯域を 1Gbps とした時に 他の LANポートの帯域がどれくらい必要か色線で示してあります。eno2 ←→ eno2 の帯域が (1.0 x 8 / 6) x 0.5 = 0.66 ≒ 0.7Gbps となります。slave 側の eno1 はWeb管理画面を読み書きするだけなので、0.1Gbps で良いでしょう。従って平常運転時には帯域的に足らない所はありません。 ( eno1, eno2 は 1Gbpsポート )。ただ、再同期時やシステムチェック時など高速で全体スキャンを行う時には eno2 ←→ eno2 の帯域がボトルネックになります。まあ、PC 2台に分けたコストだとのんびり運用する事にしましょう。
なお、上記の図にはありませんが、リモートコントロールiLO のポートとして各PC1ポート消費しています。それぞれの IP 番号を書いておきます。
master PC iLO : 192.168.11.40 ← master PC モニター・コントロール 低速可 master PC eno1 : 192.168.11.41 ← メインのデータIOポート 最高速度(1Gbps)必要 slave PC iLO : 192.168.11.140 ← slave PC モニター・コントロール 低速可 slave PC eno1 : 192.168.11.141 ← slave PC の Webコントロール 低速可 高速が必要な1ポートを含む4ポートがLANとつながります。 PC間のみ通信(高速が必要) master PC eno2 : 192.168.12.41 ← 高速が必要(0.7Gbps以上)なので 1Gbpsポート使用 slave PC eno2 : 192.168.12.141 ← 高速が必要(0.7Gbps以上)なので 1Gbpsポート使用
mdadm( ソフトウェアRAID )動作説明 (master側)
mdadm の実行形態
ソフトウェアRAIDとして mdadmを使用致します。以下にmdadmの動作説明を一部引用します。
Linux のソフトウェアRAIDは md (Multiple Devices) デバイスドライバとして実装されている。 現状 Linux ではリニアmd デバイス,RAID 0 (ストライピング),RAID 1 (ミラーリング),RAID 4,RAID 5,RAID 6 そしてマルチパス(MULTIPATH) がサポートされている。mdadm は MD デバイスの作成,管理,そしてモニタを行うためのプログラムである。
mdadm で出来る事はマニュアルを見れば解るのですが、良くわからないのはその”実行形態”です。最初はこの実行形態がよく理解できず、使いこなせませんでした。私の理解ではその実行形態は 2つあると考えます。その一つは上の説明にも書かれている デバイスドライバ的 形態、もう一つは通常のプログラム的 形態です。例えば RAID6 を実行する場合は 最初幾つかのディスクを組にして mdadmで RAID6を create します。この時は mdadm は通常のプログラムとして動作します。create したディスクには SuperBlock が書き込まれ RAID6のディスクとなります。一方、システム起動時には mdadm がデバイスドライバ的に働き、つまり sda, sdb, sdc, …. などが作成されるのとほぼ同じタイミングで SuperBlockのあるディスクをスキャンしてRAID6用のブロックデバイス mdxx が作成されます。システム立ち上がって通常のプログラムを実行できる頃にはもうすでに mdadm デバイスドライバ が mdxx を作成し終わっているのです。
実はこのタイミングが重要なのです、上記の全体構成でも説明しましたが、DISK群Bは iSCSIで masterと繋がっています。このiSCSIソフトは通常のプログラムですので、システム立ち上がり時の早い段階 (=まだ通常プログラムは実行できない) は DISK群B は使えない事になります。ですから、DISK群BもRAID6のディスクとする為には mdadm は通常ソフトとして実行する必要があります。
mdadm はシステム立ち上がり時にはかならず、デバイスドライバ的に動作します。その後は通常プログラムとして動作致しますので、iSCSIディスク群も RAIDディスクとして使うために
(1) システム立ち上がり時に mdadm動作を失敗させる (=STOP状態で動作させる) (2) iSCSI用ソフトを動作させディスク群BもRAID6用ディスクとして準備する (3) mdadm でディスク群A,ディスク群Bを合わせて RAID6を再構成する
と致します。(1)はデバイスドライバレベル (2) 以降は通常のプログラムとして動作します。
mdadm.conf ファイル
ここで、/etc/mdadm/mdadm.conf ファイルが デバイスドライバとしての mdadm 動作時にどう参照されるか説明致します。当初この mdadm.conf ファイルが一体何時使われる良く分かりませんでした。私の理解が完全かどうか分かりませんが、mdadm は システム立ち上げ時デバイスドライバ的に働き以下の挙動をします。
デバイスドライバ mdadm の DEVICE(=ハードディスク) 参照手順 (1) 参照可能なディスクをスキャンして、情報が足りれば mdadm.conf は参照しない (2) 情報が足りない場合 mdadm.conf の DEVICE.. をスキャンする。 (3) DEVICE 項目記述されていればスキャンを実行して次の動作へ.. (4) DEVICE 項目記述がないと ディスク待ちになり、ディスクを独占して止まる
とかなり特殊な動作をします。
(1)は例えば RAID5 をディスク4台で構成して、その全てのディスクが1台のPCに有ったとすると 立ち上がり時に ディスクを(=要するにディスクのスーパーブロックを参照する)スキャンすると RAID5の構成情報が必要十分なので mdadm.conf は参照する必要なし、という事です。
(2) は例えば RAID6 をディスク8台で構成しており、4台づつ 2台のPCに分散していたとすると先に立ち上がったPCには 4台分のディスク(= 4台分の情報)しかなく構成情報が足りないという事になります。この時、初めて mdadm.conf の DEVICE を見に行ってそのディスクをスキャンしようとします。
(3) DEVICE 情報が書かれていれは、それはすなわちスキャンするべき情報の全てとみなして、そのディスクをスキャンして、情報が足りればそれで立ち上がるし、それでも足りない場合は立ち上がらない( =STOP 状態 ) という事です。なので、ここにダミー情報をいれてわざと情報が足りなくすれば STOP 状態を作り出す事ができます。
(4) DEVICE情報がない場合は、他にDEVICE が与えられるまで、ずっと待ちになります。現在のディスクは解放しないで使用し続ける事になります。
また、mdadmが 通常プログラムとして動作する場合は、mdadm.conf ファイルの設定に従って動作致します。以下にひな形を示します。mkconf で出す事もできます。
それぞれの項目は、例えば”mdadm.conf 徹底解説”でグーグル検索すればわかります。ここでは、本システムで使用するのに重要な 2つの項目について説明します。
#DEVICE partitions containers
ここには、スキャンするべき DEVICEについて書きます。フォーマットは
DEVICE 物理ボリュームのデバイスファイル
となります。例えば、sda, sdb のみスキャンさせたいと思えば、 DEVICE /dev/sda /dev/sdb または DEVICE /dev/sd[ab] と書きます。もしなにも書いていない場合は DEVICE partitions containers (=すべてのパーティションをスキャン) と同じになります。
# definitions of existing MD arrays
この行には、mdadm が操作・検索対象とするアレイの一覧を記述します。以下のコマンドで作成したARRAY を一番、下の行に貼り付ければ良いので、貼り付けても良いですし
# mdadm --detail --scan >> /etc/mdadm/mdadm.conf
で出力しても最終行に追加できます。(=貼り付けたの同じ) 古い行は消しておきます。プログラム的に mdadm 使い mdxx を作る時は デフォルトでは mdadm.conf を必ず参照しますので、 この行は重要です。 UUID が違っていたりすると、怒られた挙句、再構築してくれません。
# update-initramfs -u
をすれば、システムに組み込む事ができます。
なお、本システムではデバイスドライバ動作時にシステムを動作させない為の mdadm.conf を参照します。なので、通常プログラム用には別のファイルを準備した方が良いでしょう。( 下記の例では raid6.conf )
またプログラム的に明確に使う時には明示的にコマンド内に –scan を入れます。例えば
# mdadm -As A → アセンブル=再構築命令 s → scan=mdadm.confの内容に従う
mdadm.confの内容に従いスキャンして、SuperBlockの記述状態に再構築する。という具合です。なお、s 命令を使わない場合(アセンブル+直接ディスクを指定する)でも デフォルト mdadm.conf 内の UUID 等は見ている(?) はずです。デフォルト以外の 例えば raid6.conf を指定するには
# mdadm -As --config=/etc/mdadm/raid6.conf
と参照 conf ファイルを記入すれば良いです。
組み込みmdadm動作を止める ( =mdadmドライバ不活性化 )
例えば 8台のディスクから構成されているRAID6 の内 4台分の情報しかない場合 (=本システム) デバイスドライバ mdadm の DEVICE(=ハードディスク) 参照手順 の (3) の状態にすれば、STOP する事ができます。具体的には #DEVICE partitions containers の下に 何かデバイスを書けば良いのです。実験の結果 デバイスは 1つでも良いみたいですが、私は
DEVICE /dev/sd[wxyz]
と記入しました。これでディスクに全くアクセスしないで完全なSTOP状態にできます。今後このストップ状態を mdadmドライバ不活性化と呼ぶことにします。この時 # definitions of existing MD arrays には何も記入する必要はありません。まあ、止めてしまうのですから、動作させる前提の項目は必要ないですよね。以下に状態を示します。
iSCSI ディスク (slave側)
iSCSCディスクは 鈴木のOMV7 ベースセットに iSCSI target プラグイン = openmediavault-tgt 7.0 を導入しているだけです。
mdadmドライバ不活性化
OMV7 は最初から mdadm が導入済みです。つまり、OMV7には、mdadmデバイスドライバが入っているのです。slave側には mdadm は必要ないので、最初 remove しようとして見ましたが、うまくできませんでした。slave 側で、なにも処理をしないと、ディスクがRAID6用メンバーにフォーマットされた段階で、mdadmデバイスドライバがスーパーブロックを検出・動作しだして、システム立ち上がり時にRAIDが不完全に動作してしまいます。mdadm の項で説明したmdadmドライバ不活性化をする必要があります。具体的には Master側で不活性化時に設定した mdadm.conf をコピーするか、mdadm.conf の項目に DEVICE /dev/sd[wxyz] を書き込みます。 update-initramfs -u は必要かどうかわかりませんが、一応やっておきます。
iSCSI ソフトの動作確認
iSCSI プラグインを導入して、設定をした段階で、tgtdソフト が導入、設定がされています。具体的設定の方法や実際の確認については 【Part 2】に譲るとして、 tgtd の動作確認に簡単に触れておきます。mdadmドライバ不活性化処理をしないと、slave側が立ち上がり時に mdadm ドライバ がディスクを独占してしまい、tgtd ソフト側がディスクにアクセスできません。その場合はtgtd 動作確認をしてもディスクアクセスが表示されません。結果、master側から iSCSIディスクにアクセスできない事になります。以下はmdadmドライバ不活性化処理をし、正常動作の確認をしています。
不活性化処理に失敗し、正常に動作していない場合はこのdisk4 から disk7 が表示されません。iSCSCディスク(=Slave) は tgtd が正常動作確認ができれば、特に他の設定は必要ありません。(実際にはType Mismatch 対策のみ StartUptime.sh で行います)
DiskInfo ツール
Master側のディスクを正面左から DISK0, DISK1, DISK2, DISK3 とし、Slave側のディスクを正面左から DISK4, DISK5, DISK6, DISK7 とします。このDISK番号と /dev/disk/by-id/ata-xxxx のシリアルIDとsdx などのブロックデバイスの関係がすぐわかるよう、 OpenMediaVault7 (OMV7) で作る PC1台 54TB RAID5 システム【Part 1】【Part 2】 では、DiskInfo.sh、_DiskId.sh を導入しました。本システムではこれをもとに まず、slave 用の DiskInfoS.sh を作成します。_DiskIdS.sh は 生シリアル番号を書き換えます。DiskInfo.sh も DiskInfoS.sh に作り直して、動作を確認しておきます。
DiskInfoS.sh ( Disk-Information program for Slave )
Slave 側の DISK は DISK4, DISK5, DISK6, DISK7 とします。それに伴ってSlave側の _DiskIdS.sh と DiskInfoS.sh を作成します。まずは、 _DiskId.sh を直します。実行フラグを忘れずに。
#!/bin/bash # _DiskIdS.sh ( Disk by-Id return program for Slave ) DISK4=/dev/disk/by-id/ata-TOSHIBA_MG09ACA18TE_14xxxx_disk4 DISK5=/dev/disk/by-id/ata-TOSHIBA_MG09ACA18TE_14xxxx_disk5 DISK6=/dev/disk/by-id/ata-TOSHIBA_MG09ACA18TE_14xxxx_disk6 DISK7=/dev/disk/by-id/ata-TOSHIBA_MG09ACA18TE_14xxxx_disk7 # シリアル番号は実際から適当に変更してあります。 PATH=/usr/sbin:/usr/bin:/sbin:/bin if [ $1 = 4 ]; then echo $DISK4; exit 0; fi if [ $1 = 5 ]; then echo $DISK5; exit 0; fi if [ $1 = 6 ]; then echo $DISK6; exit 0; fi if [ $1 = 7 ]; then echo $DISK7; exit 0; fi echo "/dev/disk/by-id/
DiskInfoS.sh プログラムです。
#!/bin/bash # DiskInfoS.sh ( DiskInfoS.sh Disk-Information program for Slave program ) PATH=/usr/sbin:/usr/bin:/sbin:/bin DISK4=$(_DiskIdS.sh 4) DISK5=$(_DiskIdS.sh 5) DISK6=$(_DiskIdS.sh 6) DISK7=$(_DiskIdS.sh 7) echo "DISK4 : $DISK4 → $(readlink $DISK4)" echo "DISK5 : $DISK5 → $(readlink $DISK5)" echo "DISK6 : $DISK6 → $(readlink $DISK6)" echo "DISK7 : $DISK7 → $(readlink $DISK7)"
以下実行例です。
DiskInfoM.sh ( Disk-Information program for Master )
同様に Master側の _DiskIdM.sh と DiskInfoM.sh を作成します。 _DiskId.sh を以下に拡張しました。なお、_DiskIdM.sh は将来的には添え字 (=sdx[n] の [n] の部分) を導入した時にも共通で使えるように _DiskIdM.sh SUBx の時に [y] を返す部分も組み込んであります。
#!/bin/bash # _DiskIdM.sh ( Disk by-Id return program for Master ) DISK0=/dev/disk/by-id/ata-TOSHIBA_MG09ACA18TE_14xxxx_disk0; SUB0="[0]" DISK1=/dev/disk/by-id/ata-TOSHIBA_MG09ACA18TE_14xxxx_disk1; SUB1="[1]" DISK2=/dev/disk/by-id/ata-TOSHIBA_MG09ACA18TE_14xxxx_disk2; SUB2="[2]" DISK3=/dev/disk/by-id/ata-TOSHIBA_MG09ACA18TE_14xxxx_disk3; SUB3="[3]" DISK4=/dev/disk/by-id/scsi-360000000000000000e00000000010001; SUB4="[4]" DISK5=/dev/disk/by-id/scsi-360000000000000000e00000000020001; SUB5="[5]" DISK6=/dev/disk/by-id/scsi-360000000000000000e00000000030001; SUB6="[6]" DISK7=/dev/disk/by-id/scsi-360000000000000000e00000000040001; SUB7="[7]" # disk0~disk3のシリアル番号は実際から適当に変更してあります。 PATH=/usr/sbin:/usr/bin:/sbin:/bin if [ $# != 1 ]; then echo "/dev/disk/by-id/"; exit 0; fi if [ $1 = 0 ]; then echo $DISK0; exit 0; fi if [ $1 = 1 ]; then echo $DISK1; exit 0; fi if [ $1 = 2 ]; then echo $DISK2; exit 0; fi if [ $1 = 3 ]; then echo $DISK3; exit 0; fi if [ $1 = 4 ]; then echo $DISK4; exit 0; fi if [ $1 = 5 ]; then echo $DISK5; exit 0; fi if [ $1 = 6 ]; then echo $DISK6; exit 0; fi if [ $1 = 7 ]; then echo $DISK7; exit 0; fi if [ $1 = SUB0 ]; then echo $SUB0; exit 0; fi if [ $1 = SUB1 ]; then echo $SUB1; exit 0; fi if [ $1 = SUB2 ]; then echo $SUB2; exit 0; fi if [ $1 = SUB3 ]; then echo $SUB3; exit 0; fi if [ $1 = SUB4 ]; then echo $SUB4; exit 0; fi if [ $1 = SUB5 ]; then echo $SUB5; exit 0; fi if [ $1 = SUB6 ]; then echo $SUB6; exit 0; fi if [ $1 = SUB7 ]; then echo $SUB7; exit 0; fi echo "/dev/disk/by-id/"
DiskInfo.sh → DiskInfoM.sh として DISK4 〜 DISK7 の分を追加しました。
#!/bin/bash # DiskInfoM.sh ( DiskInfoM.sh Disk-Information program for Master ) PATH=/usr/sbin:/usr/bin:/sbin:/bin DISK0=$(_DiskIdM.sh 0) DISK1=$(_DiskIdM.sh 1) DISK2=$(_DiskIdM.sh 2) DISK3=$(_DiskIdM.sh 3) DISK4=iscsi-iqn.2024-06.local.openmedia-141:disk4 DISK5=iscsi-iqn.2024-06.local.openmedia-141:disk5 DISK6=iscsi-iqn.2024-06.local.openmedia-141:disk6 DISK7=iscsi-iqn.2024-06.local.openmedia-141:disk7 READL4=$(readlink /dev/disk/by-path/*$DISK4-lun-1) READL5=$(readlink /dev/disk/by-path/*$DISK5-lun-1) READL6=$(readlink /dev/disk/by-path/*$DISK6-lun-1) READL7=$(readlink /dev/disk/by-path/*$DISK7-lun-1) echo "" echo "DISK0 : $DISK0 → $(readlink $DISK0)" echo "DISK1 : $DISK1 → $(readlink $DISK1)" echo "DISK2 : $DISK2 → $(readlink $DISK2)" echo "DISK3 : $DISK3 → $(readlink $DISK3)" echo "" echo "DISK4 : $DISK4 → $READL4" echo "DISK5 : $DISK5 → $READL5" echo "DISK6 : $DISK6 → $READL6" echo "DISK7 : $DISK7 → $READL7"
実行すると DISK0 〜 DISK3 と シリアルNo と sdx との関係、DISK4 〜 DISK7 と iqn…と sdx との関係が一目瞭然ですね。
これで、ディスクを入れ替える場合等にも、該当のディスクを間違える事なく交換できると思います。例えば sdf を交換するには、DISK4 を交換すれば良いという事です。また、sdf 〜 sdi が表示されてなければ iSCSIディスクは認識されていない事になります。
電源OFF時 ツール ( ShutDowntime.sh program for Master )
RAIDシステムの場合 電源をOFF時にあらかじめ準備をしておく必要があります。ディスクアクセスが ACTIVE の状態で電源を切ると次回に通常の方法では再起動できなくなったり、最悪の場合たちあがらなくなったりする事があります。RAIDシステムに関する電源切断の準備を電源OFF時に実行される ShutDowntime.sh にまとめました。RAIDシステムが動作しだしたら、いきなり電源を切るなんて乱暴をしてはいけません。大切なデータを守る為にも電源OFF時は気を付ける必要があります。ShutDowntime.sh に入っているのはあくまで RAIDシステムに関して安全に電源を切る部分のみで、RAM ディスクの格納や、電源OFF時の他の手続きはふくまれません。また、ShutDowntime.sh は正規手続きのOMV電源OFF処理から呼び出されますが、たまに、完璧に動作しない事があります。ShutDowntime.sh は何度実行しても良いので、私は安全の為 パワーOFF時には SSH端末から先駆けて実行しています。Beep 1度で問題なく終了ですので(=ほぼ100%近く)、 その後、安心して パワーOFFします。Beep 2度の場合は Active状態ですので、 繰り返し再実行します。繰り返しますが、安全に電源OFFをしないと最悪の場合たちあがらなくなったりすることがあります。これほどしつこいのは、何度か怖い目にあっているからです。なにしろ、 数十テラのデータを失う事になるのですから、その恐怖は尋常ではありません。
なお、このプログラムは master 側に、置きます。では、何をするのかと言えば 最終的には
# mdadm --stop /dev/md0
を実行して、その後に
# cat /proc/mdstat
の出力を grep で 分析 “active” の文字が有るかどうかを見ています。 “active” があれば、STOP状態ではなく、すなわち リソースが解放されていないので、mdadm –stop /dev/md0 を続けます。
STOP状態になれば、リソースが解放されていますので、安心して電源をきれます。その状態なら、いきなり電源を切っても大丈夫です。(但し、RAM情報等は失われますので、やはりお行儀よく電源を切りましょう)
mdadm –stop /dev/md0 が実行できる ← /dev/md0 が何処にもマウントされていない ← umount /array-0 , umount /srv/dev…. が実行できる ← nfs 機能での接続を切断 ← SMB/CIFS 機能での接続を切断 となり結局、逆にたどって順次、切断していく必要があります。それでは、まず _Beep.sh です。Beep機能担当です。両プログラムとも /sbin/ 下に置きます。実行フラグが必要です。
#!/bin/bash # _Beep.sh ( Beep 1 to 4 program ) PATH=/usr/sbin:/usr/bin:/sbin:/bin if [ $# != 1 ]; then exit 0; fi if [ $1 = 4 ]; then beep -f 1000 -l 100; sleep 0.1 beep -f 1000 -l 100; sleep 0.1 beep -f 1000 -l 100; sleep 0.1 beep -f 1000 -l 100; exit 0 fi if [ $1 = 3 ]; then beep -f 1000 -l 100; sleep 0.1 beep -f 1000 -l 100; sleep 0.1 beep -f 1000 -l 100; exit 0 fi if [ $1 = 2 ]; then beep -f 1000 -l 100; sleep 0.1 beep -f 1000 -l 100; exit 0 fi if [ $1 = 1 ]; then beep -f 1000 -l 100; exit 0 fi
ShutDowntime.sh です。
#!/bin/bash # ShutDowntime.sh ( ShutDowntime.sh ShutDowntime program for Master) PATH=/usr/sbin:/usr/bin:/sbin:/bin LOG=/var/log/installer/ShutDowntime_log STP=/var/log/installer/Stop_FLAG LOOP=4 # LOOP 1,2,3,4 while [ $LOOP != 0 ] do date > $LOG sleep 1 _Beep.sh 4 # smba stop request echo "" >> $LOG echo "# smbcontrol all shutdown" >> $LOG smbcontrol all shutdown >> $LOG 2>&1 ; sleep 5 # nfs stop request echo "" >> $LOG echo "# umount -lat nfs4" >> $LOG umount -lat nfs4 >> $LOG 2>&1 ; sleep 5 echo "" >> $LOG echo "# umount -v /dev/md0" >> $LOG umount -v /dev/md0 >> $LOG 2>&1 echo "" >> $LOG echo "# umount -v /dev/md0" >> $LOG umount -v /dev/md0 >> $LOG 2>&1 echo "" >> $LOG echo "# umount -v /dev/md0" >> $LOG umount -v /dev/md0 >> $LOG 2>&1 echo "" >> $LOG echo "# df" >> $LOG df >> $LOG 2>&1 echo "" >> $LOG echo "# mdadm --stop /dev/md0" >> $LOG mdadm --stop /dev/md0 >> $LOG 2>&1 ; sleep 5 echo "" >> $LOG echo "# cat /proc/mdstat" >> $LOG cat /proc/mdstat >> $LOG 2>&1 echo "" >> $LOG echo "# mdadm --stop /dev/md0" >> $LOG mdadm --stop /dev/md0 >> $LOG 2>&1 ; sleep 5 echo "" >> $LOG echo "# cat /proc/mdstat" >> $LOG cat /proc/mdstat >> $LOG 2>&1 cat /proc/mdstat | grep active > $STP if [ -s $STP ]; then echo "mdadm : active" else echo "mdadm : inactive" LOOP=0 fi if [ $LOOP = 1 ]; then LOOP=0 ; fi if [ $LOOP = 2 ]; then LOOP=1 ; fi if [ $LOOP = 3 ]; then LOOP=2 ; fi if [ $LOOP = 4 ]; then LOOP=3 ; fi continue break done cat $LOG cat /proc/mdstat | grep active > $STP if [ -s $STP ]; then _Beep.sh 2 sleep 1 else _Beep.sh 1 sleep 1 fi
STOP状態になるまで、最大4回動作を繰り替えします。最後の一回の動作を $LOGに記録して、表示します。4回中どこかでSTOP状態になったら、その時点で Beepを 1度ならし、終了します。(大抵は1度で終了します。) 4度実行しても STOP状態にならない場合は Beep 2度(失敗終了) で終了します。