FAQ 1.硬件看门狗如何使用? 硬件看门狗的主体是一个定时电路,其主要作用是监控、管理CPU的运行状态, 并对处于异常状态中的CPU进行复位操作,使其能重新工作。 Android10.0 出厂固件没有打开硬件看门狗,如果客户需要可自行实现软件程序 去使用硬件看门狗,下面提供硬件看门狗的操作方法: 使能看门狗 echo e > "/dev/wdt_crl" 设置超时时间(喂狗) 支持设置4种超时时间:0.64s、2.56s、10.24s、40.96s,对应往设备节点里写0 、1、2、3。客户可根据自己的需要设置不同的超时时间,例如客户需要设置超 时时间为2.56s,则为: echo 1 > "/dev/wdt_crl" 软件程序需要定时设置超时时间对看门狗内的定时器清零(俗称“喂狗”)。 当CPU出现故障,则不能继续提供“喂狗”信号,就使得看门狗内的定时器不断累 加而溢出,从而产生复位信号对CPU进行复位重启系统,使CPU重新工作。 关闭看门狗 echo d > "/dev/wdt_crl" 2.BMC 常见问题 BMC 上的设备均显示为不可用 原因有多样,请按照以下顺序逐一排查: 将显示时间范围调整到最近半小时,看有没有输出。 运行 adb devices 看有没有设备列出。 如果没有,确保 USB OTG 口没有连接 到电脑上,如果 USB OTG 口也没有连接,请检查核心板连接和电源,排除硬件 问题。 运行 bmc query ,正常情况下有如下返回: root@firefly:~# bmc query node_cluster_up{instance="127.0.0.1:9100", job="node", nodename="main", subnode="main"} => 1 @[1603356844.328] node_cluster_up{instance="127.0.0.1:9100", job="node", nodename="main", subnode="sub01"} => 1 @[1603356844.328] node_cluster_up{instance="127.0.0.1:9100", job="node", nodename="main", subnode="sub02"} => 1 @[1603356844.328] ... 如果没有 ,检查主板上的 node_exporter 有没有运行: root@firefly:~# bmc main metrics | grep node_cluster_up # HELP node_cluster_up Value is 1 if the cluster subnode is 'up', 0 otherwise. # TYPE node_cluster_up gauge node_cluster_up{state="android",subnode="sub02"} 1 node_cluster_up{state="android",subnode="sub03"} 1 ... 如果没有输出, 则主板上的 node_exporter 运行出错。 如果有输出, Prometheus 服务并没 有去收集主板的 node_exporter 数据,运行出错。 运行 sudo systemctl status prometheus 查看该服务的状态。 运行 sudo journalctl -u prometheus 查看该服务的运行日志,定位错误的原 因。 如果日志含有出错信息:"Handle Corrupt Prometheus Write-Ahead Log (WAL)" 请尝试删除该坏文件并重启服务: sudo systemctl restart prometheus 如果日志含有出错信息:"Error on ingesting out-of-order samples" 当服务器时间和浏览器时间不一致, 例如服务器时间是 7-01, 浏 览器是 7-21, 这 会导致浏览器发送的查询命令要求返回对于服务器来讲是未 来的数据,得到的响应结果为空, 进而导致显示界面为空。 系统默认是使用 NTP 自动更新时间的,如果由于网络原因无法使用 NTP,就要手工同步时间: sudo timedatectl set-ntp false # 关闭 NTP sudo timedatectl set-timezone Asia/Shanghai # 设置本地时区 sudo timedatectl set-time "2021-10-14 15:48:29" # 设置本地时间 timedatectl status # 检查结果,注意时 区和时间 然后重置 Prometheus: sudo systemctl stop prometheus sudo rm -rf /var/lib/prometheus/metrics2/* sudo systemctl start prometheus 子板固件升级问题排查 固件升级背景知识 子板固件升级系统分为两部分: Web 前端负责添加固件升级申请和升级进度的显示。 后端netrecovery-master 负责实际的子板固件升级和进度更新。 子板固件升级流程为: 切换子板到 Loader 模式。 对处于 Loader 模式的子板设备写入辅助升级固件并重启进入升级系统(下称 netrecovery 模式)。 对子板设置 DHCP IP 地址。 子板运行固件升级程序,通过网络下载主板上的固件,同时烧写到 eMMC 存储。 子板烧写成功,重启。 子板固件升级成功的必要条件: 确保子板能够获取 DHCP IP 地址,而且主板与子板的网络要能相通。 集群服务器的 OTG USB 口与外部 PC 机的连接必须断开。 固件文件放在 /home/firefly/Firmware 目录里,后缀名为 ".img"。 Web 端提交固件升级申请后,进度一直是 0% 这个需要检查一下 "netrecovery-master" 的日志: sudo journalctl -f -u netrecovery-master 查看是否有什么出错信息导致程序异常退出。 要重启该服务,可以运行: sudo systemctl restart netrecovery-master 升级提示 “switch to recovery failed" 设备无法切换到 Loader 模式,或者 Loader 模式下无法刷入 "netrecovery" 均会出现这种错误。 可以尝试过段时间后重试。如果都不行,只能使用 USB 线刷方式重新烧录固件 。 查看子板升级的详细日志 下面以子板 "sub1-01" 为例子,请换成实际的设备号。 # 看子板端日志 $ bmc sub1-01 shell $ cd /tmp/log $ cat history # 查看命令列表,第一个数字是进程号 $ cat *.err # 查看错误输出 # 如果子板端看不了,可以看一下主板端的运行结果: $ cd /var/netrecovery/sub1-01/state $ cat master-*.out $ cat history # 主板会将子板的日志文件下载到本地供查看 $ cat *.err # 查看错误输出 Prometheus 如何查看 Prometheus 状态 运行服务状态: sudo systemctl status prometheus 运行服务日志: sudo journalctl -u prometheus 如果查看 Prometheus 数据库大小 sudo du -hs /var/lib/prometheus/metrics2 如何调整 Prometheus 的数据库存储空间管理策略 请修改 "/etc/default/prometheus" 配置文件,当前默认的设定是: ARGS="--storage.tsdb.retention.time=7d --storage.tsdb.retention.size=4GB" 即仅保留 7 天以内、最大 4GB 的数据。 重置 Prometheus 以下操作会删除 Prometheus 所有数据并重启服务: ```shell sudo systemctl stop prometheus sudo rm -rf /var/lib/prometheus/metrics2/* sudo systemctl start prometheus ``` node_exporter 性能参数 打开的文件描述符 node_filefd_allocated "node_filefd_allocated" 表示已经分配的文件描述符的数量。这个数字越高表 明打开的文件数越多。 参考: https://www.robustperception.io/kernel-file-descriptor-metrics-from- the-node-exporter 每秒上下文切换次数 node_context_switches_total "node_context_switches_total" 表示进程上下文切换的速率。这个数越高,表 明进程数比较多而且切换频繁。 参考: https://stackoverflow.com/questions/56724508/what-is-rate-node- context-switches-total-ans-why-ratenode-context-switches-tota 3.子板(Android系统)如何用命令设置静态或动态IP? 静态IP 以sub01为例,静态IP:192.168.1.240,子网掩码:255.255.0.0,网关 :192.168.1.1,主DNS:202.96.128.86,副DNS:202.96.128.166: ```shell bmc_adb -s sub01 root bmc_adb -s sub01 remount bmc_adb -s sub01 shell "fireflyapi ethernet setIpAddress 1 192.168.1.240 255.255.0.0 192.168.1.1 202.96.128.86 202.96.128.166" ``` 动态IP 以sub01为例: ```shell bmc_adb -s sub01 root bmc_adb -s sub01 remount bmc_adb -s sub01 shell "fireflyapi ethernet setIpAddress 0" ```