Home » FreeBSD » FreeBSD Disk Array Check Tool (Tag: , )

Drive Network では現在 radserv をメインに使用しています。

RAID カードに Adaptec RAID 2405 または 5405 が搭載されていますが、Adaptec から FreeBSD 向けの CUI ツール arcconf が提供されているため、ステータスやリビルドの進捗等も確認出来て重宝しています。

レンタルサーバ (ホスティングサービス) では、特に共有サービスの場合は書き込み頻度も高いのでディスク障害には敏感にならざるを得ません。

Drive Network では、ディスク監視ツールを自製しており、毎分ディスクアレイの状態を監視、不具合が見つかると同時に警告メールが技術者に通知しています。

現在は hp DL360 G5 も一部使用しているため、どちらの機器で動作しても RAID カードを検出して動作する様に作成しています。

#!/usr/bin/perl -w

use strict;

#// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
#// Controller
#// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

    #// ----------------------------------------------------------
    #// Option Parse
    #// ----------------------------------------------------------

    my @basename = split(/\//, $0);
    my $basename = pop(@basename);

    #// ----------------------------------------------------------
    #// Item Set
    #// ----------------------------------------------------------

    my $item = {
        mkdir    => '/bin/mkdir',
        cat      => '/bin/cat',
        chmod    => '/bin/chmod',
        ps       => '/bin/ps',
        hostname => '/bin/hostname',
        mail     => '/usr/bin/mail',
        awk      => '/usr/bin/awk',
        grep     => '/usr/bin/grep',
        chown    => '/usr/sbin/chown',

        aac      => '/dev/aac0',
        arcconf  => '/sbin/arcconf',

        ciss     => '/dev/ciss0',
        camctrl  => '/sbin/camcontrol inquiry da0 -D',
        target   => '/var/log/messages',

        maddr    => 'trouble@example.jp',

        base     => $basename,
        file     => '/tmp/.' . $basename
    };

    #// ----------------------------------------------------------
    #// Start
    #// ----------------------------------------------------------

    #// List

    if ( -e $item->{aac} )  { check_aac($item); }

    if ( -e $item->{ciss} ) { check_ciss($item); }

#// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
#// Model
#// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

sub check_aac {
    my ($item) = @_;

    my @line = `$item->{arcconf} getconfig 1`;

    my $level   = 0;
    my $stat_cl = '';
    my $stat_ld = '';
    my $stat    = {};
    my $stat_sg = {};
    my $stat_dv = {};
    my $num_dv  = '';

    foreach (@line) {
        chomp;

        $_ =~ s/(\s+)/ /g;
        $_ =~ s/^ //g;

        if ($_ =~ /^Controller Status : (.+)/) {
            $stat_cl = 'Controller Status : ' . $1 . "\n";

            $stat->{cl} = ($_ =~ /Optimal/) ? 2 : 1;
        }

        if ($_ =~ /^Status of logical device : (.+)/) {
            $stat_ld = 'Status of logical device : ' . $1 . "\n";

            $stat->{ld} = ($_ =~ /Optimal/) ? 2 : 1;
        }

        if ($_ =~ /^RAID level : (.+)/) {
            $level = 'RAID level : ' . $1 . "\n";
            next;
        }

        if ($_ =~ /^Segment (\d+) : (.+)/) {
            my $seg = 'Segment ' . $1;

            $stat_sg->{$seg} = $2;
        }

        if ($_ =~ /^Device \#(\d+)/) {
            $num_dv = '#' . $1;
            next;
        }

        if ($_ =~ /^State : (.+)/) {
            $stat_dv->{$num_dv} = $1;
        }
    }

    my $body = $stat_cl . $stat_ld . "\n" . $level;

    foreach (sort keys %$stat_sg) {
        next unless ($stat_sg->{$_});

        $body .= "$_  : " . $stat_sg->{$_} . "\n";
    }

    foreach (sort keys %$stat_dv) {
        next unless ($stat_dv->{$_});

        $body .= "Device $_  : " . $stat_dv->{$_} . "\n";
    }

    if ( -e $item->{file} ) {
        if ($stat->{cl} == 2 && $stat->{ld} == 2) {
            report($item, $body, 2);
        }

    } else {
        if ($stat->{cl} == 1 || $stat->{ld} == 1) {
            report($item, $body, 1);
        }
    }
}

sub check_ciss {
    my ($item) = @_;

    my $stat = 0;
    my $line = `$item->{camctrl} | $item->{grep} 'VOLUME OK'`;

    if ($line) {
        $stat = 1;

        unless ( -e $item->{file} ) { return undef; }
    }

    my @line = `$item->{cat} $item->{target} | $item->{grep} ciss0:`;

    my $body = '';

    foreach (@line) {
        next if ($_ =~ /HP Smart Array/ || $_ =~ /ITHREAD/);   #// boot msg

        $body .= $_;
    }

    if ( -e $item->{file} ) {
        if ($stat == 1) {
            report($item, $body, 2);
        }

    } else {
        report($item, $body, 1);
    }
}

sub report {
    my ($item, $body, $flag) = @_;

    my $host = `$item->{hostname}`; chomp $host;
    my $file = $item->{file};

    my $subj = "Disk Array: ($host)";
    if ($flag == 2) { $subj = "Info: Disk Array ($host)"; }

    open  FILE, "+>$file";
    print FILE $body;
    close FILE;

    `$item->{mail} -s "$subj" $item->{maddr} < $file`;

    if ($flag == 2) { unlink($file); }
}

障害発生時 通知メール本文サンプル:

Controller Status : Optimal
Status of logical device : Degraded

RAID level : 1
Segment 0  : Present (0,0) 3NP3RY3P00009943XLP6
Segment 1  : Missing
Device #0  : Online

障害復旧時 通知メール本文サンプル:

Controller Status : Optimal
Status of logical device : Optimal

RAID level : 1
Segment 0  : Present (0,0) 3NP3RY3P00009943XLP6
Segment 1  : Present (0,1) 3NP3JCEL00009920JP8D
Device #0  : Online
Device #1  : Online

arcconf は OS に依存しない出力結果のため、コマンドのパスや動作を事前確認すれば CentOS 等にも転用出来るでしょう。

Random Select

高速船ニューくだか (5)
沖縄本島 (No. 15 – 天神矢 ふたたび) の続きです。4 年程前に初めて久高島を訪れた際の景色は 景色 (久高島) で掲載しましたが、この時は慌てて飛び乗るくらいにギリギリで最後の
EXTRA COLD (クーラー)
エクストラコールド BAR で味わう氷点下のスーパードライが、自宅でも再現出来るクーラーがあり、必ずもらえる ! キャンペーン でゲット出来ると知りました。でも、48 枚シールを集めるということは、3
ヱビス 夏のコク (3)
普段ビールは ザ・プレミアム・モルツ を好んで飲んでいますが、たまに YEBISU ヱビスビール が飲みたくなる時があります。ヱビスを求めて訪れた近所のコンビニエンスストアで、ヱビス 夏のコク を見つ
どなん (1)
先日の出張 (05/27 ? 06/09) でついに初めて飲みました。飲みましたというより、なめました。景色 (久高島) でも触れましたが、与那国島好きな私としては一度は試してみたい泡盛でした。沖縄本
ゴーヤーチャンプルー定食
すっかり全メニュー制覇の勢いで ニライカナイ に通っていますが、まだそばと同じくらい沖縄ご飯の本命とも言える "ゴーヤーチャンプルー" を試していません。夜の居酒屋でおつまみとして
My DeskTop (Side)
linux-firefox 19 で起動せず轟沈しましたが、ふといくつかアプローチを思いついて再起動をしました。操作している機器は My DeskTop のデスクトップ (M/B ASUS P8P67
ミニストップ 沖縄フェア (7)
ミニストップ (沖縄フェア Part 1) の続きです。出社前にオフィスに近い神田美土代町店を訪れた後、お昼休みを利用して神田錦町 1 丁目店を訪れました。神田錦町 1 丁目店の方が、店内飲食スペース
らーめん 並 (きゃべつ) + トッピング (ほうれん草増) + ぎょうざ
横浜らーめん武蔵家 (きゃべつ + もやし) の続きです。写真は 12/08 の自宅近所の東綾瀬公園 (景色 (東綾瀬公園)) です。12 月に入ってもまだ銀杏の紅葉が多く見られますが、この後 4 日
トゥクトゥク・スキップ with miyo (3)
Special Night at Ti picchio で訪れた中目黒のナポリ・アマルフィ料理のお店 Ti picchio では、たまにライブが開催されます。生演奏を聞きながら合間に美味しい食事と、大
オリオンハッピーパーク (1)
以前から一度は行ってみたいと思いつつなかなか行けなかった場所に、先日の沖縄出張時の休日に同時に 2 個所行けました。まずは、売れ切れる場合も多いと評判の 山原そば (やんばるそば) の沖縄そばを初めて
Valid HTML5 Valid CSS3 Another HTML Lint