出处:鸟哥的 Linux 新手讨论区
http://phorum.....orgmrtg不只可以侦测纪录本机状态,也可以用来侦测远端主机状态喔!!
主题: MRTG 侦测远端服务运作状况, DNS 为例
net-snmp 官网为
http://www.net-...rg.tw 1.下载与安装 net-snmp (旧名为 ucd-snmp)
代码:
$>wgethttp://voxel.dl.sourceforge.net/sourceforge/net-snmp/net-snmp-5.1.2.tar.gz
$>./configure --prefix=/usr/local \
--with-sys-contact="abel@localhost" \
--with-sys-location="Taiwan,Tel:123456767" \
--with-mib-modules="misc/ipfwacc mibII host disman/event-mib ucd_snmp agent_mibs agentx notification target utilities host disman/event-mib smux ucd-snmp/diskio tunnel mibII/mta_sendmail " \
--with-sysconfdir="/usr/local/etc/snmp" --enable-shared --with-default-snmp-version=2
$>make
$>make install
理论上这些过程应不会碰到任何问题的 (我在 RH 7.3/8.0.9.0 都很顺利)若您使用不同的平台,
从官网的 download 去找,几乎都可以找到,若习惯用 RPM 就下 rpm file 即可(我没用过),SunOs
就下 SunOS 版的. (上述 mib 可做 remote 的 firewall log 的侦测,主机讯息, CPU,远端的
sendmail 送件资讯等 ..)
configure 我用的参数,您可在 ./configure --help 时得到说明,仅就最重 --with-mib-modules
做些说明,这个意思即是要把某些 mib 功能直接加入 snmp 中,我个人习惯都是在 complier 时就
加进来,不然若要用 snmpd.conf 中的 dlmod (动态配置) 你多少还是得回来重做 module.
对于本主题而言,最重要的是 host 这个 MIBs 一定要载入,这个 MIB(HOST-RESOURCES-MIB) 的主要
功能在提供主机运行的资讯,以下仅列出常用的项目(
http://www.net-snmp.o...ost.html):
代码:
hrStorageTable 储存�]备的资讯,例如 Disk,Memory 等,空间多少,使用了多少 ...
hrDeviceTable 周边资讯,如 CPU/Disk/Ethernet/CDROM ...
hrFSTable 硬碟资讯,挂载等
hrSWRunTable 就是你在command mode 下 ps 看到的东西,本主?#125;项目之一
hrSWRunPerfTable 每个 Process CPU/Memory 清单,本主?#125;项目之二
hrSWInstalledTable 本机 RPM 安装清单
snmpd.conf 设定,精简版
依本例, snmpd.conf 在 /usr/local/etc/snmp/snmpd.conf , 本档可以启动参数 snmpd -c 指定,
内容如下(是的,只要四行就可以了,多写若不明白用意作用也不大,):
代码:
#定义一像ACL (SECURITY) 的东西,名为 lan, IP 段为 211.72.210/23, Community_string 为 Taiwan
com2sec lan 211.72.210.0/23 Taiwan #语法为 group NAME MODEL SECURITY,MODEL 为采用什么 SNMP 协定版本
group ROGroup v1 lan #语法为 view NAME TYPE SUBTREE [MASK], 这个东西你自己查查,主要通常用 com2sec 等合用
#达到不同的来源,可以存取不同的 OID (MIB) 值,尤其像 ISP ,若客户租户线路,他可以单独提
#供某个 Interface 给他来做 snmp 查询,本主题意不在此;请自休为重
#此功能在许多 Device Vendor 的 SNMP 功能皆相同
view all included .1 #语法为 access NAME CONTEXT MODEL LEVEL PREFX READ WRITE NOTIFY
#NAME: 要对应group 的名称,为本例使用 v1,
#CONTEXT:在 v1 时必为空 (""),
#MODEL 在本例需为 v1 或 any(都可以之意)
#LEVEL 必为 noauth (无�{证要求, v1 无�{证,我们的�]定只�{ IP 及 Community String)
#PREF 我只用过 prefix, 没试过 extra
#R/W/N 字意很明显,我们只要读而以,不要求写及 Trap
access ROGroup "" any noauth prefix all none none
其实 SNMP 是很简单的,一般人通常卡在 snmpd.conf 上,或对 OID/MIB 架构不熟,反把他想的太过复杂
snmpd.conf 中最精华,一般人较难了解处即在 view 及 access
再来,启动就好:
代码:
$>/usr/local/sbin/snmpd -c /usr/local/etc/snmpd.conf
$>cat /var/log/snmpd.log
NET-SNMP version 5.1.2
一切正常 . 是的,若您跟我一样,应不会有问题才是
试运行一下看看:
代码:
$>/usr/local/bin/snmpwalk 211.72.210.251 -c Taiwan -v 1 |more
SNMPv2-MIB::sysDescr.0 = STRING: Linux log.mydomain.net 2.4.18-18mppe #1 Sat Dec 7 11:23:44 CET 2002 i686
SNMPv2-MIB::sysObjectID.0 = OID: NET-SNMP-MIB::netSnmpAgentOIDs.10
DISMAN-EVENT-MIB::sysUpTimeInstance = Timeticks: (267287) 0:44:32.87
SNMPv2-MIB::sysContact.0 = STRING: Root <abel@localhost>
SNMPv2-MIB::sysName.0 = STRING: log.mydomain.net
SNMPv2-MIB::sysLocation.0 = STRING: Taiwan
SNMPv2-MIB::sysORLastChange.0 = Timeticks: (3) 0:00:00.03
SNMPv2-MIB::sysORID.1 = OID: IF-MIB::ifMIB
SNMPv2-MIB::sysORID.2 = OID: SNMPv2-MIB::snmpMIB
SNMPv2-MIB::sysORID.3 = OID: TCP-MIB::tcpMIB
SNMPv2-MIB::sysORID.4 = OID: IP-MIB::ip
SNMPv2-MIB::sysORID.5 = OID: UDP-MIB::udpMIB
SNMPv2-MIB::sysORID.6 = OID: SNMP-VIEW-BASED-ACM-MIB::vacmBasicGroup
SNMPv2-MIB::sysORID.7 = OID: SNMP-FRAMEWORK-MIB::snmpFrameworkMIBCompliance
SNMPv2-MIB::sysORID.8 = OID: SNMP-MPD-MIB::snmpMPDCompliance
SNMPv2-MIB::sysORID.9 = OID: SNMP-USER-BASED-SM-MIB::usmMIBCompliance
SNMPv2-MIB::sysORID.10 = OID: TUNNEL-MIB::tunnelMIB
SNMPv2-MIB::sysORDescr.1 = STRING: The MIB module to describe generic objects for network interface sub-layers
SNMPv2-MIB::sysORDescr.2 = STRING: The MIB module for SNMPv2 entities
SNMPv2-MIB::sysORDescr.3 = STRING: The MIB module for managing TCP implementations
....以下略
跑起来也正常,请记得,Community_string 本例不为 public, 请知变通
由于我们运行 v1, 所以需以 -v 1 来 walk through .
抓 Process 资料方法
我们先看例子,再来看推演:
代码:
#取得整个 OID Tree (-c Community_String -v snmp_version)
$>/usr/local/bin/snmpwalk 211.72.210.251 -c TwNic -v 1 >log.snmp
#找出 named PID,得知 named PID 为 10422 (即 Index 值)
$>cat log.snmp | grep named
HOST-RESOURCES-MIB::hrSWRunName.10422 = STRING: "named"
#找出 10422 相关项目
$>cat log.snmp | grep 10422
hrSWRunIndex.10422 = INTEGER: 10422 #Index 可取得所有 PID 值
hrSWRunName.10422 = STRING: "named" #RunName 为此PID 为 named
hrSWRunID.10422 = OID: PNNI-MIB::zeroDotZero #没有作用,并为 PNNI-MIB 项目
hrSWRunPath.10422 = STRING: "named" #带路径的全名,本例无,您看看自身例子
hrSWRunParameters.10422 = "" #启动参数,本例无,例如 -c -g 等参数
hrSWRunType.10422 = INTEGER: application(4) # 4 表应用�{式(application)
hrSWRunStatus.10422 = INTEGER: runnable(2) # 2 表休息状态(Sleep)
hrSWRunPerfCPU.10422 = INTEGER: 12063 # CPU 使用时间,单位为百分之一秒
hrSWRunPerfMem.10422 = INTEGER: 2276 KBytes # 占用记忆体,单位为 KB
个人认为,程度好一点的人看到这里大概知道怎做下去了,这个功能无法以 mrtg 方式直接
指定 OID 值来做,因为 Index (PID) 为变,所以我们得透过程式来产生 mrtg 资料,假设程式名为
remote_process, 用法为: ./remote_process host community_string process_name
代码:
#!/bin/sh
host=$1
community_string=$2
process_name=$3
# 本段在取该主机的描述事项,并转存成 html 档,形成之格式如
# sysDescr: Linux ttn239.tnwic.net.tw 2.4.20-8smp #1 SMP Thu Mar 13 17:45:54 EST 2003 i686
# sysObjectID: OID: enterprises.8072.3.2.10
# sysUpTime: Timeticks: (183103803) 21 days, 4:37:18.03
# sysName: ttn239.tnwic.net.tw
# sysLocation: TTN
info="system.sysDescr.0 system.sysObjectID.0 system.sysUpTime.0 system.sysName.0 system.sysLocation.0"
rm -f /www/htdocs/snmp.enum.org.tw/mrtg/${host}_${process_name}.html
for mib in $info
do
name=`echo $mib | cut -f 2 -d'.'`
str=`snmpget -v 1 $host -c $community_string $mib | sed -e 's/.*=//g' `
echo "$name: $str<br>" >>/www/htdocs/snmp.enum.org.tw/mrtg/${host}_${process_name}.html
done
CPU_SUM=0
MEM_SUM=0
#抓取该 Process Name 的所有 PID (即 Index,此时才知 Index 为何)
ALL_PID=`snmpwalk -v 1 $host -c $community_string hrSWRunName | grep $process_name | sed -e 's/.*hrSWRunName\.\(.*\) = "\(.*\)"/\1/g'`
if [ ${#ALL_PID} -lt 1 ];
then echo "$host 的 $process_name 巳经�}亡了,请尽速处理" | mail
abel@mydomain.net #for loop 在于考�{像 http 为有数个 process 等状况(fork or threads)
for PID in $ALL_PID
do
#取得 CPU 使用时间,单位为 1/100 秒,及记忆体用量,单位为kb
RUN_CPU=`snmpwalk $host -c $community_string hrSWRunPerfCPU.$PID|sed -e 's/.*= \(.*\)/\1/g'`
RUN_MEM=`snmpwalk $host -c $community_string hrSWRunPerfMem.$PID|sed -e 's/.*= \(.*\) K[Bb].*/\1/g'`
#�[总计算
CPU_SUM=`expr $CPU_SUM + $RUN_CPU`
MEM_SUM=`expr $MEM_SUM + $RUN_MEM`
done
#输出结果
echo $CPU_SUM
echo $MEM_SUM
接下来设定 mrtg.cfg (这个 网路上 很多文件可以查,就不解释了),
代码:
#mrtg.cfg
WorkDir: /www/htdocs/snmp.enum.org.tw/mrtg
Refresh: 300
Interval: 5
Language: Big5
#perminute 表示要5分钟中的每分钟平均,我不要每秒平均,如此数值为过小
Options[_]: growright, noinfo,perminute
#-------------------------------------------------
#我的�{式,外接三个参数, ./remote_process hostname Community_String Process_name
Target[ns11-seednet-named]:`/root/study/remote_process ns11.abc.com.tw Taiwan named`
#时间最大为300秒x100
MaxBytes1[ns11-seednet-named]:30000
MaxBytes2[ns11-seednet-named]: 256000
Title[ns11-seednet-named]: ENUM/EPP DNS Server named daemon status
Legend1[ns11-seednet-named]: CPU 时间
Legend2[ns11-seednet-named]: MEM 使用
LegendI[ns11-seednet-named]: CPU 时间(秒/分)
LegendO[ns11-seednet-named]: MEM 使用(KB)
YLegend[ns11-seednet-named]: CPU/MEM usage
#这里我用了一个 html 的 object 语法,以显示其他系统资讯,如上列"本段在取该主机的描述...内容"
PageTop[ns11-seednet-named]: <h1> NS11 DNS Server status </h1> <object data="./ns11_named.html" width=500 height=150 style="border-style:outset; bgcolor:#336699;"> </object>
#数值检查,CPU 时间占用每分钟超过10秒要发信警告,MEMORY 占用超过每分 1000KB �]要警告,
# MinO 为小于意思 (亦即 Out 项值小于某数字时)
ThreshDir: /www/htdocs/snmp.enum.org.tw/mrtg/alert
ThreshMaxI[_]: 1000
ThreshMinI[_]: 1
ThreshMaxO[_]: 1000
# IN 项的外部�{式
# OUT 项的外部�{式
ThreshProgI[ns11-seednet-named]:/www/htdocs/snmp.enum.org.tw/mrtg/alert/mail.sh
ThreshProgO[ns11-seednet-named]:/www/htdocs/snmp.enum.org.tw/mrtg/alert/mail.sh
--------------------------------------------------------
mail.sh 内容,mrtg 会呼叫这个程式来做 Alert, 参数为 target_name 警告值 现在值:
代码:
#!/bin/sh
target=$1
alert_val=$2
curr_val=$3
echo -e "Dear Sir:\n MRTG 发�{监测的系统中 $target 的 $curr_val 超过或小于 $alert_val 您所�]定的警告值,请您了解情况, \nRef:
http://xxx.domain.net....ndex.html\n System Admin\n" | /usr/sbin/sendmail -oi abel@localhost
如此即可完成啰... mrtg 不明处请自看
mrtg.org... , snmpd 要多做才会熟,其他的就靠平时累积实力啰