SNMP 与帧缓冲设备驱动全解析
1. SNMP 输出特点与版本差异
SNMP 输出采用深度优先遍历方式,这使得阅读起来有些别扭。它会先遍历完每一列,再回到第一行开始下一列的遍历,这是由 OID 的词法排序导致的。例如,由于 ifDescr 是 ifEntry.1,ifType 是 ifEntry.2,所以会先看到所有的 ifDescr 字段,再看到 ifType 字段。
SNMP 主要有三个版本:
-
SNMPv1
:是最初版本,最为简单,但存在一些缺点:
- 不支持超过 32 位的整数。
- 无法请求批量数据,必须逐个按名称请求对象。
- 没有机制确保陷阱(trap)能到达目的地。
- 安全认证使用社区名,类似于密码,但在网络上明文传输(即未加密)。
-
SNMPv2c
:解决了 SNMPv1 的前三个问题,引入了 64 位整数、GETBULK 命令和 informs(已确认的陷阱)。不过,在新的安全机制上难以达成一致,仍然依赖社区名进行认证。
-
SNMPv3
:用更安全的认证和加密机制取代了社区名认证机制,但深入讨论超出了本文范围。
虽然 SNMPv1 已被列为“历史”状态,但许多 IT 组织的应用仍在使用它。为了与这些旧应用兼容,网络设备可能需要支持 SNMPv1。不过,在不久的将来,一些客户可能会希望禁用这些较旧、安全性较低的 SNMP 版本。
2. 通过 MIB 识别设备
通过遍历设备支持的 MIB 通常可以识别设备类型。例如,有一次有人被分配了一个新工作站的 IP 地址,却发现该地址已被占用。由于是通过正规渠道分配的地址,他认为有人违规使用。于是,他关闭自己的系统,用另一台系统读取违规设备的 system.sysContact,该信息本应设置为该节点管理员的联系信息,但却没有。接着,他遍历了该设备支持的所有 MIB,发现它支持打印机 MIB,原来他被错误地分配了部门打印机的 IP 地址。
3. SNMP 数据类型
SNMP 数据类型是 ASN.1 类型的子集,主要分为三种:
|数据类型|描述|SNMPv2 变化|
| ---- | ---- | ---- |
|INTEGER|可正可负,值可以是枚举值、指定范围(如 lowValue..highValue)或固定大小(如 Size(4))|变为 Integer32,明确表示 32 位,还新增 Unsigned32 类型表示仅为正值的 32 位整数|
|Gauge|只能取非负值,值在指定范围内上升或下降(如 0 到 100%,或 0 到最大容量)|重新定义为 Gauge32|
|Counter|只能取非负值,与 Gauge 不同的是,其值只会增加,达到最大值后会回绕到零|被 Counter32 和 Counter64 取代|
|TimeTicks|以 1/100 秒为单位描述时间的整数,通常用于描述自某个重要事件或起始点(如系统启动或上次配置更改)以来的时间|无|
|OCTET STRING|八位字节的字符串,不一定是以空字符结尾的 C 字符串,每个字节可以包含任意值(0..255)|新增限制,长度不能超过 65,535(即长度必须能用 16 位表示)|
|OBJECT IDENTIFIER|用于包含 SNMP OID 值|新增限制,最多包含 128 个组件,每个组件必须能用最多 32 位表示|
|IpAddress|长度为四的八位字节字符串,仅能表示 IPv4 地址|无|
|Opaque|类似于 OCTET STRING,有类似的限制,用于允许 SMI 的扩展,不建议基于此类型定义新类型|无|
|BITS|在 SNMPv2 中新增,用于表示带标签位的位字段(即每个位有单独含义)|无|
4. SNMP 表格
除了上述简单类型,SNMP 还可以使用 SEQUENCE 和 SEQUENCE OF 来描述表格。MIB 中的表格被描述为描述条目的类型的 SEQUENCE OF,表格条目则被描述为包含条目的各个字段的 SEQUENCE。例如,MIB - 2 中接口表的定义如下:
ifTable OBJECT-TYPE
SYNTAX SEQUENCE OF IfEntry
MAX-ACCESS not-accessible
STATUS current
DESCRIPTION
"A list of interface entries. The number of entries is
given by the value of ifNumber."
::= { interfaces 2 }
ifEntry OBJECT-TYPE
SYNTAX IfEntry
MAX-ACCESS not-accessible
STATUS current
DESCRIPTION
"An entry containing management information applicable to a
particular interface."
INDEX { ifIndex }
::= { ifTable 1 }
IfEntry ::=
SEQUENCE {
ifIndex InterfaceIndex,
ifDescr DisplayString,
ifType IANAifType,
ifMtu Integer32,
ifSpeed Gauge32,
ifPhysAddress PhysAddress,
ifAdminStatus INTEGER,
ifOperStatus INTEGER,
ifLastChange TimeTicks,
ifInOctets Counter32,
ifInUcastPkts Counter32,
ifInNUcastPkts Counter32, -- deprecated
ifInDiscards Counter32,
ifInErrors Counter32,
ifInUnknownProtos Counter32,
ifOutOctets Counter32,
ifOutUcastPkts Counter32,
ifOutNUcastPkts Counter32, -- deprecated
ifOutDiscards Counter32,
ifOutErrors Counter32,
ifOutQLen Gauge32, -- deprecated
ifSpecific OBJECT IDENTIFIER -- deprecated
}
需要注意 ifEntry 和 IfEntry 的使用,所有对象名以小写开头,如 ifTable 和 ifEntry,而 IfEntry 首字母大写,表明它描述的是一种类型,而非对象。IfEntry 类型类似于 C 语言中的结构体,描述了表格每一行的布局,小写的 ifEntry 是 OID 树中的一个节点,其下方将定义列对象。因此,特定接口的描述将具有类似 ifTable.ifEntry.ifDescr.x 的 OID,其中 x 是行索引。
5. 定义新类型
虽然 SMI 中定义的数据类型已足够,但有时更具体的定义会更方便。例如,可能需要限制 OCTET STRING 中的可能值或 Integer32 所涵盖的范围。RFC 1903 描述了文本约定(textual convention),这是一种宏,允许将说明绑定到一个新类型中。以下是从 Net - SNMP(版本 5.0.8)分发的 SNMPv2 - TC.txt 文件中获取的文本约定示例:
DisplayString ::= TEXTUAL-CONVENTION
DISPLAY-HINT "255a"
STATUS current
DESCRIPTION
"Represents textual information taken from the NVT ASCII
character set, as defined in pages 4, 10-11 of RFC 854.
To summarize RFC 854, the NVT ASCII repertoire specifies:
- the use of character codes 0-127 (decimal)
- the graphics characters (32-126) are interpreted as
US ASCII
- NUL, LF, CR, BEL, BS, HT, VT and FF have the special
meanings specified in RFC 854
- the other 25 codes have no standard interpretation
- the sequence 'CR LF' means newline
- the sequence 'CR NUL' means carriage-return
- an 'LF' not preceded by a 'CR' means moving to the
same column on the next line.
- the sequence 'CR x' for any x other than LF or NUL is
illegal. (Note that this also means that a string may
end with either 'CR LF' or 'CR NUL', but not with CR.)
Any object defined using this syntax may not exceed 255
characters in length."
SYNTAX OCTET STRING (SIZE (0..255))
这描述了一个名为 DisplayString 的类型,它可以接受最多 255 个八位字节,其值被限制为对应可显示字符的值。DISPLAY - HINT 子句显示了 DisplayString 可能的形式,255a 表示它可以采用最多 255 个 ASCII 字符的形式。RFC 1903 描述了显示提示的完整语法。
6. MIB 文件结构
MIB 文件通常在 BEGIN 和 END 语句之间命名和定义,会描述从其他 MIB 文件中包含的内容,以及在该 MIB 文件中定义的模块名称、负责该 MIB 的人员的联系信息和修订历史,然后是 MIB 中对象的定义。以 IF - MIB 为例:
IF-MIB DEFINITIONS ::= BEGIN
END
首先是外部依赖部分:
IMPORTS
MODULE-IDENTITY, OBJECT-TYPE, Counter32, Gauge32, Counter64,
Integer32, TimeTicks, mib-2,
NOTIFICATION-TYPE FROM SNMPv2-SMI
TEXTUAL-CONVENTION, DisplayString,
PhysAddress, TruthValue, RowStatus,
TimeStamp, AutonomousType, TestAndIncr FROM SNMPv2-TC
MODULE-COMPLIANCE, OBJECT-GROUP,
NOTIFICATION-GROUP FROM SNMPv2-CONF
snmpTraps FROM SNMPv2-MIB
IANAifType FROM IANAifType-MIB;
接着是模块定义:
ifMIB MODULE-IDENTITY
LAST-UPDATED "200006140000Z"
ORGANIZATION "IETF Interfaces MIB Working Group"
CONTACT-INFO
" Keith McCloghrie
Cisco Systems, Inc.
170 West Tasman Drive
San Jose, CA 95134-1706
US
408-526-5260
kzm@cisco.com"
DESCRIPTION
"The MIB module to describe generic objects for
network interface sub-layers. This MIB is an
updated version of MIB-II's ifTable, and incorporates
the extensions defined in RFC 1229."
REVISION "200006140000Z"
DESCRIPTION
"Clarifications agreed upon by the Interfaces MIB WG,
and published as RFC 2863."
REVISION "199602282155Z"
DESCRIPTION
"Revisions made by the Interfaces MIB WG, and
published in RFC 2233."
REVISION "199311082155Z"
DESCRIPTION
"Initial revision, published as part of RFC 1573."
::= { mib-2 31 }
这描述了 ifMib 模块,它在整个 MIB 地址空间中位于 { mib - 2 31 } 位置。组织和联系信息清晰可辨,随后是该 MIB 各次修订的描述,按逆时间顺序排列。时间和日期看起来有些神秘,但它们只是年、月、日、小时和分钟在 GMT(由 Z 表示祖鲁时间)的拼接。因此,最近的修订(200006140000Z)是在 2000 年 6 月 14 日进行的。接下来是 MIB 对象实际结构的定义,以及该 MIB 中新的文本约定。
7. 帧缓冲设备驱动安装概述
Laddie CD 的设计目标是尽可能与多种视频卡兼容。它默认使用一个广泛采用的视频标准的帧缓冲设备驱动,并将其配置为低分辨率、每像素仅 8 位的显示。如果该驱动失败,系统会尝试为视频卡找到特定硬件的驱动,并以其默认配置加载。这种方法能为大多数系统提供一个基本可用的帧缓冲。但如果想更好地利用特定硬件,还需要采取一些额外步骤,主要包括:
- 为视频卡找到帧缓冲设备驱动。
- 配置帧缓冲设备驱动。
8. 寻找视频卡的帧缓冲设备驱动
要找到视频卡可用的设备驱动,需用 Laddie CD 启动 PC:
-
判断驱动是否成功加载
:如果 Laddie CD 成功找到视频卡的驱动,会启动 Laddie 帧缓冲 UI;否则,在登录提示前会显示消息“帧缓冲 (/dev/fb0) 不可用”。
-
确定已加载的驱动
:假设帧缓冲驱动已成功加载,先按 ESC 退出帧缓冲 UI,然后在命令提示符下输入:
laddie:~# dmesg | grep fb
dmesg 命令显示自启动以来内核产生的消息缓冲区,grep 命令选择可能与帧缓冲有关的消息。
9. vesafb 驱动
Laddie CD 首先尝试加载 vesafb 视频驱动,因为它是未知显卡最可能适用的驱动。该驱动支持视频电子标准协会(VESA)开发的 VESA BIOS 扩展(VBE)接口,依赖 BIOS,因此必须在系统启动时进行配置,这意味着 vesafb 驱动必须编译到内核中,而不是作为单独的模块提供。Laddie 设备使用启动提示命令来配置该驱动。以下是一个系统成功安装 vesafb 驱动的示例输出:
vesafb: framebuffer at 0xd8000000, mapped to 0xf8880000, using 600k, total 32768k
vesafb: mode is 640x480x8, linelength=640, pages=11
vesafb: protected mode interface info at c000:0f03
vesafb: scrolling: redraw
vesafb: Pseudocolor: size=8:8:8:8, shift=0:0:0:0
vesafb: Mode is VGA compatible
fb0: VESA VGA frame buffer device
10. 特定硬件驱动
如果系统成功加载了 vesafb 驱动,要检查其他驱动,需要在启动时禁用该驱动。具体操作如下:
1. 重启 Laddie CD。
2. 看到启动提示时,输入 novesa 并按 ENTER。
3. 如果帧缓冲 UI 启动,说明系统找到了合适的驱动。退出帧缓冲 UI,输入命令 dmesg | grep fb。例如,在某个系统上执行该命令产生的结果如下:
vesafb: probe of vesafb0 failed with error -6
rivafb: nVidia device/chipset 10DE002D
rivafb: nVidia Corporation NV5M64 [RIVA TNT2 Model 64/Model 64 Pro]
rivafb: RIVA MTRR set to ON
rivafb: could not retrieve EDID from DDC/I2C
rivafb: setting virtual Y resolution to 52428
rivafb: PCI nVidia NV4 framebuffer ver 0.9.5b (32MB @ 0xF8000000)
从结果可以看出,vesafb 驱动加载失败,特定设备驱动成功加载,这里的 rivafb 是 NVIDIA 显卡的视频驱动。
也可以使用 lsmod 命令检查系统加载了哪个特定硬件的帧缓冲驱动,在控制台执行:
lsmod | grep fb
lsmod 命令列出内核当前加载的所有模块,帧缓冲名称通常包含字母 fb,如 nvidiafb、radeonfb、savagefb 或 matroxfb_g450。不过,lsmod 命令对 vesafb 驱动不起作用,因为 vesafb 驱动不是模块,而是编译到内核中。
11. Laddie CD 未包含的驱动
如果 Laddie CD 没有找到视频卡的驱动,有可能更新的内核会支持它。此时,可以使用 lspci 命令识别视频卡。如果显卡是 AGP、PCI 或 PCI - Express,该命令会报告相关信息。例如,在一台开发机器上运行 lspci 命令产生的其中一行输出如下:
01:00.0 VGA compatible controller: nVidia Corporation NV15 [GeForce2 GTS/Pro] (rev a4)
这表明有一个 NVIDIA VGA 兼容控制器(VGA 代表视频图形阵列)。此时,可能需要花些时间在互联网上为视频卡寻找驱动。同时要记住,Linux 并非支持所有显卡,所以可能需要安装不同的显卡才能使用 Linux 帧缓冲。
SNMP 与帧缓冲设备驱动全解析
12. 配置帧缓冲设备驱动
在找到合适的帧缓冲设备驱动后,接下来需要对其进行配置,以实现更好的显示效果。不同的驱动配置方式有所不同,但通常可以通过修改系统的启动参数或者配置文件来完成。以下是一些常见的配置步骤和方法:
-
修改启动参数
:对于一些依赖 BIOS 配置的驱动,如 vesafb 驱动,通常需要在系统启动时修改启动参数。在 Laddie CD 启动时,当看到启动提示界面,可以输入相应的驱动配置参数。例如,若要配置 vesafb 驱动的分辨率,可以使用类似
vesafb.mode_option=1024x768-24
的参数,表示将分辨率设置为 1024x768,颜色深度为 24 位。输入完成后按 ENTER 键,系统将按照新的参数启动驱动。
-
编辑配置文件
:有些驱动可以通过编辑系统的配置文件来进行更详细的配置。在 Linux 系统中,常见的配置文件位于
/etc
目录下。例如,对于某些显卡驱动,可能需要编辑
/etc/X11/xorg.conf
文件。在该文件中,可以设置显示器的分辨率、刷新率、颜色深度等参数。以下是一个简单的
xorg.conf
文件示例:
Section "Monitor"
Identifier "MyMonitor"
HorizSync 30-80
VertRefresh 50-75
EndSection
Section "Device"
Identifier "MyGraphicsCard"
Driver "nvidia"
EndSection
Section "Screen"
Identifier "DefaultScreen"
Device "MyGraphicsCard"
Monitor "MyMonitor"
DefaultDepth 24
SubSection "Display"
Depth 24
Modes "1024x768"
EndSubSection
EndSection
在这个示例中,定义了显示器的水平和垂直同步范围,指定了显卡驱动为 NVIDIA 驱动,并设置了默认的显示分辨率为 1024x768。
13. 总结与注意事项
通过以上对 SNMP 和帧缓冲设备驱动的介绍,我们对这两个重要的技术领域有了较为全面的了解。在实际应用中,需要注意以下几点:
-
SNMP 方面
:
- 虽然 SNMPv1 存在安全隐患,但在与旧系统兼容时仍可能需要使用。在使用过程中,要注意保护社区名的安全,避免信息泄露。
- 在开发 MIB 时,要合理使用数据类型和表格结构,遵循相关的标准和规范,确保 MIB 的可读性和可维护性。
- 对于不同版本的 SNMP,要根据实际需求选择合适的版本,充分利用新版本的优势,提高系统的安全性和性能。
-
帧缓冲设备驱动方面
:
- 在寻找驱动时,要确保使用的内核版本支持显卡。如果 Laddie CD 自带的驱动不适用,可以尝试更新内核或者在互联网上寻找合适的驱动。
- 配置驱动时,要谨慎修改启动参数和配置文件,避免因错误的配置导致系统无法正常启动。在修改之前,最好备份原始的配置文件,以便在出现问题时可以恢复。
- 不同的显卡和驱动可能有不同的配置选项和要求,要参考显卡的官方文档和驱动的使用说明进行配置。
14. 操作流程总结
为了更清晰地展示 SNMP 相关操作和帧缓冲设备驱动的安装与配置过程,以下是一个操作流程总结表格:
|操作类型|操作步骤|
| ---- | ---- |
|SNMP 设备类型识别|1. 使用 snmpwalk 等工具遍历设备支持的 MIB
2. 根据 MIB 信息判断设备类型|
|SNMP 数据获取|1. 使用 snmpget 命令,指定 OID 获取特定对象的值
2. 使用 GETBULK 命令(SNMPv2 及以上)批量获取数据|
|帧缓冲设备驱动查找|1. 用 Laddie CD 启动 PC
2. 判断驱动是否成功加载(观察是否启动 Laddie 帧缓冲 UI 或显示错误信息)
3. 若成功加载,按 ESC 退出 UI,输入
dmesg | grep fb
确定已加载的驱动
4. 若要检查其他驱动,重启 Laddie CD,输入 novesa 禁用 vesafb 驱动,再次判断并确定驱动|
|帧缓冲设备驱动配置|1. 修改启动参数(在启动提示界面输入相应参数)
2. 编辑配置文件(如
/etc/X11/xorg.conf
),设置分辨率、刷新率等参数|
15. 流程图展示
下面是一个 mermaid 格式的流程图,展示了帧缓冲设备驱动的查找和配置流程:
graph TD;
A[用 Laddie CD 启动 PC] --> B{驱动是否成功加载};
B -- 是 --> C[按 ESC 退出帧缓冲 UI];
C --> D[输入 dmesg | grep fb 确定驱动];
D --> E{是否为 vesafb 驱动};
E -- 是 --> F[重启 Laddie CD,输入 novesa 禁用 vesafb 驱动];
F --> G{是否找到新驱动};
G -- 是 --> H[确定新驱动类型];
H --> I[配置驱动(修改启动参数或编辑配置文件)];
B -- 否 --> J[使用 lspci 命令识别显卡];
J --> K[在互联网寻找驱动或更新内核];
K --> L[尝试重新安装驱动];
L --> B;
E -- 否 --> I;
G -- 否 --> J;
通过以上的介绍和总结,我们可以更好地掌握 SNMP 和帧缓冲设备驱动的相关知识和操作技能,在实际工作中能够更有效地进行网络管理和设备配置。希望这些内容对你有所帮助。
超级会员免费看
9

被折叠的 条评论
为什么被折叠?



