给家用小主机/NAS添加一块监控显示屏: Netdata部署,源码烧写,非专业玩家也能上手
前言
家用服务器/NAS/HTPC没有自带的屏幕,一般通过远程SSH或者web端方式查看系统和硬件的运行情况,比如CPU负载、IO、网络和温度等指标。
近期在B站发现一款叫“SD2小电视”的开源硬件,核心是一块ESP8266开发板,视频介绍可以通过网络获取小主机/NAS的运行信息,固件“shelo / RouterMonitor”已经开源。
B站:【给你的路由器和NAS加块OLED监控屏幕吧!只需30元拥有高端路由器的体验 RAX3000M | 360 T7 | 小米 AX3000T】 https://b23.tv/DxMNmrM
于是,在TB下单一款SD2小电视,到手时已经刷了可以显示时间和气象信息的固件,如下图。
原面板通过重新烧录代码到这个硬件,可以实现监控小主机/NAS。开源项目“shelo / RouterMonitor”的原理是:首先在需要被监控的设备上部署Netdata,然后SD2通过网络访问Netdata的api获取设备运行的指标,显示到小屏幕上。
部署Netdata
Netdata是一款Linux系统实时监控软件,具有高可配置性和花哨的展示页面,有点类似Prometheus+Grafana。我们需要它来采集小主机/NAS的系统指标(CPU、网络上下行、温度等),然后SD2从局域网获取Netdata采集的这些指标。
在需要监控的小主机或者NAS上部署netdata,可以采用直接安装或者docker方式部署。
这里采用docker方式部署netdata,部署脚本可以从官网获取。
这里将配置文件netdata.conf从本地映射到容器内部,这样可以使用自定义的配置文件。获取配置文件方法:(1)用官网脚本快速部署容器,然后浏览器访问ip:19999/netdata.conf可以获取默认的配置文件; (2)用官网脚本快速部署容器,然后在SSH中curl -o ./netdata.conf http://localhost:19999/netdata.conf 下载到本地,再修改。如果无自定义配置文件的需求,直接使用官网的脚本即可。
我自己使用的脚本如下,如使用,注意修改目录。
sudo docker run -d --name=netdata
--pid=host
--network=host
-v /home/xxx/containers/netdata/netdataconfig/netdata.conf:/etc/netdata/netdata.conf
-v netdatalib:/var/lib/netdata
-v netdatacache:/var/cache/netdata
-v /etc/passwd:/host/etc/passwd:ro
-v /etc/group:/host/etc/group:ro
-v /etc/localtime:/etc/localtime:ro
-v /proc:/host/proc:ro
-v /sys:/host/sys:ro
-v /etc/os-release:/host/etc/os-release:ro
-v /var/log:/host/var/log:ro
-v /var/run/docker.sock:/var/run/docker.sock:ro
--restart unless-stopped
--cap-add SYS_PTRACE
--cap-add SYS_ADMIN
--security-opt apparmor=unconfined
netdata/netdata
登录netdata的页面:http://[ip]:19999,默认端口可以在配置文件中修改。
netdata页面netdata监控的指标极其丰富,涵盖了硬件、网络、进程、容器、传感器等。
从netdata对自己这个容器的监控可见,netdata对内存和cpu的占用还是比较少的。怕的就是监控软件自身占用较大的资源,那就适得其反了。

准备编译环境
安装串口驱动
CH340驱动到windows设备管理器中确认是否安装成功
串口驱动安装成功安装VS Code+PlatformIO
为了方便普通用户(如本人)编译和调试,可以安装VS Code+PlatformIO插件。
VS Code全称Visual Studio Code,是微软推出的跨平台/轻量级代码编辑IDE(还记得Visual Studio吗),安装极其简单。
VS Code然后在【扩展】中直接搜索“PlatformIO”安装。
VS Code+PlatformIO修改源代码
下载项目源代码
需要先安装git for windows,然后重启VS Code可以看到源码管理器。
从项目gitee仓库shelo / RouterMonitor中clone项目源代码到本地,输入gitee项目地址:https://gitee.com/dannylsl/routermonitor.git,依次如下图操作。

拉取项目源码修改代码中的本地配置
重点来了,需要更改源代码中的配置信息(wifi名称、密码、指标等)才能将这个固件适用于自己的网络环境和Netdata。
1. 修改头文件中的IP信息
修改NetData.h文件中的IP。这个IP是被监控设备的IP(也就是Netdata所在主机的IP),直接修改NETDATA_HOST变量值。

2. 修改代码中的wifi信息
将main.ino文件开头的字符串ssid修改为自己的无线wifi名称,注意需要2.4G信号;将字符串password修改为无线密码。

3. 修改网卡信息
将main.ino文件下图红框位置的网卡名为自己的网卡名,是指需要被监控流量的网卡。格式为net.网卡名称。

比如,我的网卡名称为eno1,则需要修改为net.eno1。我实际上是新建了一个变量,方便应用到不同设备。


4. 修改内存大小
需要修改内存大小为实际值,否则屏幕上显示的内存使用百分比就会不准确。

我的小主机内存是8G的,新建了一个全局const变量,然后修改对应位置。


5. 修改温度传感器名称(指标名称)
先要到Netdata的Sensors页面找到对应温度传感器名称


修改读取温度代码中的指标名称

6. 修改cpu使用率计算方法(非必须)
先来看下cpu使用率指标返回的信息

原作者的cpu使用率取的是“max”值,根据实验“max”是上面"softirq","user","system","iowait"其中最大值。
我个人认为cpu使用率应该是"softirq"+"user"+"system"+"iowait",至少是应该用户态+内核态("softirq"+"user"+"system")。为什么要加上iowait,因为如果某个进程一直在等待IO完成这个iowait会变得很高(可能是存储有问题),相当于cpu时间消耗在等待io上了,所以将iowait加到cpu使用率计算上。

因此,我修改了这部分代码:

备忘Jsonarray文档:https://arduinojson.org/v6/api/jsonarray/
烧录代码到SD2
切换到PlatformIO, 然后选择【Upload and Monitor】
PlatformIO -- Upload and Monitor
从PC烧录到sd2烧录完成,下面的控制台会打印一些调试信息,算是成功了

最后烧录完成的屏幕显示是这样的,原作者的布局还是挺合理的。

将日常运行状态和开启Jellyfin播放视频时的状态放在下图,网速的单位是Byte。在不同运行状态下,监控指标还是准确的。
左:日常 右:Jellyfin硬解总结
整个过程从部署Netdata到烧录源代码还算顺利,代码量非常少也挺易懂的,适合在这个基础上继续开发和改进。本文对应的源代码已上传到gxf1027 / RouterMonitor。
最后感谢作者开源代码,开源是技术发展的推动力。

校验提示文案
校验提示文案
校验提示文案
校验提示文案
校验提示文案
去看看
走系统接口,无需插件,无需修改编译代码,数据也不会存在netdata方案不准确的问题
校验提示文案
校验提示文案
校验提示文案
校验提示文案
校验提示文案
校验提示文案
校验提示文案
校验提示文案
校验提示文案
校验提示文案
校验提示文案
校验提示文案
校验提示文案
校验提示文案
校验提示文案
校验提示文案
校验提示文案
校验提示文案
校验提示文案
去看看
走系统接口,无需插件,无需修改编译代码,数据也不会存在netdata方案不准确的问题
校验提示文案
校验提示文案
校验提示文案
校验提示文案
校验提示文案
校验提示文案
校验提示文案
校验提示文案
校验提示文案
校验提示文案
校验提示文案
校验提示文案