2013-05-31
IPv6環境でSNMPで情報を引っ張ってきたいのだが、net-snmpをインストールしてsnmpdを起動したが、getできない。
監視サーバをnagios01、監視対象ホストをclient01とした時の例。
client01$ sudo yum install net-snmp net-snmp-utils
client01$ sudo /etc/init.d/snmpd start
nagios01$ snmpwalk -v 1 -c public client01 UCD-SNMP-MIB::laLoad.1
No log handling enabled - turning on stderr logging
getaddrinfo: client01 Name or service not known
snmpwalk: Unknown host (client01)
snmpwalkなどでIPv6のサーバへ問い合わせる場合は、ホスト名の前に「udp6」を明示的に指定する必要があるようだ。しかし、
nagios01$ snmpwalk -v 1 -c public udp6:client01 UCD-SNMP-MIB::laLoad.1
Timeout: No Response from udp6:client01
タイムアウトになってしまう。ちなみに、net-snmpは5.0以降IPv6に対応している ということなので、5.0以降がインストールされていれば、snmpwalkコマンドもIPv6を扱えるはず。
クライアント側を見てみる。
client01$ netstat -lanp
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
(中略)
udp 0 0 0.0.0.0:161 0.0.0.0:* 12403/snmpd
0.0.0.0:161ってことは、IPv4だけで、IPv6でリッスンしていない。
設定ファイルを見てみる。
client01$ cat /etc/snmp/snmpd.conf
(以下抜粋)
com2sec notConfigUser localhost public
com2sec notConfigUser nagios01 public
group notConfigGroup v1 nogConfigUser
access notConfigGroup "" any noauth exact systemview none none
syslocation Unknown (edit /etc/snmp/snmpd.conf)
syscontact Root <root@localhost> (configure /etc/snmp/snmp.local.conf)
view all included .1 80
dontLogTCPWrappersConnects yes
どうやら、デフォルトの設定では、IPv4しかリッスンしない設定らしい。以下のように、明示的にv6でも使えるように追記。
\# 以下の4行を追記(下の2行は実際の設定に応じて変更)
agentaddress udp:161
agentaddress udp6:161
com2sec6 notConfigUser localhost public
com2sec6 notConfigUser nagios01 public
snmpd を再起動すると、v6でもリッスンするようになった。
client01$ sudo /etc/init.d/snmpd restart
client01$ netstat -lanp
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
(中略)
udp 0 0 0.0.0.0:161 0.0.0.0:* 12442/snmpd
udp 0 0 :::161 :::* 12442/snmpd
これで値を取れるようになった。
nagios01$ snmpwalk -v 1 -c public udp6:client01 UCD-SNMP-MIB::laLoad.1
UCD-SNMP-MIB::laLoad.1 = STRING: 0.03
まとめ
IPv6環境でnet-snmpを使うときは
net-snmp 5.0以降を使う
snmpd.confで、agentaddress udp6:161とcom2sec6を設定する
snmpwalkなどで値を取る時はアドレスの前にudp6:をつける
2013-02-18
Nagiosのプラグインには、NICのステータス(up/downとか)をチェックする check_ifstatus がある。しかし、ネゴシエーションなどの関係で、リンクアップはしているがリンクスピードが1Gbps full duplexであってほしいのに10Mbps halfとかになっているということはよくあること。
探してみた感じこれをチェックするためのNagiosプラグインはなさそうだったので、シェルスクリプト書いてみた。本当はcheck_ifstatus(perl)を拡張するのがいいのかもしれないが。
#!/bin/bash
#END STATUS
OK=0
WARNING=1
CRITICAL=2
UNKNOWN=3
# snmpwalk command
SNMPWALK=/usr/local/net-snmp/bin/snmpwalk
# default parameter
RET=${OK}
IP="127.0.0.1"
COMMUNITY="public"
INTERFACE="eth0"
SPEED=""
WARN_FLG="FALSE"
CRIT_FLG="FALSE"
# get parameter
while getopts H:C:i:w:c: OPT
do
case $OPT in
"H") IP="$OPTARG" ;;
"C") COMMUNITY="$OPTARG" ;;
"i") INTERFACE="$OPTARG" ;;
"w") WARN_FLG="TRUE" ; WARN_TH="$OPTARG" ;;
"c") CRIT_FLG="TRUE" ; CRIT_TH="$OPTARG" ;;
esac
done
# check parameter
if [ ${WARN_FLG} = "FALSE" ] && [ ${CRIT_FLG} = "FALSE" ] ; then
echo "Parameter Error : -w or -c is required entry"
exit ${WARNING}
fi
# get speed
INDEX=`${SNMPWALK} -t 10 -v 2c -c ${COMMUNITY} ${IP} ifDescr | grep ${INTERFACE} | sed 's/.*\.//' | sed 's/ .*//'`
SPEED_bps=`${SNMPWALK} -t 10 -v 2c -c casnmp ${IP} ifSpeed.${INDEX} | awk '{print $4}'`
SPEED=`expr ${SPEED_bps} / 1000000`
if [ -z ${SPEED} ] ; then
echo "Can't get ${INTERFACE} speed"
exit ${WARNING}
fi
# get result
if [ ${WARN_FLG} = "TRUE" ] && [ ${CRIT_FLG} = "TRUE" ] ; then
if [ ${SPEED} -lt ${CRIT_TH} ] ; then
RET=${CRITICAL}
fi
if [ ${SPEED} -lt ${WARN_TH} ] && [ ${OFFSET} -ge ${CRIT_TH} ] ; then
RET=${WARNING}
fi
fi
if [ ${WARN_FLG} = "TRUE" ] && [ ${CRIT_FLG} = "FALSE" ] ; then
if [ ${SPEED} -lt ${WARN_TH} ] ; then
RET=${WARNING}
fi
fi
if [ ${WARN_FLG} = "FALSE" ] && [ ${CRIT_FLG} = "TRUE" ] ; then
if [ ${SPEED} -lt ${CRIT_TH} ] ; then
RET=${CRITICAL}
fi
fi
# information
echo "${INTERFACE} speed is ${SPEED}Mbps now"
exit ${RET}
2013-01-10
Quoraの問答は本当に面白いものばかり。技術的でないのもかなり興味深いものが多いが、またLinuxについてのネタで分かりやすいのがあったので訳してみた。
Linuxがモノリシックカーネルであるというのはどういう意味か?
モノリシックカーネル
モノリシックカーネルは、プロセスやメモリの管理、例外の取扱い、入出力のやり取り、ファイルシステムなどほとんどの基本的なシステムサービスを実行する。層構造になっており、基礎的なプロセス管理からOSの他の部分(ライブラリ群や、層の最上位であるアプリケーション)とのインタフェースからなっている。基本的なサービスをカーネルスペースに含めることは、次のような大きな3つの欠点となる。
カーネルサイズが大きくなる
拡張性に乏しい
メンテナンス性が悪い
マイクロカーネル
カーネルの機能を基本的なプロセス間通信と入出力制御のみに絞り、ユーザスペースの他のシステムサービスを普通のプロセス(「サーバ」と呼ばれる)としてしまうのがコンセプトである。あるサーバはメモリに関する管理を行い、別のサーバはプロセス管理、さらに他のサーバはドライバの管理…といった具合だ。サーバはカーネルスペースでは実行されないので、ユーザプロセスが特権モードに入ったり出たりするためにいわゆるコンテキストスイッチが発生してしまう。この方式では、マイクロカーネルはもはやシステムサービスの塊ではなく、プロセス間通信とプロセスとその下のハードウェアとの通信を制御するための、単にいくつかの基本的な抽象化とプリミティブを提供するだけである。通信は直接行われないので、独立した通信と拡張性をもたらす、メッセージングの仕組みが使われる。
ここでLinuxカーネルの話に入ろう。Linuxカーネルは、モノリシックカーネルである。しかし、Linuxの美しいところは、どちらとしてもコンパイルできることである!
モノリシックカーネル
1つのバイナリファイル
全ドライバがカーネル自体に含まれる
モジュラーカーネル
複数のカーネルのファイル
ドライバはmodprobeコマンドなどでカーネルにロードしたりアンロード可能。lsmodやmodprobeのmanページを参照
ほとんど全てのドライバはカーネルに対してビルドされてリンクされる
以下のカーネルコンフィグオプションの設定でモジュラーカーネルをビルドすることができる。
Enable loadable module support (CONFIG_MODULES) [Y/n/?]
このオプションにYと答えるとモジュラーカーネルとなり、各機能やドライバそれぞれに関して3つの選択肢が現われる。
m
ドライバをモジュールとしてコンパイルできる
y
カーネル自身に組み込む
n
機能・ドライバを含まない
(CONFIG_MODULES)オプションを n に設定した場合モノリシックカーネルとなり、各機能やドライバそれぞれに2つの選択肢がある。
y
機能・ドライバを含む
n
機能・ドライバを含まない