1

整数オーバーフローの問題についていくつかの snmp コードをデバッグしています。基本的に、整数を使用してディスク/RAID 容量を KB 単位で格納します。ただし、2TB を超えるディスク/レイドを使用すると、オーバーフローします。

snmp v2cがinteger64またはunsigned64をサポートしていることをいくつかのインターネットフォーラムから読みました。私のテストでは、タイプを integer64 または unsigned64 に設定しても、下位 32 ビットのみが送信されます。

これが私がやった方法です:

  1. スタンドアロン プログラムが容量を取得し、データをファイルに書き込みます。レイド容量の例

    my-sub-oid
    Counter64
    7813857280
    
  2. /etc/snmp/snmpd.conf には、oid を通過するための句があります。

    pass_persist mymiboid /path/to/snmpagent
    
  3. mysnmpagent ソースで、oidmap をファイルから oid/type/value 構造に読み取り、stdout に出力します。

    printf("%s\n", it->first.c_str());
    printf("%s\n", it->second.type.c_str());
    printf("%s\n", it->second.value.c_str());
    fflush(stdout);
    
  4. snmpget を使用してサブ oid を取得すると、以下が返されます。

    mysuboid = Counter32: 3518889984
    
  5. 私は tcpdump を使用しており、値部分の最後のセグメントは次のとおりです。

    41 0500 d1be 0000
    

41 はタグ、05 は長さ、値は容量の下位 32 ビットのみを運ぶ必要があります。(注 7813857280 は 0x1.d1.be.00.00 です)

文字列型を使用すると正しい値が送信されることがわかりました(オクテットストリング形式)。しかし、snmp v2c で 64 ビット整数を使用する方法があるかどうか知りたいです。

ただし、NET-SNMP 5.4.2.1 を実行しています。どうもありがとう。

アップデート:

net-snmp doc pageの pass (およびおそらく pass_persist も) に関する snmpd.conf から以下を見つけました。Counter64 を Counter32 に強制していると思います。

Note:
The SMIv2 type counter64 and SNMPv2 noSuchObject exception are not supported.
4

2 に答える 2

2

大きな数の下位バイトと上位バイトに 2 つの Unsigned32 を使用することになっています。

Counter64 は、このように大きな数に使用するためのものではありません。

参考: 17 の一般的な MIB 設計エラー (最後のエラー)

于 2015-09-01T14:56:36.140 に答える
1

SNMP SMIv2 は、新しいタイプの Counter64 を定義します。

https://www.rfc-editor.org/rfc/rfc2578#page-24

これは実際には符号なし 64 ビット整数です。したがって、データが範囲内にある場合は、Counter64 を使用するのが適切です。

「私のテストでは、タイプを integer64 または unsigned64 に設定したにもかかわらず、下位 32 ビットを送信するだけです」というのは問題のように聞こえますが、テスト方法の詳細 (コードの表示など) を示さない限り、結果を受け取ったので、誰もそれ以上助けることはできませんでした。

于 2013-11-13T05:51:35.390 に答える