IBM i 7.1和IBM i 7.2版本最近得到了增强,以为SNMP相关功能提供新功能。 这些新功能为IBM i客户提供了改进的性能和增强的可用性。 在本文中,我将讨论这些新的增强功能,并提供一个使用其中一些功能的编程示例。 本文的主要重点是使用GetBulk操作轻松地从标准SNMP表之一检索数据。
过去,IBM i通过UDP端口161接收SNMP请求,然后通过随机临时端口发送响应。 此行为使管理员难以配置防火墙,并且仍然允许SNMP通信在IBM i SNMP代理与基于SNMP的远程系统或网络管理应用程序之间流动。 SNMP代理已更改,因此现在将通过UDP端口161发送对SNMP请求的响应。现在还将通过端口161发送源自IBM i系统的SNMP陷阱消息。此更改不会影响IBM i陷阱管理器。 ,它将继续通过UDP端口162接收陷阱消息。IBM i陷阱管理器转发的陷阱也将通过端口161发送。此更改也不会影响将继续通过以下方式发送请求的本机IBM i SNMP管理器API。随机的临时端口。
随着存储池和单个磁盘单元的存储大小增加,原始SNMP设计的限制已达到或在某些情况下已超出。 例如,SNMP在IBM i系统上为8 TB磁盘单元返回的大小在某些系统管理应用程序中可能显示为负数,或者可能被标记为无效。 SNMP的最新增强功能允许配置块大小,以用于返回存储池和磁盘单元的存储大小信息。 要注意的一件事是,对磁盘单元使用这种支持可能会导致IBM i不符合RFC 1514标准,该标准将磁盘单元块的大小定义为1024字节。 可以使用“ Change SNMP Attributes (CHGSNMPA)命令上的新块大小(BLKSIZE)参数来配置更大的块大小。 通过使用适当的块大小,可以避免与错误的存储大小值或系统管理应用程序将磁盘单元标记为无效有关的混乱。
SNMP GetBulk操作是在SNMP版本2(SNMPv2)中引入的,它提供了一种方法,可通过单个SNMP请求轻松获得相对大量的数据。 尽管IBM i不支持SNMPv2,但它确实支持SNMP版本3,该版本为SNMP消息提供了改进的安全性和保密性。 现在,IBM i 7.1和IBM i 7.2代理完全支持SNMPv3的GetBulk请求。 另外,在IBM i 7.2中,有一个新的SNMP管理器API snmpGetbulk_v3 ,可用于将GetBulk请求发送到SNMPv3代理。
现在,让我们看一下在IBM i系统上运行的SNMP管理器的C程序示例。 GetBulk操作用于从其他系统检索有关存储池的信息。 此示例假定SNMPv3已在SNMP管理器(SNMP请求的源)和代理(SNMP请求的目标 )上启用并配置。 有关此示例,请参考GetBulk源代码 。
以下步骤突出显示了此示例程序中的关键操作。
对于每个代理,程序必须在SNMP管理器程序和代理之间执行SNMPv3代理引擎ID发现。 这可以通过调用snmpDiscover_v3() API来完成。 如果API调用成功,则可以在管理器和代理之间进行SNMPv3操作。 s nmpDiscover_v3() API返回一个控制块,其他SNMPv3 API使用该控制块进行时间同步和身份验证。 返回的控制块特定于代理。 因此,示例程序为每个代理发出一次snmpDiscover_v3() API。示例1显示了程序的输出。
示例1.来自GetBulk的存储池信息
System Name: LOCALHOST Up-time (in seconds): 62939 Pool Block Size Size Size Size Used Description in Bytes in Blocks in Bytes in Bytes System ASP 4096 39141480 160323502080 46772875264 RAM 4096 145441 595726336 576901120 RAM 4096 1135368 4650467328 3070193664 RAM 4096 15728 64421888 12288 RAM 4096 276327 1131835392 144236544 System Name: BIGSYSTEM Up-time (in seconds): 62900 Pool Block Size Size Size Size Used Description in Bytes in Blocks in Bytes in Bytes System ASP 8192 1228421942 10063232548864 6161258889216 User ASP 8192 9321270 76359843840 5750784 User ASP 8192 335544320 2748779069440 351518720 Independent ASP 8192 120193024 984621252608 8866537472 Independent ASP 8192 51511296 421980536832 124952576 RAM 8192 6442790 52779335680 34723086336 RAM 8192 96346898 789273788416 380127264768 RAM 8192 25787520 211251363840 880140288 RAM 8192 1298759 10639433728 119259136关于输出要注意的一件事是,每个系统都有针对hrStorageAllocationUnits.检索的不同单位或块大小hrStorageAllocationUnits. 在运行GetBulk操作之前,在系统BIGSYSTEM上运行了CHGSNMPA BLKSIZE(8192 *DFT)命令。 这导致为hrStorageAllocationUnits返回8192,而不是让系统确定块大小。 在运行CHGSNMPA命令之前,由于CHGSNMPA上的系统辅助存储池(ASP)很大,因此示例程序的输出为hrStorageSize生成了无效的结果。 即使块大小为4096,块总数也可能无法容纳4字节整数。 更改块大小允许hrStorageSize检索有效信息,然后程序可以使用该信息来计算实际存储大小(以字节为单位)。 最后要注意的一点是,为了使更改块大小生效,必须终止并重新启动SNMP服务器。 示例2显示了更改存储池块大小之前的输出。 块和字节的大小均错误地显示为负数:
例子2.部分GetBulk结果块大小太小
System Name: BIGSYSTEM Up-time (in seconds): 11 Pool Block Size Size Size Size Used Description in Bytes in Blocks in Bytes in Bytes System ASP 4096 -1838123412 -7528953495552 6167716663296以下PTF启用了本文中描述的增强功能:
IBM i 7.1-PTF SI55745。 IBM i 7.2-PTF SI55537,SI55539,SI55766,SI55787和SI55966。您需要执行以下步骤来在IBM i系统上设置SNMPv3。
通过在IBM i命令行上输入CHGSNMPA命令,检查系统上是否已启用SNMPv3。 找到“允许SNMPv3支持”( ALWSNMPV3 )参数,并验证它是否设置为*YES 。 如果不是,请将其更改为* YES ,还将SNMP引擎标识符( SNMPENGID )更改为*SYSGEN 。 通过运行ENDTCPSVR *SNMP命令来结束SNMP服务器。 通过运行SNMP添加用户( ADDUSRSNMP )命令来配置SNMPv3用户。 用ADDUSRSNMP配置的用户名和密码区分大小写,并且在SNMP代理和管理器之间必须完全匹配。 此外,身份验证和隐私协议也必须完全匹配。 如果使用的是IBM i SNMPv3管理器API,那么必须将键类型( KEYTYPE )参数值指定为*NONLOCALIZED 。 这是必需的,因为在执行加密和解密操作时,SNMP管理器使用代理的SNMP引擎ID来定位身份验证和隐私密钥。 添加所有SNMPv3用户后,您可以通过运行STRTCPSVR *SNMP命令来启动SNMP服务器。由于SNMPv3管理器实现方面的差异,可能有必要添加一个环境变量来更改与SNMPv3管理器的初始通信期间IBM i代理执行验证检查的方式。 如果SNMPv3管理器应用程序在尝试与IBM i代理建立初始SNMPv3通信时正在超时或报告时间同步错误,请使用以下命令添加此环境变量:
ADDENVVAR ENVVAR(QIBM_SNMPV3_AUTH) VALUE('1') LEVEL(*SYS)
运行此命令后,必须先终止SNMP服务器,然后重新启动。 另外,可能有必要结束然后重新启动SNMP管理器应用程序。
IBM i系统现在提供了新功能,包括通过通过UDP端口161发送响应来更轻松地配置防火墙,通过配置存储池和磁盘单元块大小来消除SNMP管理器报告的错误以及通过使用SNMP管理器来提高性能的能力。的GetBulk请求。
翻译自: https://www.ibm.com/developerworks/ibmi/library/i-snmp-getbulk-data-retrieval/index.html