vdi-cloud/docs/overnight-box-observation-20261104.md

52 lines
4.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 盒子过夜重启与健康记录(2026-11-04)
已为盒子192.168.1.188启用`vdi-overnight-observer.service`,每60秒落盘一次心跳,并开机自启。记录始于2026-11-04 19:35左右;统计范围是启用之后,不冒充历史累计重启次数。没有重启盒子、Windows、Moonlight,也没有修改显示、输入、网络或GPU配置。
## 明早看哪里
盒子上的中文汇总:`/home/armbian/vdi-terminal/logs/overnight-summary.txt`。
详细日志:`/home/armbian/vdi-terminal/logs/overnight-health-YYYYMMDD.log`,跨午夜自动切换日期,今晚及明早两天都要看。内容为带时间和事件类型的JSON行。状态:`/home/armbian/vdi-terminal/state/overnight-state.json`。
```bash
cat ~/vdi-terminal/logs/overnight-summary.txt
systemctl status vdi-overnight-observer.service --no-pager
grep '"event": "boot_change"\|"event": "restart_assessment"' ~/vdi-terminal/logs/overnight-health-*.log
```
汇总每分钟更新启用时间、最近心跳、重启次数、当前boot ID、开机时长及最近一次重启线索判断。服务自身停止/重启不算盒子重启。
## 记录内容和原因边界
- 每分钟:真实boot ID、`/proc/uptime`、负载、可用内存、温度、剩余磁盘、网络接口状态/错误计数、Moonlight和Kiosk进程PID、串流目标/分辨率/帧率、X11桌面几何。
- 每10分钟:当前启动的内核warning/error线索,不将普通USB电源管理或watchdog能力声明直接判断为故障原因。
- 每次启动:与持久状态比较boot ID;变化时增加一次整机重启计数,保存上次最后心跳/运行时长,并按上次实际boot ID读取journal尾部、warning和`last -x`。使用单调运行时间辅助发现NTP/RTC时间跳变,不靠墙上时钟或`last`单独断定是否重启。
- 重启原因只按证据报告:发现正常关机/重启流程;发现panic/OOM等线索但因果未确认;或证据不足、原因未确认。突然断电和硬复位可能没有完整记录,不能保证区分两者,更不能从缺日志直接断定电源坏了。
- 原子替换状态/中文汇总、每次写日志执行fsync,并限制重复服务实例。日志仅记录选定进程字段,不复制凭据或连接票据。
低权限观察进程通过root拥有的固定启动辅助程序`/usr/local/libexec/vdi-observer-pstore`获取`/sys/fs/pstore`及`/var/lib/systemd/pstore`的只读、有大小上限快照。快照写到root拥有、systemd-journal组只读的`/var/lib/vdi-observer/pstore.json`;不清除原档案、不修改内核崩溃参数。现有归档仅含41字节`reboot: Restarting system`,文件时间陈旧,作为部署前基线保留,不能认定为今晚新发生的重启。
## 跨重启存储
现场`/var/log`是zram内存盘,而`/var/log/journal`是指向`/var/log.hdd/journal`的符号链接,后者位于eMMC ext4。新增`/etc/systemd/journald.conf.d/70-vdi-observer-journal.conf`,使用persistent、磁盘日志预算64MB、运行日志预算16MB、保留7天、30秒同步间隔,并已flush/sync到磁盘。
只重启了日志系统journald和本次观察服务;没有停止当前串流。journald容量限制及轮转不是“断电绝不丢最后一秒”的保证。观察日志按日保留7份,每个日期最多4个8MB分段;不会删除原Kiosk、Moonlight或其他业务日志。
## 验证和限制
11项测试覆盖:首次基线、同boot服务重启、跨boot计数及上次心跳、未知原因不误报、正常关机标记、OOM仅作为线索、旧pstore不冒充新故障、状态版本校验、连续重启/历史上限、状态与中文汇总落盘、跨日期分文件。实际验证了观察服务重启后计数仍为0、文件落盘、自动启动登记、正常显示/串流进程保持。没有为验证而真正重启盒子。
部署首次在systemd-tmpfiles处理Armbian journal符号链接时失败,未启动观察服务,也未影响串流;随后改为处理真实eMMC目标目录,部署成功。升级pstore读取仅重启本次观察服务,仍不计作整机重启。
证据:`docs/evidence/overnight-observer-20261104/`。原服务/本次配置(如存在)的备份在盒子`~/vdi-terminal/backups/overnight-observer-20261104-*`。
## 停止记录和回退
```bash
sudo systemctl disable --now vdi-overnight-observer.service
```
这只停止本次记录,已有日志和汇总保留。如需恢复journald原设置,恢复该drop-in备份或移除本次新增`70-vdi-observer-journal.conf`后重启journald;不删除已经保存的journal数据。后续不再需要时再清理本次unit/root辅助程序。
依据:[systemd journald存储设置](https://www.freedesktop.org/software/systemd/man/latest/journald.conf.html)、[journalctl按boot ID读取和flush/sync](https://www.freedesktop.org/software/systemd/man/latest/journalctl.html)。