1. FAQ

1.1. 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"

1.2. 2.BMC 常见问题

1.2.1. 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
      

1.2.2. 子板固件升级问题排查

1.2.2.1. 固件升级背景知识

子板固件升级系统分为两部分:

  • Web 前端负责添加固件升级申请和升级进度的显示。

  • 后端netrecovery-master 负责实际的子板固件升级和进度更新。

子板固件升级流程为:

  1. 切换子板到 Loader 模式。

  2. 对处于 Loader 模式的子板设备写入辅助升级固件并重启进入升级系统(下称 netrecovery 模式)。

  3. 对子板设置 DHCP IP 地址。

  4. 子板运行固件升级程序,通过网络下载主板上的固件,同时烧写到 eMMC 存储。

  5. 子板烧写成功,重启。

子板固件升级成功的必要条件:

  1. 确保子板能够获取 DHCP IP 地址,而且主板与子板的网络要能相通。

  2. 集群服务器的 OTG USB 口与外部 PC 机的连接必须断开。

  3. 固件文件放在 /home/firefly/Firmware 目录里,后缀名为 “.img”。

1.2.2.2. Web 端提交固件升级申请后,进度一直是 0%

这个需要检查一下 netrecovery-master 的日志:

sudo journalctl -f -u netrecovery-master

查看是否有什么出错信息导致程序异常退出。

要重启该服务,可以运行:

sudo systemctl restart netrecovery-master

1.2.2.3. 升级提示 “switch to recovery failed”

设备无法切换到 Loader 模式,或者 Loader 模式下无法刷入 netrecovery 均会出现这种错误。

可以尝试过段时间后重试。如果都不行,只能使用 USB 线刷方式重新烧录固件。

1.2.2.4. 查看子板升级的详细日志

下面以子板 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    # 查看错误输出

1.2.3. Prometheus

1.2.3.1. 如何查看 Prometheus 状态

运行服务状态:

sudo systemctl status prometheus

运行服务日志:

sudo journalctl -u prometheus

1.2.3.2. 如果查看 Prometheus 数据库大小

sudo du -hs /var/lib/prometheus/metrics2

1.2.3.3. 如何调整 Prometheus 的数据库存储空间管理策略

请修改 /etc/default/prometheus 配置文件,当前默认的设定是:

ARGS="--storage.tsdb.retention.time=7d --storage.tsdb.retention.size=4GB"

即仅保留 7 天以内、最大 4GB 的数据。

1.2.3.4. 重置 Prometheus

以下操作会删除 Prometheus 所有数据并重启服务:

```shell
sudo systemctl stop prometheus
sudo rm -rf /var/lib/prometheus/metrics2/*
sudo systemctl start prometheus
```

1.2.4. node_exporter 性能参数

1.2.4.1. 打开的文件描述符 node_filefd_allocated

node_filefd_allocated 表示已经分配的文件描述符的数量。这个数字越高表明打开的文件数越多。

参考:

1.2.4.2. 每秒上下文切换次数 node_context_switches_total

node_context_switches_total 表示进程上下文切换的速率。这个数越高,表明进程数比较多而且切换频繁。

参考:

1.3. 3.子板(Android系统)如何用命令设置静态或动态IP?

1.3.1. 静态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"
```

1.3.2. 动态IP

以sub01为例:

```shell
bmc_adb -s sub01 root
bmc_adb -s sub01 remount
bmc_adb -s sub01 shell "fireflyapi ethernet setIpAddress 0"
```