snmp getbulk_使用SNMP GetBulk请求进行数据检索

IBM i 7.1和7.2版本增强了SNMP功能,包括通过端口161统一响应,配置存储池块大小以解决大小显示问题,以及支持SNMP GetBulk操作提升数据检索效率。本文提供了一个使用SNMPv3 GetBulk请求的编程示例,演示如何从IBM i系统的标准SNMP表中获取大量数据。
部署运行你感兴趣的模型镜像

IBM i 7.1和IBM i 7.2版本最近得到了增强,以为SNMP相关功能提供新功能。 这些新功能为IBM i客户提供了改进的性能和增强的可用性。 在本文中,我将讨论这些新的增强功能,并提供一个使用其中一些功能的编程示例。 本文的主要重点是使用GetBulk操作轻松地从标准SNMP表之一检索数据。

通过端口161发送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)参数来配置更大的块大小。 通过使用适当的块大小,可以避免与错误的存储大小值或系统管理应用程序将磁盘单元标记为无效有关的混乱。

GetBulk操作支持

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代理。

使用GetBulk检索表信息

现在,让我们看一下在IBM i系统上运行的SNMP管理器的C程序示例。 GetBulk操作用于从其他系统检索有关存储池的信息。 此示例假定SNMPv3已在SNMP管理器(SNMP请求的源)和代理(SNMP请求的目标 )上启用并配置。 有关此示例,请参考GetBulk源代码

以下步骤突出显示了此示例程序中的关键操作。

  1. 对于每个代理,程序必须在SNMP管理器程序和代理之间执行SNMPv3代理引擎ID发现。 这可以通过调用snmpDiscover_v3() API来完成。 如果API调用成功,则可以在管理器和代理之间进行SNMPv3操作。 s nmpDiscover_v3() API返回一个控制块,其他SNMPv3 API使用该控制块进行时间同步和身份验证。 返回的控制块特定于代理。 因此,示例程序为每个代理发出一次snmpDiscover_v3() API。
清单1.执行SNMPv3代理引擎ID发现
host = hostList[currentHost].host;                 /* Set the host name. */ 
cb = NULL;                                         /* Set authentication CB to NULL. */ 
rc = snmpDiscover_v3(host, timeout, &cb);          /* Perform SNMP Agent Discovery */ 
if (rc != API_RC_OK) {                             /* Check whether discovery failed. */
    printf("Discovery failed with rc=%d\n", rc);   /* Output reason code. */ 
    goto Cleanup;                                  /* Cleanup and end. */ 
} else;
  1. 该程序必须确定为SNMP代理配置的存储池的数量。 为此,可使用snmpGetnext_v3() API来检查主机资源的存储表,该表也以hrStorageTable的标准名称而hrStorageTable 。 表中的第一个条目hrStorageIndex为程序提供了从表中读取所选信息所需的信息。 循环使用snmpGetnext_v3() API,直到访问了与hrStorageIndex对应的所有表条目为止。 计算这些条目可提供hrStorageTable的行hrStorageTable
清单2.确定表条目的数量
maxReps = 0;                                         /* Initialize maximum repetitions. */
do {                                                 /* Loop until finished. */
    pdu->varbind->val_len = API_MAX_VALUE_SIZE + 1;
    rc = snmpGetnext_v3(pdu, host, timeout, user, &cb); /* Perform GetNext operation. */ 
    maxReps++;                                       /* Incremment maximum repetitions.*/
} while ((memcmp(tblIndexOID, pdu->varbind->oid, strlen(tblIndexOID)) == 0) &&
    (rc == API_RC_OK));                              /* Check whether we are still */
                                                     /* processing index entries. */
  1. 到用于执行准备GetBulk操作时,程序设置必要的p rotocol数据单元(PDU)的结构和变量绑定(类变量)。 该程序从hrStorageTable每一行中获取一些常规系统信息以及特定信息。 对于此示例,它添加了varbinds以获取系统名称( sysName )和网络管理系统(SNMP服务器)正常运行时间( sysUpTime )。 程序生成的GetBulk请求将导致每个varbinds仅被处理一次。 这些组成了GetBulk PDU的非重复部分。
  2. 接下来,程序设置varbinds ,用于从存储池信息hrStorageTable 。 这将增加的varbind存储池(的描述hrStorageDesc )时,大小在分配单元(字节hrStorageAllocationUnits ),在分配单元的存储大小( hrStorageSize ),和存储在分配单元(使用量hrStorageUsed )。 这些varbinds组成了GetBulk PDU的最大重复部分。
  3. 接下来,程序计算对GetBulk请求的响应中期望返回的varbinds的数量。 然后,程序需要分配GetBulk响应所需的所有varbind结构。 对于单个GetBulk请求,IBM i支持最多返回512个varbinds。 IBM i系统还将响应数据包的大小限制为32 KB。 在大型系统上,诸如主机资源的设备表( hrDeviceTable )之类的表可以包含512个以上的条目。 在某些情况下,需要多个GetBulk请求才能检索整个表。
  4. 然后,将使用snmpGetbulk_v3() API发送的单个GetBulk请求检索hrStorageTable所有信息。
