需通过I²C接口读取SFP光模块TX功率与温度:先用ls /sys/class/net/*/device/sfp/确认模块识别,再用ethtool -i检查DDM固件支持;推荐sfp-tool工具直接解析,或依SFF-8472标准手动计算EEPROM数据;Mellanox用mlxlink、Broadcom用ethtool -m(注意单位换算与内核兼容性)。

在Linux服务器上排查光纤链路异常时,需要直接读取SFP/SFP+光模块的实时发光功率(TX Power)和工作温度(Temperature),这些参数无法通过通用网络命令获取,必须依赖物理设备提供的I²C接口和标准寄存器定义。
确认光模块是否被系统识别
执行 ls /sys/class/net/*/device/sfp/,若返回类似 /sys/class/net/ens1f0/device/sfp/ 的路径,说明内核已加载sfp驱动并探测到模块;若报错“没有那个文件或目录”,则需先确认网卡是否支持热插拔SFP、固件是否启用DDM(Digital Diagnostic Monitoring)功能。
运行 ethtool -i ens1f0 | grep firmware,输出中需包含 ddm 或 diagnostics 字样,否则即使插入合规模块,也无法读取光功率与温度。
使用sfp-tool工具直接读取光参数
方法一:通过开源sfp-tool(推荐)
从GitHub克隆项目:git clone https://github.com/edwardcwang/sfp-tool.git && cd sfp-tool && make && sudo ./sfp-tool -d /sys/class/net/ens1f0/device/sfp/。
输出中 【TX Power (dBm)】 和 【Temperature (°C)】 两行即为当前值,注意单位——功率是dBm(负数正常,-1 dBm ≈ 0.79 mW),温度是摄氏度。
方法二:手动解析EEPROM二进制数据(仅限熟悉SFF-8472标准者)
执行 sudo hexdump -C /sys/class/net/ens1f0/device/sfp/eeprom | head -n 40,定位地址0x50~0x51(温度原始值)、0x52~0x53(TX偏置电流)、0x54~0x55(TX光功率),按公式 value × 1/256 换算成实际数值;该方式极易因字节序或校准系数错误导致结果偏差超过±5℃或±3dBm。
用ethtool配合厂商私有驱动读取(适用于Mellanox/Broadcom网卡)
第一步:确认驱动类型,运行 lspci -k -s $(ethtool -i ens1f0 | awk '/bus-info/ {print $2}') | grep driver,若输出为 driver: mlx5_core 或 driver: bnxt_en,则进入对应分支。
第二步:对Mellanox设备,执行 sudo mlxlink -d /dev/mst/mt4115_pciconf0 -p 1 | grep -E "(Temp|TX Power)";其中 -p 1 表示第一个端口,编号需根据 mlxlink -d /dev/mst/mt4115_pciconf0 --show_port 实际输出调整。
第三步:对Broadcom设备,使用 sudo ethtool -m ens1f0,输出中 【Laser output power:】 后数值单位为mW,需手动换算为dBm(公式:10×log₁₀(mW)),温度字段为 【Module temperature:】,单位℃。
注意:ethtool -m 在部分旧版内核(如4.18以下)中可能返回“Operation not supported”,此时必须升级firmware或改用厂商专用工具。











