snmp getbulk

    技术2022-07-21  76

    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源代码 。

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

    对于每个代理,程序必须在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; 该程序必须确定为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. */ 到用于执行准备GetBulk操作时,程序设置必要的p rotocol数据单元(PDU)的结构和变量绑定(类变量)。 该程序从hrStorageTable每一行中获取一些常规系统信息以及特定信息。 对于此示例,它添加了varbinds以获取系统名称( sysName )和网络管理系统(SNMP服务器)正常运行时间( sysUpTime )。 程序生成的GetBulk请求将导致每个varbinds仅被处理一次。 这些组成了GetBulk PDU的非重复部分。 接下来,程序设置varbinds ,用于从存储池信息hrStorageTable 。 这将增加的varbind存储池(的描述hrStorageDesc )时,大小在分配单元(字节hrStorageAllocationUnits ),在分配单元的存储大小( hrStorageSize ),和存储在分配单元(使用量hrStorageUsed )。 这些varbinds组成了GetBulk PDU的最大重复部分。 接下来,程序计算对GetBulk请求的响应中期望返回的varbinds的数量。 然后,程序需要分配GetBulk响应所需的所有varbind结构。 对于单个GetBulk请求,IBM i支持最多返回512个varbinds。 IBM i系统还将响应数据包的大小限制为32 KB。 在大型系统上,诸如主机资源的设备表( hrDeviceTable )之类的表可以包含512个以上的条目。 在某些情况下,需要多个GetBulk请求才能检索整个表。 然后,将使用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. */ 成功调用snmpGetbulk_v3() ,程序将遍历响应PDU中的snmpGetbulk_v3() ,并显示返回的信息。 它还使用返回的信息来计算和显示以字节为单位的存储大小以及以字节为单位的存储空间。 然后,该程序将清理它分配的所有存储以及分配给用于处理当前代理程序的身份验证控制块。 必须使用snmpFreeAuthCB_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

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

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

    在IBM i系统上设置SNMPv3

    您需要执行以下步骤来在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

    Processed: 0.010, SQL: 9