家用小服务器 篇九:给家用小主机/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对内存和cpu的占用还是比较少的。怕的就是监控软件自身占用较大的资源,那就适得其反了。
准备编译环境
安装串口驱动
下载CH340驱动程序
到windows设备管理器中确认是否安装成功
安装VS Code+ PlatformIO
为了方便普通用户(如本人)编译和调试,可以安装VS Code+PlatformIO插件。
VS Code全称Visual Studio Code,是微软推出的跨平台/轻量级代码编辑IDE(还记得Visual Studio吗),安装极其简单。
然后在【扩展】中直接搜索“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】
烧录完成,下面的控制台会打印一些调试信息,算是成功了
最后烧录完成的屏幕显示是这样的,原作者的布局还是挺合理的。
将日常运行状态和开启Jellyfin播放视频时的状态放在下图,网速的单位是Byte。在不同运行状态下,监控指标还是准确的。
总结
整个过程从部署Netdata到烧录源代码还算顺利,代码量非常少也挺易懂的,适合在这个基础上继续开发和改进。本文对应的源代码已上传到gxf1027 / RouterMonitor。
最后感谢作者开源代码,开源是技术发展的推动力。