net snmp的源码包可以到 net-snmp官网上去下载。也可以到sourcefroce(http://downloads.sourceforge.net)上去下载。
configure
文件,现在就使用这个文件来自动配置。当然,自动配置也可以定制一些内容,比如安装路径等。./configure参数 | 含义 |
---|---|
--prefix=/usr/local/net-snmp | net snmp的安装路径 |
--enable-mfd-rewrites | 允许新的mfd重写可用的mid模块 |
--with-default-snmp-version="3" | 默认的snmp版本 |
--with-sys-contact="name,E_mail:maileaddress " | 该设备的联系人 |
--with-sys-location="China" | 该设备的位置 |
--with-logfile="/var/log/snmpd.log" | 日志文件路径 |
--with-persistent-directory="/var/net-snmp" | 不变数据存储目录 |
我们这里只配置安装路径,其它的都使用默认设置。
./configure --prefix=/usr/local/net-snmp
接下来会让你选择一些配置。
************************************Configuration Section ************************************
You are about to be prompted with aseries of questions. Answerthemcarefully, as they determine how the SNMP agent and relatedapplicationsare to function.
After the configure script finishes, youcan browse the newlycreatedconfig.h file for further - less important - parameters tomodify. Be careful if you re-run configure though,since config.h willbeoverwritten.
-Press return to continue-
//选择snmp协议版本,默认第3版
Defaultversion of SNMP to use (3):3
//系统联系信息
SystemContact Information (root@localdomain):ZXSH
//系统位置
SystemLocation (Unknown): China
//日志位置
Locationto write logfile (/var/log/snmpd.log): /var/log/snmpd.log
//持久性存储位置
Locationto write persistent information (/var/net-snmp): /var/net-snmp
执行完配置之后会出现如下所示的信息。有可能出现的和下面的不一样,这取决于配置,但只要出现和这个相似的部分,说明配置是成功的。没有必要仔细看这个配置摘要。
Net-SNMP configuration summary:
---------------------------------------------------------
SNMP Versions Supported: 1 2c 3
Building for: linux
Net-SNMP Version: 5.7.3
Network transport support: Callback Unix Alias TCP UDP IPv4Base SocketBase TCPBase UDPIPv4Base UDPBase
SNMPv3 Security Modules: usm
Agent MIB code: default_modules => snmpv3mibs mibII ucd_snmp notification notification-log-mib target agent_mibs agentx disman/event disman/schedule utilities host
MYSQL Trap Logging: unavailable
Embedded Perl support: disabled
SNMP Perl modules: building -- not embeddable
SNMP Python modules: disabled
Crypto support from: crypto
Authentication support: MD5 SHA1
Encryption support: DES AES
Local DNSSEC validation: disabled
---------------------------------------------------------
o@o-pc:~/work/_snmp/net-snmp-5.7.3$ make
...
/usr/bin/ld: cannot find -lperl
collect2: error: ld returned 1 exit status
make[1]: *** [libnetsnmpagent.la] 错误 1
在make编译的时候遇到了一个错误,提示找不到perl
这个库。原因是因为我的电脑上没有安装perl开发环境,现在装一个。
o@o-pc:~/work/_snmp/net-snmp-5.7.3$ sudo apt-get install libperl-dev
也许还会碰到缺少libtool
,openssl
,zlib
库的情况,请直接安装。
一般遇到这种缺少了什么库的问题,都是通过安装libXXX-dev
或者安装XXX-dev
来解决。但也不绝对,有的时候是因为相关的库不是安装在系统的默认路径,也没用加入到环境变量中。
编译成功后就可以安装了,前面设置了安装路径是/usr/local/net-snmp
,因为这个路径是的所有者(own)和所在组(group)都是root,所有需要sudo来执行
o@o-pc:~/work/_snmp/net-snmp-5.7.3$ sudo make install
安装完成后进入目录/usr/local/net-snmp/sbin
即可看到可执行文件snmpd,执行输出一下版本信息。因为我们这里还没有把它的路径添加到环境变量,所有还不能在任意位置直接输入snmpd
来运行。
o@o-pc:/usr/local/net-snmp/sbin$ ./snmpd -v
NET-SNMP version: 5.7.3
Web: http://www.net-snmp.org/
Email: [email protected]
snmpd.conf是snmp服务的配置文件。
生成snmpd.conf
先将EXAMPLE.conf文件复制到/usr/local/net-snmp/share/snmp,并重命名为snmpd.conf
o@o-pc:~/work/_snmp/net-snmp-5.7.3$ sudo cp EXAMPLE.conf /usr/local/net-snmp/share/snmp/snmpd.conf
下面的配置中,使用到的com2sec/group/view/access的说明在EXAMPLE.conf文件的注释中可以看到(大致是65行)。
首先定义一个首共同体名称(community),这里是 public。以及可以访问这个 public 的用户名(sec name),这里是 notConfigUser 。public 相当于用户 notConfigUser 的密码。
在snmpd.conf文件中添加下面的语句。(第一句是注释)
# sec.name source community
com2sec notConfigUser default public
然后定义一个组名(groupName)这里是 notConfigGroup,以及组的安全级别,并把 notConfigGroup 这个用户加到这个组中。
在snmpd.conf文件中添加下面的语句。(第一句是注释)
# groupName securityModel securityName
group notConfigGroup v1 notConfigUser
group notConfigGroup v2c notConfigUser
接着定义一个可操作的视图(view)名, 这里是 all,范围是 .1。
在snmpd.conf文件中添加下面的语句。(第一句是注释)
# name incl/excl subtree mask(optional)
view all included .1
最后定义 notConfigUser 这个组在 all 这个视图范围内可做的操作,这时定义了 notConfigUser 组的成员可对 .1 这个视图做只读操作。
# group context sec.model sec.level prefix read write notif
access notConfigGroup "" any noauth exact all none none
进入到
执行它的时候可指定配置文件(如果不带,默认就是这个)/usr/local/net-snmp/sbin文件夹中执行可执行文件,
o@o-pc:/usr/local/net-snmp/sbin$ ./snmpd –c /usr/local/net-snmp/share/snmp/snmpd.conf
或直接
o@o-pc:/usr/local/net-snmp/sbin$ ./snmpd
执行完后执行 ps -A 查看程序是否运行成功
如果执行失败,程序直接退出了,可以使用-f -Le
参数来查看错误信息。
其中-f
是do not fork from the shell不从shell派生子进程-L
是 toggle options controlling where to log to切换到相关的日志控制,它后面需要跟参数。e
:log to standard error 日志到标准错误。
这些相关的参数可以通过./snmpd -h
获取。
我这边出现了这样的错误。
o@o-pc:/usr/local/net-snmp/sbin$ ./snmpd -f -Le
Turning on AgentX master support.
Error opening specified endpoint "udp:127.0.0.1:161"
Server Exiting with code 1
这个错误的原因很简单,那就是权限问题。使用sudo
来执行就没有问题了。linux上很多问题都是权限的问题。
o@o-pc:/usr/local/net-snmp/sbin$ sudo ./snmpd -f -Le
[sudo] password for o:
NET-SNMP version 5.7.3
这里没有加配置文件路径,是因为使用的默认配置文件/usr/local/net-snmp/share/snmp/snmpd.conf
,如果还有别的错误,那么就修改配置文件,只保留上面说到的四点,其余的都删除掉来试试。
其实配置文件还可以这样,这也是从网上找的。
#设置区域
syslocation "SHANGHAI P.R.China"
#设置系统联系人
syscontact [email protected]
#设置一个只读账户 read-only community
#下面的 whatever 相当于密码,后面还可以跟一个IP地址,表示监控点主机
rocommunity whatever
#设置一个读写账户 read-write community
rwcommunity whoareyou
执行成功后我们可以进入到bin
目录,然后执行snmpwalk
,snmpget
等命令来查看一下。
o@o-pc:/usr/local/net-snmp/bin$ ./snmpget -v 1 -c public localhost sysUpTime.0
o@o-pc:/usr/local/net-snmp/bin$ ./snmpwalk -v 1 localhost -c public system
o@o-pc:/usr/local/net-snmp/bin$ ./snmpwalk -v 2c -c whatever -m ALL localhost .1.3
o@o-pc:/usr/local/net-snmp/bin$ ./snmpwalk -v 1 172.0.0.1 -c whatever system
Timeout: No Response from 172.0.0.1
o@o-pc:/usr/local/net-snmp/bin$ ./snmpwalk -v 1 localhost -c whatever system
SNMPv2-MIB::sysDescr.0 = STRING: Linux o-pc 3.16.0-30-generic #40~14.04.1-Ubuntu SMP Thu Jan 15 17:43:14 UTC 2015 x86_64
SNMPv2-MIB::sysObjectID.0 = OID: NET-SNMP-MIB::netSnmpAgentOIDs.10
DISMAN-EVENT-MIB::sysUpTimeInstance = Timeticks: (21134) 0:03:31.34
SNMPv2-MIB::sysContact.0 = STRING: [email protected]
SNMPv2-MIB::sysName.0 = STRING: o-pc
SNMPv2-MIB::sysLocation.0 = STRING: \"SHANGHAI P.R.China\"
SNMPv2-MIB::sysORLastChange.0 = Timeticks: (0) 0:00:00.00
SNMPv2-MIB::sysORID.1 = OID: SNMP-MPD-MIB::snmpMPDCompliance
SNMPv2-MIB::sysORID.2 = OID: SNMP-USER-BASED-SM-MIB::usmMIBCompliance
SNMPv2-MIB::sysORID.3 = OID: SNMP-FRAMEWORK-MIB::snmpFrameworkMIBCompliance
SNMPv2-MIB::sysORID.4 = OID: SNMPv2-MIB::snmpMIB
SNMPv2-MIB::sysORID.5 = OID: SNMP-VIEW-BASED-ACM-MIB::vacmBasicGroup
SNMPv2-MIB::sysORID.6 = OID: TCP-MIB::tcpMIB
SNMPv2-MIB::sysORID.7 = OID: IP-MIB::ip
SNMPv2-MIB::sysORID.8 = OID: UDP-MIB::udpMIB
SNMPv2-MIB::sysORID.9 = OID: SNMP-NOTIFICATION-MIB::snmpNotifyFullCompliance
SNMPv2-MIB::sysORID.10 = OID: NOTIFICATION-LOG-MIB::notificationLogMIB
SNMPv2-MIB::sysORDescr.1 = STRING: The MIB for Message Processing and Dispatching.
SNMPv2-MIB::sysORDescr.2 = STRING: The management information definitions for the SNMP User-based Security Model.
SNMPv2-MIB::sysORDescr.3 = STRING: The SNMP Management Architecture MIB.
SNMPv2-MIB::sysORDescr.4 = STRING: The MIB module for SNMPv2 entities
SNMPv2-MIB::sysORDescr.5 = STRING: View-based Access Control Model for SNMP.
SNMPv2-MIB::sysORDescr.6 = STRING: The MIB module for managing TCP implementations
SNMPv2-MIB::sysORDescr.7 = STRING: The MIB module for managing IP and ICMP implementations
SNMPv2-MIB::sysORDescr.8 = STRING: The MIB module for managing UDP implementations
SNMPv2-MIB::sysORDescr.9 = STRING: The MIB modules for managing SNMP Notification, plus filtering.
SNMPv2-MIB::sysORDescr.10 = STRING: The MIB module for logging SNMP Notifications.
SNMPv2-MIB::sysORUpTime.1 = Timeticks: (0) 0:00:00.00
SNMPv2-MIB::sysORUpTime.2 = Timeticks: (0) 0:00:00.00
SNMPv2-MIB::sysORUpTime.3 = Timeticks: (0) 0:00:00.00
SNMPv2-MIB::sysORUpTime.4 = Timeticks: (0) 0:00:00.00
SNMPv2-MIB::sysORUpTime.5 = Timeticks: (0) 0:00:00.00
SNMPv2-MIB::sysORUpTime.6 = Timeticks: (0) 0:00:00.00
SNMPv2-MIB::sysORUpTime.7 = Timeticks: (0) 0:00:00.00
SNMPv2-MIB::sysORUpTime.8 = Timeticks: (0) 0:00:00.00
SNMPv2-MIB::sysORUpTime.9 = Timeticks: (0) 0:00:00.00
SNMPv2-MIB::sysORUpTime.10 = Timeticks: (0) 0:00:00.00
修改snmpd.conf后,需要重启该服务,步骤如下:
//查找进程snmpd的pid
o@o-pc:/usr/local/net-snmp/bin$ ps -A
//杀掉该进程
o@o-pc:/usr/local/net-snmp/bin$ killall -9 snmpd
//启动服务
o@o-pc:/usr/local/net-snmp/bin$ ./snmpd –c /usr/local/net-snmp/share/snmp/snmpd.conf
与上面编译安装不同的只有配置选项
可以使用./configure --help
查看一下配置选项有那些。这里不贴了,直接给出。
选项 | 说明 |
---|---|
–host=arm-linux | 运行平台 |
–target=arm-linux | 目标平台 |
–build=i686-linux | 编译平台 |
–with-cc=arm-linux-gcc | 交叉编译工具 |
–with-ar=arm-linux-ar | 使用的打包工具 |
–prefix=/usr/local/net-snmp | 安装目录 |
–disable-shared | 不编译共享库 |
–disable-scripts | 不要安装mib2c等脚本 |
–with-endianness=little | 指定小端模式 |
-enable-mini-agent | 最小化构建agent |
--disable-deprecated | 不编译弃用的功能 |
--without-logfile | 指定snmpd不输出日志文件(可以使用--with-logfile指定默认日志文件位置) |
--disable-minimalist | 删除所有非基本的代码功能 |
–enable-debugging | 打开调试信息 |
--disable-testing-code | 不使用测试代码(某些代码不被使用) |
–with-openssl=/opt/hardhat | openssl库路径(用于支持加密等) |
–disable-ipv6 | 不使用IPv6 |
–disable-manuals | 不安装manpage说明页 |
–disable-ucd-snmp-compatibility | 不需要兼容ucd-snmp |
–disable-snmptrapd-subagent | 不用支持snmptrapd的子代理 |
–disable-embedded-perl | 在SNMP代理和snmptrapd禁用嵌入式Perl。默认启用 |
–disable-applications | 是否关闭snmpget等功能,根据自己的需要选择 |
--with-default-snmp-version="3" | 指定默认协议版本 |
--enable-as-needed | 仅链接需要库,不链接不必要的库(如果只使用其他方法行不通,链接libperl针对应用而非Net-SNMP库。) |
下面是我使用的配置
./configure --host=arm-linux --target=arm-linux --build=i686-linux --with-cc=arm-linux-gnueabi-gcc-4.9 --with-ar=arm-linux-gnueabi-gcc-ar-4.9 --prefix=/usr/local/net-snmp --disable-shared --disable-scripts --with-endianness=little -enable-mini-agent --disable-ipv6 --disable-manuals --disable-ucd-snmp-compatibility --enable-as-needed
配置的时候你可以指定一个空目录来作为安装目录,比如/home/o/123
。那么make
成功后可以make install
来安装。移植到arm
开发板上的时候可以直接将这个目录打包拷贝过去。
Net-SNMP configuration summary:
---------------------------------------------------------
SNMP Versions Supported: 1 2c 3
Building for: linux
Net-SNMP Version: 5.7.3
Network transport support: Callback Unix Alias TCP UDP IPv4Base SocketBase TCPBase UDPIPv4Base UDPBase
SNMPv3 Security Modules: usm
Agent MIB code: default_modules => snmpv3mibs mibII/snmp_mib mibII/system_mib mibII/sysORTable mibII/vacm_vars mibII/vacm_conf
MYSQL Trap Logging: unavailable
Embedded Perl support: disabled
SNMP Perl modules: building -- not embeddable
SNMP Python modules: disabled
Crypto support from: internal
Authentication support: MD5 SHA1
Encryption support: DES AES
Local DNSSEC validation: disabled
---------------------------------------------------------
配置成功后使用make
命令编译一下。
编译成功后将输出下面两行。
chmod a+x net-snmp-config
touch net-snmp-config-x
编译完成后可以进入agent文件夹,看是否输出了snmpd
文件。
o@o-pc:~/snmp/net-snmp-5.7.3/agent$ ll snmpd
-rwxrwxr-x 1 o o 3029820 9月 16 20:31 snmpd*
o@o-pc:~/snmp/net-snmp-5.7.3/agent$ file snmpd
snmpd: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=735ab05f48664e1af99c639e6519893be9413d2b, not stripped
压缩可执行文件
编译完成之后是可以直接拿过去用的,但是也可以先压缩一下来节约空间。使用arm-linux-gnueabi-strip
程序来压缩
o@o-pc:~/snmp/net-snmp-5.7.3/agent$ arm-linux-gnueabi-strip snmpd
o@o-pc:~/snmp/net-snmp-5.7.3/agent$ ll snmpd
-rwxrwxr-x 1 o o 703836 9月 16 20:51 snmpd*
可以看出,压缩之后可执行文件的大小由接近3MB
降到了不到700KB
。
编译成功后就可以安装到目标平台了。首先拷贝出agent
目录下的snmpd
文件到目标机器。
然后再在目标机器上创建snmpd.conf
配置文件,具体怎么配置,可以参考http://www.cnblogs.com/oloroso/p/4595123.html的第五部分。
然后就可以启动试试了。
sudo ./snmpd -c snmpd.conf –f –Le –d
编译的时候出现找不到perl库的问题,这个问题其实也好解决,编译一个就是嘛。但是呢,没有这个必要,麻烦。
/usr/lib/gcc-cross/arm-linux-gnueabi/4.9/../../../../arm-linux-gnueabi/bin/ld: cannot find -lperl
collect2: error: ld returned 1 exit status
Makefile:484: recipe for target 'libnetsnmpagent.la' failed
make[1]: *** [libnetsnmpagent.la] Error 1
make[1]: Leaving directory '/home/o/snmp/net-snmp-5.7.3/agent'
Makefile:656: recipe for target 'subdirs' failed
make: *** [subdirs] Error 1
Copy
解决办法
其实很简单,将之前configure
配置的时候加上一个参数--disable-embedded-perl
,然后再次make
就可以了。
首先我们需要找一个oid是否被系统暂用,比如.1.3.6.1.4.1.2021.5000
# snmpwalk -v 2c -c public www.ttlsa.com .1.3.6.1.4.1.2021.5000
UCD-SNMP-MIB::ucdavis.5000 = No Such Object available on this agent at this OID
如上说明不存在
增加自定SNMP OID
编写脚本
# cat /root/scripts/check_nginx.sh
#!/bin/bash
nginxNum=`/bin/ps aux | /bin/grep nginx | wc -l`
echo $nginxNum
修改配置
# vim /etc/snmp/snmpd.conf
extend .1.3.6.1.4.1.2021.5000 check_nginx /root/scripts/check_nginx.sh // 增加这一行
其中check_nginx是命令的名称,后面是命令及参数。
重新执行SNMP可执行文件。./snmpd -c ../share/snmp/snmpd.conf
snmpwalk -v 1 -c public 173.219.255.122 .1.3.6.1.4.1.2021.5000
# chkconfig --add nginx
chkconfig: command not found
chkconfig
已经被 sysv-rc-conf
所替代,chkconfig
命令如下:# chkconfig --add nginx
# chkconfig nginx on
# apt-get update
# apt-get install sysv-rc-conf
# sysv-rc-conf nginx on
参考博客:http://www.cnblogs.com/oloroso/p/4595123.html
https://blog.csdn.net/jacky0922/article/details/6952152#commentBox
https://www.jianshu.com/p/a72534e64685