清单3.设置varbinds并执行GetBulk
/* Add a varbind to retrieve the system name. This will only be retrieved once
   and is part of the "non-repeaters" varbind section of the GetBulk input PDU.
*/ 

varBNbr = AddVarbind((snmppdu **) &bulkpdu, "1.3.6.1.2.1.1.5"); 

/* Add a varbind to retrieve the network management up-time. This will be 
   retrieved once and is part of the "non-repeaters" varbind section of the GetBulk input PDU. 
*/  

varBNbr = AddVarbind((snmppdu **) &bulkpdu, "1.3.6.1.2.1.1.3");
bulkpdu->non_repeaters = varBNbr;                                /* Set number of non-repeaters. */

/* These statements add the OIDs to the GetBulk PDU which will allow us to
   retrieve the information from the host resources storage table (hrStorageTable) for the
   system's storage pools. These will be retrieved repeatedly and make up the
   "maximum-repetitions" section of the PDU 
*/ 

varBNbr = AddVarbind((snmppdu **) &bulkpdu, "1.3.6.1.2.1.25.2.3.1.3"); /* Storage Description */ 
varBNbr = AddVarbind((snmppdu **) &bulkpdu, "1.3.6.1.2.1.25.2.3.1.4"); /* Allocation units */
varBNbr = AddVarbind((snmppdu **) &bulkpdu, "1.3.6.1.2.1.25.2.3.1.5"); /* Storage size */
varBNbr = AddVarbind((snmppdu **) &bulkpdu, "1.3.6.1.2.1.25.2.3.1.6"); /* Storage used */
bulkpdu->pdu_type = GETBULK_PDU_TYPE;                              /* Initialize the PDU type */
bulkpdu->maximum_repetitions = maxReps;                            /* Set maximum repetitions */
respNbr = ((varBNbr - bulkpdu->non_repeaters) * bulkpdu->maximum_repetitions) + 
    bulkpdu->non_repeaters;                                        /* Calculate the number of varbinds 
                                                                       in the response PDU. */ 
MakeResponsePDUSpace(&pdu, respNbr);                              /* Make a response PDU space with
                                                                       calcuated number of varbinds. */ 
rc = snmpGetbulk_v3(bulkpdu, host, timeout, user, &cb, pdu);      /* Perform the GetBulk. */
  1. 成功调用snmpGetbulk_v3() ,程序将遍历响应PDU中的snmpGetbulk_v3() ,并显示返回的信息。 它还使用返回的信息来计算和显示以字节为单位的存储大小以及以字节为单位的存储空间。
  2. 然后,该程序将清理它分配的所有存储以及分配给用于处理当前代理程序的身份验证控制块。 必须使用snmpFreeAuthCB_v3() API释放身份验证控制块。
  3. 然后,程序处理其列表中的下一个代理。

示例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

以下PTF启用了本文中描述的增强功能:

  • IBM i 7.1-PTF SI55745。
  • IBM i 7.2-PTF SI55537,SI55539,SI55766,SI55787和SI55966。

在IBM i系统上设置SNMPv3

您需要执行以下步骤来在IBM i系统上设置SNMPv3。

  1. 通过在IBM i命令行上输入CHGSNMPA命令,检查系统上是否已启用SNMPv3。 找到“允许SNMPv3支持”( ALWSNMPV3 )参数,并验证它是否设置为*YES
  2. 如果不是,请将其更改为* YES ,还将SNMP引擎标识符( SNMPENGID )更改为*SYSGEN
  3. 通过运行ENDTCPSVR *SNMP命令来结束SNMP服务器。
  4. 通过运行SNMP添加用户( ADDUSRSNMP )命令来配置SNMPv3用户。 用ADDUSRSNMP配置的用户名和密码区分大小写,并且在SNMP代理和管理器之间必须完全匹配。 此外,身份验证和隐私协议也必须完全匹配。
  5. 如果使用的是IBM i SNMPv3管理器API,那么必须将键类型( KEYTYPE )参数值指定为*NONLOCALIZED 。 这是必需的,因为在执行加密和解密操作时,SNMP管理器使用代理的SNMP引擎ID来定位身份验证和隐私密钥。
  6. 添加所有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

您可能感兴趣的与本文相关的镜像

Wan2.2-T2V-A5B

Wan2.2-T2V-A5B

文生视频
Wan2.2

Wan2.2是由通义万相开源高效文本到视频生成模型,是有​50亿参数的轻量级视频生成模型,专为快速内容创作优化。支持480P视频生成,具备优秀的时序连贯性和运动推理能力

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值