[comment]: # ({1035fd30-b33b8329})
# 6 传感器

[comment]: # ({/1035fd30-b33b8329})

[comment]: # ({752b9468-eaab320d})
#### 概述

每个传感器芯片都会在 sysfs `/sys/devices` 树中拥有自己的目录。
要查找所有传感器芯片，最简单的方法是跟随 `/sys/class/hwmon/hwmon*` 中的设备符号链接，其中 `*` 是一个实际数字（0、1、2、...）。

传感器读数位于虚拟设备的 `/sys/class/hwmon/hwmon*/` 目录中，或位于非虚拟设备的 `/sys/class/hwmon/hwmon*/device` 目录中。
位于 `hwmon*` 或 `hwmon*/device` 目录中的名为 `name` 的文件包含芯片名称，该名称对应于传感器芯片所使用的内核驱动程序名称。

每个文件只包含一个传感器读数值。
上述任一目录中包含传感器读数的文件，其通用命名格式为：`<type><number>_<item>`，其中

-   **type** - 对于传感器芯片而言，表示 "in"（电压）、"temp"（温度）、"fan"（风扇）等。
-   **item** - "input"（测量值）、"max"（高阈值）、"min"（低阈值）等。
-   **number** - 始终用于可能出现多次的元素（通常从 1 开始，但电压从 0 开始）。
如果文件不对应某个特定元素，则它们只有一个简单名称，不带编号。

主机上可用的传感器信息可以通过 **sensors-detect** 和 **sensors** 工具获取（[lm-sensors package](https://docs.kernel.org/hwmon/sysfs-interface.html)）。
**sensors-detect** 有助于确定可用传感器所需的模块。
加载模块后，可以使用 **sensors** 程序显示所有传感器芯片的读数。
该程序使用的传感器读数标签可能与通用命名格式（`<type><number>_<item>`）不同：

-   如果存在名为 `<type><number>_label` 的文件，则会使用该文件中的标签，而不是 `<type><number><item>` 名称；
-   如果不存在 `<type><number>_label` 文件，则程序会在 `/etc/sensors.conf`（也可能是 `/etc/sensors3.conf`，或其他位置）中查找名称替换。

这种标签机制使用户能够确定所使用的硬件类型。
如果既没有 `<type><number>_label` 文件，也没有配置文件中的标签，则可以通过名称属性（`hwmon*/device/name`）确定硬件类型。
`zabbix_agent` 可接受的传感器实际名称，可以通过使用 `-u` 参数运行 **sensors** 程序获得（`sensors -u`）。

在 **sensors** 程序中，可用传感器按总线类型进行分组（ISA adapter、PCI adapter、SPI adapter、Virtual device、ACPI interface、HID adapter）。

[comment]: # ({/752b9468-eaab320d})

[comment]: # ({397aa635-0cb28aa9})
#### 获取传感器标识符

`sensors` 命令打印的传感器标签不能总是直接使用，因为不同芯片厂商的命名方式各不相同。  
例如，`sensors` 的输出可能包含以下几行：

```bash
sensors
in0:         +2.24 V  (min =  +0.00 V, max =  +3.32 V)   
Vcore:       +1.15 V  (min =  +0.00 V, max =  +2.99 V)   
+3.3V:       +3.30 V  (min =  +2.97 V, max =  +3.63 V)   
+12V:       +13.00 V  (min =  +0.00 V, max = +15.94 V)
M/B Temp:    +30.0°C  (low  = -127.0°C, high = +127.0°C)
```

在这些名称中，只有一个显示名称能直接对应到内部标识符：

```bash
zabbix_get -s 127.0.0.1 -k sensor[lm85-i2c-0-2e,in0]
2.240000
```

尝试使用其他显示标签（例如 `Vcore` 或 `+12V`）将不起作用：

```bash
zabbix_get -s 127.0.0.1 -k sensor[lm85-i2c-0-2e,Vcore]
ZBX_NOTSUPPORTED
```

要查找 Zabbix 接受的内部传感器标识符，请运行 `sensors -u`。  
在输出中，可以看到如下内容：

```bash
sensors -u
...
Vcore:
  in1_input: 1.15
  in1_min: 0.00
  in1_max: 2.99
  in1_alarm: 0.00
...
+12V:
  in4_input: 13.00
  in4_min: 0.00
  in4_max: 15.94
  in4_alarm: 0.00
...
```

因此，`Vcore` 标签对应标识符 `in1`，而 `+12V` 对应 `in4`。  
根据内核 hwmon sysfs [规范](https://docs.kernel.org/hwmon/sysfs-interface.html)，这些是芯片引脚上的电压，通常可能需要进行缩放。

```bash
zabbix_get -s 127.0.0.1 -k sensor[lm85-i2c-0-2e,in1]
1.301000
```

Zabbix 不仅可以获取电压（`in`），还可以获取电流（`curr`）、温度（`temp`）和风扇转速（`fan`）读数。

[comment]: # ({/397aa635-0cb28aa9})

[comment]: # ({5b2a0096-8c111a00})
#### 兼容性

[comment]: # ({/5b2a0096-8c111a00})

[comment]: # ({f66e4878-61bf6279})
##### 旧版发行版

传感器读数从 `/proc/sys/dev/sensors` 目录获取：

-   **device** - 设备名称（如果使用 <mode>，则为正则表达式）
-   **sensor** - 传感器名称（如果使用 <mode>，则为正则表达式）
-   **mode** - 可选值：`avg`、`max`、`min`（如果省略此参数，则 device 和 sensor 按字面值处理）

示例键：`sensor[w83781d-i2c-0-2d,temp1]`。

[comment]: # ({/f66e4878-61bf6279})

[comment]: # ({9e54fe4b-2e1edda6})
##### 当前发行版

传感器读数从 `/sys/class/hwmon` 目录获取：

-   **device** - 设备名称（非正则表达式）。
    设备名称可以是设备的实际名称（例如 `0000:00:18.3`），也可以是使用 sensors 程序获取的名称（例如 `k8temp-pci-00c3`）。
    由用户自行选择使用哪种名称。
-   **sensor** - 传感器名称（非正则表达式）。
-   **mode** - 可能的值：`avg`、`max`、`min`（如果省略此参数，则按原样处理 device 和 sensor）。

示例键：

`sensor[k8temp-pci-00c3,temp,max]` 或 `sensor[0000:00:18.3,temp1]`。

`sensor[smsc47b397-isa-0880,in,avg]` 或 `sensor[smsc47b397.2176,in1]`。

[comment]: # ({/9e54fe4b-2e1edda6})
