だめねこ飼育日誌 By suteneko
リネ2関連で検索して来たかたはこっちのwikiのほうがいいかも // プロフィール


2004-12-17 (Fri)

[サーバ] 設定メモ書き(5) [16:29]

昨日は飲みに誘われてたので何も欠けなかった。一昨日の続きです。

●RAIDディスク監視体制

○必要なバイナリ

3ware社(RAIDボードのメーカー)が配布しているCLIプログラム (tw_cli-freebsd-x86.tgz)

3ware社のページ(英語) にある。日本代理店のページには無いようだ。

○インストール

展開すると、tw_cli-freebsd-x86 というディレクトリの中にプログラムとマニュアルが入る。

$ tar xvzf tw_cli-freebsd-x86.tgz

x tw_cli-freebsd-x86/

x tw_cli-freebsd-x86/tw_cli

x tw_cli-freebsd-x86/tw_cli.8.html

x tw_cli-freebsd-x86/tw_cli.8.nroff

x tw_cli-freebsd-x86/tw_sched

x tw_cli-freebsd-x86/tw_sched.8.html

x tw_cli-freebsd-x86/tw_sched.8.nroff

x tw_cli-freebsd-x86/tw_sched.cfg

これを、それぞれのディレクトリにコピー

tw_cli, tw_sched

→ /usr/local/sbin/ に root:wheel 500 でコピー

tw_cli.8.nroff, tw_sched.8.nroff

→ 名前を *.8.nroff → *.8 に変更して、gzip 圧縮。

そして /usr/local/man/man8/ に root:wheel 444 で置いた

tw_cli.8.html, tw_sched.8.html

→ /usr/local/share/doc/ に twa/ というディレクトリを作り(root:wheel 755)

そこに root:wheel 444 で置いた

tw_sched.cfg

→ /usr/local/etc/tw_sched.cfg.sample (root:wheel 444) として置いた

パーミッションが500であるのは、tw_cli を一般ユーザで実行しようとしても

$ /usr/local/sbin/tw_cli


Error: (CLI:001) Only root/administrator can run this program.

と出るため。一般ユーザに触らせる意味が無い。



○dailyで動くように設定

/usr/local/etc/periodic/daily/401.status-twa (root:wheel 755) を作って、periodicにつっこみました。

#!/bin/sh


daily_status_twa_cli_cmd="/usr/local/sbin/tw_cli"

daily_status_twa_cli_controller="c0"



if [ -r /etc/defaults/periodic.conf ]

then

. /etc/defaults/periodic.conf

source_periodic_confs

fi



case "$daily_status_twa_enable" in

[Yy][Ee][Ss])

echo ""

echo "3ware RAID status:"

echo ""

$daily_status_twa_cli_cmd info

$daily_status_twa_cli_cmd info $daily_status_twa_cli_controller

;;


*) ;;

esac


exit 0

そして /etc/periodic.conf に以下を。

daily_status_twa_enable="YES"

これで、daily status output のメールに以下のようなのが追加される。

3ware RAID status:



Ctl Model Ports Drives Units NotOpt RRate VRate

------------------------------------------------------------------

c0 9500S-4LP 4 4 1 0 4 4



Unit UnitType Status %Cmpl Stripe Size(GB) Cache AVerify OvrECC

------------------------------------------------------------------------------

u0 RAID-5 OK - 64K 558.762 ON OFF OFF


Port Status Unit Size Blocks Serial

---------------------------------------------------------------

p0 OK u0 189.92 GB 398297088 B403xxxx

p1 OK u0 189.92 GB 398297088 B403xxxx

p2 OK u0 189.92 GB 398297088 B403xxxx

p3 OK u0 189.92 GB 398297088 B403xxxx

[サーバ] 設定メモ書き(6) [16:41]

●IDEディスク監視体制

○必要なport

sysutils/smartmontools make 時のオプションは無し


○dailyで動くように設定

RAIDと同様。periodic につっこんだ。/usr/local/etc/periodic/daily/402.status-smart (root:wheel 755)

#!/bin/sh


daily_status_smart_smartctl_cmd="/usr/local/sbin/smartctl"

daily_status_smart_smartctl_option="-H -l error /dev/ad0"



if [ -r /etc/defaults/periodic.conf ]

then

. /etc/defaults/periodic.conf

source_periodic_confs

fi



case "$daily_status_smart_enable" in

[Yy][Ee][Ss])

echo ""

echo "SMART status:"

echo ""

$daily_status_smart_smartctl_cmd $daily_status_smart_smartctl_option

;;


*) ;;

esac


exit 0

そして /etc/periodic.conf に以下。

daily_status_smart_enable="YES"

daily status output のメールのサンプル

SMART status:


smartctl version 5.xx Copyright (C) 2002-4 Bruce Allen

