■過去のデータを残したい場合にはバックアップをとって下さい。
今回はNICの順序が原因と疑ってかかっていますので、
通常、rsync等でバックアップしているかと思いますが、その作業は省略しています。
「localhost_3.html」「localhost_4.html」は残っており、
作り直したインデックスページからはリンクされていませんが、
直リンクで不具合以前の状況が確認できます。
■「mrtg.cfg」に対して以下のようなエラー通知のメールが来ました。
設定ファイルをCPU、メモリ、ディスクとは別にするというのは正しかったようです。
SNMPGET Problem for ifInOctets.4 ifOutOctets.4 sysUptime sysName on public@local
host::::::v4only
■以下のようにMIBを参照出来るかどうかを確認する。
「sysUptime」が見つからないようだ。
$ echo 'ifInOctets.3 ifOutOctets.3 sysUptime sysName' | \
for list in `xargs`;do snmptranslate -On -IR "$list";done
.1.3.6.1.2.1.2.2.1.10.3
.1.3.6.1.2.1.2.2.1.16.3
Unknown object identifier: sysUptime
.1.3.6.1.2.1.1.5
■結果をコピペする際に、echo ''で囲って解決できるものを探す。
v2のMIBのようです。
$ echo '.1.3.6.1.2.1.2.2.1.10.3
.1.3.6.1.2.1.2.2.1.16.3
Unknown object identifier: sysUptime
.1.3.6.1.2.1.1.5' | grep -v Unknown | \
for next in `xargs` ;do snmpwalk -v 1 -c public localhost ${next};done
SNMPv2-MIB::sysName.0 = STRING: sample-server
■「-v 2c」に変更し、再実行
$ echo '.1.3.6.1.2.1.2.2.1.10.3
.1.3.6.1.2.1.2.2.1.16.3
Unknown object identifier: sysUptime
.1.3.6.1.2.1.1.5' | grep -v Unknown | \
for next in `xargs` ;do snmpwalk -v 2c -c public localhost ${next};done
IF-MIB::ifInOctets.3 = No Such Instance currently exists at this OID
IF-MIB::ifOutOctets.3 = No Such Instance currently exists at this OID
SNMPv2-MIB::sysName.0 = STRING: sample-server
■「ifOutOctets.3」「sysUptime」が見つかりません。
「sysName」は既にあるので、「OBJECT-TYPE」があるのは当然です。
$ echo 'ifInOctets.3 ifOutOctets.3 sysUptime sysName' | \
for list in `xargs`;do \
cat /usr/share/snmp/mibs/* | grep "$list" --color || echo "Not Found $list"; \
done
sysContact.0 or ifInOctets.3.
Not Found ifOutOctets.3
Not Found sysUptime
sysName OBJECT-TYPE
sysName OBJECT-TYPE
sysContact, sysName, sysLocation,
■ところで元の設定ファイルを見ると、上記のようなMIBを参照していません。
これは他のCPU、メモリ、ディスクの設定ファイルでも同じです。
$ echo 'ifInOctets.3 ifOutOctets.3 sysUptime sysName' | \
for list in `xargs`;do \
sudo cat /etc/mrtg.cfg | grep "$list" --color || echo "Not Found $list";\
done
Not Found ifInOctets.3
Not Found ifOutOctets.3
Not Found sysUptime
Not Found sysName
■コマンドで設定ファイルをチェックしてみますが、そのままだと怒られます。
$ sudo mrtg --check /etc/mrtg.cfg
-----------------------------------------------------------------------
ERROR: Mrtg will most likely not work properly when the environment
variable LANG is set to UTF-8. Please run mrtg in an environment
where this is not the case. Try the following command to start:
env LANG=C /usr/bin/mrtg --check /etc/mrtg.cfg
-----------------------------------------------------------------------
■「/etc/cron.d/mrtg」でも「env LANG=C」があるのでまとめてチェックします。
if [ -x /usr/bin/mrtg ] && [ -r /etc/mrtg.cfg ]; then \
env LANG=C /usr/bin/mrtg /etc/mrtg.cfg 2>&1 | tee -a /var/log/mrtg/mrtg.log ;\
fi
$ echo /etc/mrtg*.cfg | \
for list in `xargs`;do \
echo -n "$list ... ";
sudo env LANG=C /usr/bin/mrtg --check $list && echo "ok"; \
done;echo ""
/etc/mrtg.cfg ... ok
/etc/mrtg_cpu.cfg ... ok
/etc/mrtg_disk.cfg ... ok
/etc/mrtg_mem.cfg ... ok
■ちなみにログを見ると、「localhost_3」「localhost_4」の問題のようです。
$ sudo grep -i error /var/log/mrtg/mrtg.log | tail -4
2011-07-24 19:20:02: ERROR: Target[localhost_3][_IN_] ' $target->[1]{$mode} ' did not eval into defined data
2011-07-24 19:20:02: ERROR: Target[localhost_3][_OUT_] ' $target->[1]{$mode} ' did not eval into defined data
2011-07-24 19:20:02: ERROR: Target[localhost_4][_IN_] ' $target->[2]{$mode} ' did not eval into defined data
2011-07-24 19:20:02: ERROR: Target[localhost_4][_OUT_] ' $target->[2]{$mode} ' did not eval into defined data
■「vmnet1」、「vmnet8」がそれです。
$ sudo grep localhost_[34] /etc/mrtg.cfg | grep SetEnv | awk '{print $3}'
MRTG_INT_DESCR="vmnet1"
MRTG_INT_DESCR="vmnet8"
■NICにポート転送の設定を変更してからのエラーである為、
認識順序が入れ替わったことが原因と思われます。
$ ip addr 2>&1 | awk -F\: '{print $1 " ->" $2}' | grep -v "^\ "
1 -> lo
2 -> eth0
5 -> vmnet1
6 -> vmnet8
■今回はcfgmakerで作成した順番が保証された設定ファイルなので、まずは手作業で。
$ sudo nl -b a /etc/mrtg.cfg | grep vmnet1 | head -1 | sed s/'00-..-..-..-..-..'/'00-xx-xx-xx-xx-xx'/g
117
$ sudo sh -c 'head -n 116 /etc/mrtg.cfg > /etc/mrtg_noerrnic.cfg.tmp'
■NICの設定を外して「temp_noerrnic」ディレクトリに吐き出すようにします。
☆元の作業ディレクトリを確認。
$ grep ^WorkDir /etc/mrtg_noerrnic.cfg
WorkDir: /var/www/mrtg
☆「/var/www/mrtg/temp_noerrnic」が無ければ作成
$ test -d /var/www/mrtg/temp_noerrnic || sudo mkdir /var/www/mrtg/temp_noerrnic
☆「sed」を使って書き換え。
$ sudo sh -c 'sed s%"WorkDir: /var/www/mrtg"%"&/temp_noerrnic"%g /etc/mrtg_noerrnic.cfg.tmp > /etc/mrtg_noerrnic.cfg'
☆書き換え後の作業ディレクトリを確認
$ grep ^WorkDir /etc/mrtg_noerrnic.cfg
WorkDir: /var/www/mrtg/temp_noerrnic
☆3回実行します。
$ for list in `seq 0 2`;do sudo sh -c 'env LANG=C /usr/bin/mrtg /etc/mrtg_noerrnic.cfg';done
☆エラーがないか再確認。
$ sudo sh -c 'env LANG=C /usr/bin/mrtg /etc/mrtg.cfg'
☆問題ありません。
$ ls /var/www/mrtg/temp_noerrnic/
localhost_2-day.png localhost_2-year.png localhost_2.old mrtg-r.png
localhost_2-month.png localhost_2.html mrtg-l.png
localhost_2-week.png localhost_2.log mrtg-m.png
☆元の設定ファイルだと、メールと同じエラーが出ます。
$ sudo sh -c 'env LANG=C /usr/bin/mrtg /etc/mrtg.cfg' 2>&1 | grep -i "error" --color
SNMP Error:
Received SNMP response with error code
error status: noSuchName
SNMP Error:
Received SNMP response with error code
error status: noSuchName
2011-07-24 19:58:07: ERROR: Target[localhost_3][_IN_] ' $target->[1]{$mode} ' did not eval into defined data
2011-07-24 19:58:07: ERROR: Target[localhost_3][_OUT_] ' $target->[1]{$mode} ' did not eval into defined data
2011-07-24 19:58:07: ERROR: Target[localhost_4][_IN_] ' $target->[2]{$mode} ' did not eval into defined data
2011-07-24 19:58:07: ERROR: Target[localhost_4][_OUT_] ' $target->[2]{$mode} ' did not eval into defined data
■設定ファイルを作り直すことで解決しそうです。
☆元の作成方法を確認します。
$ sudo head -2 /etc/mrtg.cfg
☆3回実行します。
$ sudo sh -c '/usr/bin/cfgmaker --global "WorkDir: /var/www/mrtg" --output /etc/mrtg.cfg public@localhost'
☆エラーがないか確認します。
$ sudo sh -c 'env LANG=C /usr/bin/mrtg /etc/mrtg.cfg'
☆設定ファイルを確認してみます。やはりNICの認識順序が原因です。
$ sudo grep 'vmnet[18]' /etc/mrtg.cfg | grep \# | cut -c -15
☆エラーがなくなったので、インデックスページを作り直します。
$ sudo indexmaker /etc/mrtg.cfg --column=1 --output=/var/www/mrtg/index.html
■ブラウザから状況を再確認して問題ないことを確認します。
☆「/var/www/mrtg/temp_noerrnic/」以下は残りますが、スケジューリングしていませんし、
エビデンス(証拠/作業根拠/検証結果)として残しておきます。