Home page is http://smartmontools.sourceforge.net/


The SMART RETURN STATUS return value (smartmontools -H option/Directive)

can not be retrieved with this version of ATAng, please do not rely on this value

=== START OF READ SMART DATA SECTION ===

SMART overall-health self-assessment test result: PASSED


SMART Error Log Version: 1

No Errors Logged

quietオプション(-q errorsonly)を追加した方が良いかもしれない。

[サーバ] 設定メモ書き(7) [19:14]

●システム監視体制 (HotSaNIC)

○実際に動いている例

http://suteneko.jp/HotSaNIC/


○必要なport

net/rrdtool make 時のオプションは無し

sysutils/xmbmon make 時のオプションは WITHOUT_X11=yes

graphics/ImageMagick make 時のオプションは無し (無くても可だが汚いグラフになる)

snmpは不要



○port以外で必要なバイナリ

HotSaNIC http://hotsanic.sourceforge.net/

使ったのは、0.5.0系のHotSaNIC。まだ正式リリースではなくpre5版だが、特に不具合は感じてない



○インストール

(1) (rootで作業) hotsanic というユーザ/グループを作る。自動起動を設定するために必要なので shell は /bin/sh。nologin では駄目だった。パスワードは「*」(ログインできない) にした。

(2) (一般ユーザで作業) パッケージを取ってきて展開。HotSaNIC というディレクトリの中にいろいろできる。

(3) (一般ユーザで作業) cd HotSaNIC; ./setup.pl

どのモジュールを有効にするかとか、いろいろ聞かれる。あとで変えられるので適当に。私の設定は以下

APCUSV :無効(n)

APPS :有効(y)、web上で公開(y)

BIND :無効(n)

DISKIO :有効(y)、web上で公開(y)

DNET :無効(n)

MAILQ :有効(y)、web上で公開(y)

NETSTAT :有効(y)、web上で公開(y)

NETWORKS :無効(n)

PART :有効(y)、web上で公開(y)

PING :無効(n)

SENSORS :有効(y)、web上で公開(y)

SHOUTCAST :無効(n)

SYSTEM :有効(y)、web上で公開(y)

TRAFFIC :有効(y)、web上で公開(y)

WORMS :無効(n)

これを選択したあと何も進まなかったのでenter押してあげたら進んだ。他にも、同じ質問が何回も出てきたりしたので、setup.pl はまだ (少なくとも FreeBSD に対しては)不具合がある模様。まぁ setup が難ありでも、実際に動けば問題ないのだけれど。

ちなみに上のモジュール設定だと、たとえばこんな感じで

setting up diskio ...

not supported yet, sorry

Please check the settings file and adapt it to satisfy your needs.

文句を言われたりもする。改造するつもりなので無視。



(4) (一般ユーザで作業) 設定

var/settings/ に設定ファイルがある。var/settings/main に対して settings という名前で symbolic link が貼られている。

デフォルトの設定から変えたところは、以下。



・var/settings/main

DAEMONDIR="/usr/local/HotSaNIC"

WEBDIR="/usr/local/www/data/HotSaNIC"

手順 (5)(6) で使う予定のディレクトリに合わせる


IMAGEFORMAT="png"

LZWの特許は切れたはずなのでgifでも問題ないとは思うが、なんとなく。


DTIME="6"

グラフを6分ごとに作り直す。


CTIME="0.1"

縮小画像を0.1時間(=6分)ごとに作り直す。要するにグラフ生成ごとに毎回作ることになる。


CONVERTMETHOD="I::M"

縮小画像を作るのに perl の Image::Magick を使う。


THUMBSIZE="46%"

このへんはお好みで。


REFRESH="60"

html のリロード時間。


・var/settings/mod_apps

APP=httpd

監視するアプリを設定。perl も監視したほうがいいかも、とか最近おもってたり。


・var/settings/mod_diskio

DEV=da0,da0

DEV=ad0,ad0


・var/settings/mod_part

DRIVE=/dev/da0s1a,root-filesystem

DRIVE=/dev/da0s1g,/home

DRIVE=/dev/ad0s1d,/tmp

DRIVE=/dev/da0s1d,/usr

DRIVE=/dev/da0s1e,/var

DRIVE=/dev/da0s1f,/var/log/httpd

DRIVE=/dev/ad0s1e,/backup


・var/settings/mod_sensors

SENSOR=0,TEMP0,Temperture 1,,,,C

SENSOR=1,TEMP1,Temperture 2,,,,C

SENSOR=2,TEMP2,Temperture 3,,,,C

SENSOR=3,FAN0,Fan rotate,,,,RPM

SENSOR=4,VC0,VCore 1,,,,V

SENSOR=5,VC1,VCore 2,,,,V

SENSOR=6,V33,+3.3V,,,,V

SENSOR=7,V50P,+5V,,,,V

SENSOR=8,V12P,+12V,,,,V

SENSOR=9,V12N,-12V,,,,V

SENSOR=a,V50N,-5V,,,,V


・var/settings/mod_traffic

DEV="gif0,12500000,12500000,100 MBit Ethernet"


(5) (rootで作業) 上で作ったものを /usr/local/HotSaNIC にコピー、chown -R hotsanic:hotsanic *

どうも var ディレクトリ以外でもいろんなところに data file/temporary file を生成するようで、まるごと chown してやらなければ駄目だった。ちょっとお行儀が悪いですよね…

(6) (rootで作業) 画像が生成されるディレクトリを作成。mkdir /usr/local/www/data/HotSaNIC

(7) (rootで作業) cd /usr/local/HotSaNIC; ./makeindex.pl

index.html とかが生成されるので、それを適当に編集。一回生成されたら自動では作り直されないのでご自由に。

(8) (rootで作業) cd /usr/local/www/data/HotSaNIC; chown -R hotsanic:hotsanic *

画像を生成するディレクトリを hotsanic さんが書き込み可能にする。




○改造

・rrdtimer.pl (Context diff)

HotSaNIC は10秒ごとにシステムからデータを取ってくる。グラフを作る時間とは無関係に10秒ごとにデータを収集している。

データを取ってくるだけでも、決して軽い処理ではないと思うのだけれど…。

この間隔は10秒でソースに埋め込んであるので、これを30秒ごとに変更した。

*** rrdtimer.pl.orig Thu Dec 9 22:05:55 2004

--- rrdtimer.pl Thu Dec 9 22:06:12 2004

***************

*** 181,187 ****

$lastconvert+=$CONFIG{CTIME};

}

}

! $sleeptime=10-(time % 10);

sleep $sleeptime;

}

}

--- 181,187 ----

$lastconvert+=$CONFIG{CTIME};

}

}

! $sleeptime=30-(time % 30);

sleep $sleeptime;

}

}


・modules/diskio/platform/freebsd.pm (Context diff)

rrdtool に小数を入れようとして失敗して、うまく動いていないようなので、int() を追加。rrdtool って小数扱えないの?

*** modules/diskio/platform/freebsd.pm.orig Thu Dec 9 22:07:51 2004

--- modules/diskio/platform/freebsd.pm Thu Dec 9 22:08:05 2004

***************

*** 28,34 ****

if ( ! -e "rrd/$drive.rrd" ) {

system("./makerrd","$drive","U");

}

! RRDs::update "rrd/$drive.rrd",time.":".($KBt*1024).":$xfr:$time:".($MB*1024*1024);

if ($ERROR = RRDs::error) {

print time," ",$args{MODNAME},

": unable to update `$drive.rrd': $ERROR\n";

--- 28,34 ----

if ( ! -e "rrd/$drive.rrd" ) {

system("./makerrd","$drive","U");

}

! RRDs::update "rrd/$drive.rrd",time.":".int($KBt*1024).":".int($xfr).":$time:".int($MB*1024*1024);

if ($ERROR = RRDs::error) {

print time," ",$args{MODNAME},

": unable to update `$drive.rrd': $ERROR\n";


../modules/netstat/platform/freebsd.pm (File)


新規作成。netstat コマンドを叩いて、その出力で "ESTABLISHED" とか書いてあるところの matching を取って、数えているだけです。原理的には FreeBSD じゃなくても使えるはず。


../modules/netstat/diagrams.pl Context diff

../modules/netstat/makerrd (Context diff)

この2つは、FreeBSD のときは動作しないようになっていた。if の条件だけを修正。

*** modules/netstat/diagrams.pl.orig Thu Dec 9 22:11:49 2004

--- modules/netstat/diagrams.pl Thu Dec 9 22:11:55 2004

***************

*** 77,83 ****


my ($prints,$xs,$ys);


! if ($^O =~ /linux/) {

($prints,$xs,$ys)=RRDs::graph $TEMPNAME, "-i", "-b","1024", "-v", $LEGEND,

"-s","-$range", "-w",$CONFIG{"WIDTH"}, "-h",$CONFIG{"HEIGHT"}, "-a", uc($IMGFMT),

"-u",1, "-l",0, "--title", "socket stats for $name - last $descr ($DATESTRING)",

--- 77,83 ----


my ($prints,$xs,$ys);


! if ($^O =~ /linux/ || $^O =~ /freebsd/) {

($prints,$xs,$ys)=RRDs::graph $TEMPNAME, "-i", "-b","1024", "-v", $LEGEND,

"-s","-$range", "-w",$CONFIG{"WIDTH"}, "-h",$CONFIG{"HEIGHT"}, "-a", uc($IMGFMT),

"-u",1, "-l",0, "--title", "socket stats for $name - last $descr ($DATESTRING)",

*** modules/netstat/makerrd.orig Thu Dec 9 22:12:19 2004

--- modules/netstat/makerrd Thu Dec 9 22:12:25 2004

***************

*** 14,20 ****


echo $SECS $MODNAME: setting up database $DEV.rrd for values [0..unknown]


! if [ $OS_TYPE = "Linux" ]; then

$BINPATH/rrdtool create rrd/$DEV.rrd --step 10 \

DS:unknown:GAUGE:300:0:U \

DS:established:GAUGE:300:0:U \

--- 14,20 ----


echo $SECS $MODNAME: setting up database $DEV.rrd for values [0..unknown]


! if [ $OS_TYPE = "Linux" -o $OS_TYPE = "FreeBSD" ]; then

$BINPATH/rrdtool create rrd/$DEV.rrd --step 10 \

DS:unknown:GAUGE:300:0:U \

DS:established:GAUGE:300:0:U \


../modules/sensors/platform/freebsd.pm (Context diff)

センサーから取れる情報に「-5V」「-12V」があったのだが、負の値を入れると nan とされていた。絶対値を入れるようにして修正。rrdtool って小数だけじゃなくて負の値も扱えないの?

*** modules/sensors/platform/freebsd.pm.orig Thu Dec 9 22:10:04 2004

--- modules/sensors/platform/freebsd.pm Thu Dec 9 22:10:13 2004

***************

*** 26,32 ****

if ( ! -e "rrd/$dev.rrd" ) { system("./makerrd","$dev","10000") }


# update database

! RRDs::update "rrd/$dev.rrd",time.":".$value;

if ($ERROR = RRDs::error) { print time," ",$args{MODNAME},": unable to update `$dev.rrd': $ERROR\n"; }

}

}

--- 26,32 ----

if ( ! -e "rrd/$dev.rrd" ) { system("./makerrd","$dev","10000") }


# update database

! RRDs::update "rrd/$dev.rrd",time.":".abs($value);

if ($ERROR = RRDs::error) { print time," ",$args{MODNAME},": unable to update `$dev.rrd': $ERROR\n"; }

}

}


../modules/traffic/diagrams.pl (Context diff)

トラフィックのグラフが上下に出るのって見にくくないですか?

私はこれ、なんか好きになれなかったので、両方とも上に出るように修正。

グラフを作るときに "CDEF:avgout_draw=avgout,$SWAPOI,*" とやって-1をかけて負の値にしていたので(←逆ポーランド記法です)、$SWAPOIの値を1にした。rrdファイルに入っているデータは修正していない。(ここだけ書き換えれば過去のデータを修正しなくてもグラフが全部書き換わる)

*** modules/traffic/diagrams.pl.orig Thu Dec 16 17:35:57 2004

--- modules/traffic/diagrams.pl Thu Dec 16 17:51:54 2004

***************

*** 56,62 ****

if ($SCALE eq "") { $SCALE=-1000; }

if ($SCALE > 0) { push @FEATURES,"--rigid"; }


! my $SWAPOI=-$SWAPIO;


# generate diagrams

#

--- 56,63 ----

if ($SCALE eq "") { $SCALE=-1000; }

if ($SCALE > 0) { push @FEATURES,"--rigid"; }


! #my $SWAPOI=-$SWAPIO;

! my $SWAPOI=$SWAPIO;


# generate diagrams

#


○実験

su hotsanic

cd /usr/local/HotSaNIC

../rrdgraph start

しばらく待って画像が出てくれば成功。

../rrdgraph stop

止まれば (ps x してプロセスが残らなければ) 成功。




○自動起動設定

/usr/local/etc/rc.d/hotsanic.sh を root:wheel 555 で作成。

スクリプトの内容をサボってるので、rc.conf で起動する/しないの設定ができなかったり。

#!/bin/sh


PREFIX=/usr/local

HOTSANICBIN=/usr/local/HotSaNIC/rrdgraph

HOTSANICUSER=hotsanic


case $1 in

start)

[ -x ${HOTSANICBIN} ] && {

echo ' hotsanic'

su -l ${HOTSANICUSER} -c "exec ${HOTSANICBIN} start"

}

;;


stop)

[ -x ${HOTSANICBIN} ] && {

su -l ${HOTSANICUSER} -c "exec ${HOTSANICBIN} stop"

}

;;


restart|reload)

[ -x ${HOTSANICBIN} ] && {

su -l ${HOTSANICUSER} -c "exec ${HOTSANICBIN} restart"

}

;;


status)

[ -x ${HOTSANICBIN} ] && {

su -l ${HOTSANICUSER} -c "exec ${HOTSANICBIN} status"

}

;;


*)

echo "usage: `basename $0` {start|stop|restart|reload|status}" >&2

exit 64

;;

esac

本日のツッコミ