# GPU 机「开机自动满屏系统资源监控面板」部署报告

- **日期**：2026-09-27（GPU 机本地时间 2026-09-26 UTC，见下文「坑 6」）
- **目标机器**：GPU 机 `zywpc` = **192.168.31.31**（Ubuntu 24.04.3，RTX 5060 Ti 16GB，HDMI 接了显示器）
- **需求**：Ubuntu 开机后**不登录、不敲命令**，直接进入一个满屏界面，实时展示 CPU/内存/负载、GPU 利用率/显存/温度、磁盘、网络、本机服务端口存活。
- **结论**：已部署并**不重启验证通过**。开机 → `tty1` 免密自动登录 → tmux 会话 `sysmon` → 顶部 8 行状态栏 + 下方 btop（带 GPU 框）+ 第二窗口 nvtop。

## 一、最终形态（实机截图）

截图是用 `/dev/fb0` 直接抓的控制台真帧缓冲（2560×1440），不是模拟图。

**总览窗口（默认）**：顶部状态栏 + btop
![总览](screenshots/2026-09-27-panel-overview.png)

**GPU 窗口（面板内按 `Ctrl-b n` 切换）**：nvtop
![GPU](screenshots/2026-09-27-panel-nvtop.png)

状态栏 8 行内容：

| 行 | 内容 |
|---|---|
| 1 | 标题 · 主机名 · 局域网 IP · 当前时间（可配时区） |
| 2 | 分隔线 |
| 3 | 开机时长 · 1/5/15 分钟负载 · 内存占用 · 根分区占用与剩余 |
| 4 | **GPU**：型号 · 利用率 · 显存 used/total · 温度 · 功耗 · 风扇转速 |
| 5 | **SVC**：端口探活，`*绿色`=在听，`x 灰色`=没听 |
| 6 | **UNIT**：列出的 systemd 单元里处于 active 的（没有则 `none active`） |
| 7 | 快捷键提示 |

下方 btop 提供：每核 CPU 曲线与频率温度、内存/缓存、磁盘 IO 与空间、网络上下行、进程列表（含每进程 CPU/内存）、**GPU 框（`gpu-totals`，NVML 直读）**。

## 二、一键部署 / 回滚

```bash
# 部署（在 GPU 机）
scp scripts/* zyw@192.168.31.31:/tmp/gpu-sysmon/
ssh zyw@192.168.31.31 'printf "yueling408\n" | sudo -S -p "" bash /tmp/gpu-sysmon/install.sh'

# 回滚（恢复 tty1 登录提示符，移除面板脚本；btop/nvtop 保留）
ssh zyw@192.168.31.31 'printf "yueling408\n" | sudo -S -p "" bash /tmp/gpu-sysmon/uninstall.sh'
```

`install.sh` 做的五件事：装 nvtop/tmux/编译链 → 源码编译 **带 GPU 支持的 btop 1.4.7** → 装面板脚本与 `/etc/sysmon.conf` → 配 `tty1` 免密自动登录 → 在 `~/.bash_profile` 追加「仅 tty1、非 SSH 时启动面板」的启动块。

## 三、日常操作

| 操作 | 方式 |
|---|---|
| 切到 GPU 窗口 | 面板内 `Ctrl-b n`（再按 `Ctrl-b p` 或 `Ctrl-b 0/1` 切回） |
| 临时退出面板、回到 shell | `Ctrl-b d`（脱离 tmux，停在 tty1 的 shell 提示符） |
| 再进面板 | 敲 `sysmon` |
| 永久停用自动进入 | `sysmon-disable`（下次登录是普通 shell）；恢复 `sysmon-enable` |
| 关掉当前面板进程 | `tmux kill-session -t sysmon` |
| 手动立刻看面板（不改开机行为） | `sysmon`、或直接 `btop` / `nvtop` |
| 从别的机器看 | 面板只在本机控制台；要远程看用 `ssh zyw@192.168.31.31 -t 'tmux attach -t sysmon'` |

## 四、定制（改 `/etc/sysmon.conf`，**保存后 ≤5s 自动生效，不用重启面板**）

```bash
PORTS="ComfyUI:8189 LLM:8080 LMStudio:1234 H3-UI:3013 H3-API:6020"   # 标签:端口
UNITS="llama-bucoid-heretic llama-ridge lmstudio"                     # 只显示 active 的
TITLE="SYS MONITOR"
PANEL_TZ="Asia/Shanghai"      # 面板显示时区（只影响面板，不改系统）
#SYSMON_REFRESH=5             # 刷新间隔秒
```

新增服务只要把 `名字:端口` 加进 `PORTS`，例如 `SillyTavern:8000`、`下载中心:8899`。

**想让字更大**：控制台默认 8×16 字体在 2560×1440 下是 320×89 字符，看着偏小。可改
`/etc/default/console-setup` 的 `FONTSIZE`（该机现有字体里没有 `Fixed16x32`，可先
`ls /usr/share/consolefonts` 挑一个大字号 BDF/PSF，例如 `Terminus32x16` 一类）后
`sudo setupcon`。改完面板会自动按新宽度重排（状态栏宽度是动态取的）。

## 五、踩过的坑（复现/排错必看）

1. **apt 里的 btop 没有 GPU**：Ubuntu 24.04 仓库是 `btop 1.3.0`，GPU 监控是 1.4.0 才有的功能。
2. **官方预编译静态包也是空的**：`btop-x86_64-unknown-linux-musl.tar.gz` 的 `--version` 明确写着
   `Configured with: make STATIC=true GPU_SUPPORT=false` —— **官方静态包的显卡框是编译期关掉的**。
   必须自己编：`make GPU_SUPPORT=true NVML_INCLUDE=/usr/local/cuda/include`。
3. **btop 1.4.x 用 C++23 `std::ranges::to`，Ubuntu 24.04 自带 g++ 13 编不过**
   （报 `‘to’ is not a member of ‘std::ranges’`）→ 装 `g++-14` 并 `make CXX=g++-14`（16 核约 25 秒）。
   另外 1.4.7 的发布资产名已从 `btop-x86_64-linux-musl.tbz` 改成
   `btop-x86_64-unknown-linux-musl.tar.gz`（旧名 404）。
4. **用 root 编过一次源码后，再用普通用户编会 `Permission denied`**（`obj/` 属主是 root）→ 重编前 `sudo rm -rf 源码目录`。
5. **tmux 的 pane 序号是「位置序」不是创建序**：先建 btop、再 `split -b` 在上方插状态栏，
   结果 **pane0=顶部状态栏、pane1=btop**（不是 0=btop）。搞反会让焦点落在状态栏上。
6. **窗口真实尺寸只有客户端附着后才有**：`split -l 8` 在 80×24 的默认窗口上算比例，附着到
   320×89 的控制台后被拉伸成 41 行。解决：附着后用
   `( sleep 3; tmux resize-pane -t sysmon:OVERVIEW.0 -y 8 ) &` 校正，并加
   `client-resized` hook 在每次分辨率变化后重新钉成 8 行。
7. **GPU 机系统时区是 `Etc/UTC`**（`/etc/localtime → zoneinfo/Etc/UTC`），比北京时间晚 8 小时。
   面板用 `PANEL_TZ="Asia/Shanghai"` 只覆盖显示；**没有**改系统时区（那会动到既有日志/服务时间戳）。
   若要系统级修：`sudo timedatectl set-timezone Asia/Shanghai`（自行评估日志影响）。
8. **Linux 控制台没有中日韩字体**：面板文案里写中文会显示成方块，所以状态栏一律用英文；
   `LANG=en_US.UTF-8` 已保证 btop 的框线字符正常。
9. **抓控制台截图必须去掉 alpha 通道**：`nvidia-drmdrmfb` 的 32bpp 帧缓冲 alpha 字节基本是 `0x01`，
   直接按 `bgra` 转 PNG 会得到一张「全透明」图，看图器/预览里**看起来是一片白**。
   正确做法：`ffmpeg -f rawvideo -pixel_format bgra -video_size 2560x1440 -i fb.raw -pix_fmt rgb24 out.png`。
10. **控制台不熄屏**：本机 `consoleblank` 已为 `0`（无需改 GRUB）；面板启动时还会执行
    `setterm -blank 0 -powerdown 0` 兜底。

## 六、怎么在「不重启」的前提下验证开机行为

链路是 `getty@tty1（免密）→ .bash_profile → sysmon.sh → tmux`，所以只要重启 getty 单元就能完整验证，
不必重启机器（该机当时正跑着 ComfyUI，重启会打断任务）：

```bash
tmux kill-session -t sysmon
sudo systemctl restart getty@tty1
sleep 15
who                                    # 应出现 zyw  tty1
tmux ls                                # 应出现 sysmon: 2 windows (attached)
tmux list-panes -t sysmon:OVERVIEW -F "pane#{pane_index} #{pane_width}x#{pane_height}"
tmux capture-pane -p -t sysmon:OVERVIEW.0 | head -9     # 状态栏内容
tmux capture-pane -p -t sysmon:OVERVIEW.1 | grep -o gpu-totals   # btop GPU 框是否激活
```

`getty@tty1` 出厂即 enable，开机自启由 systemd 保证；加上上面链路实测通过，等价于开机验证。

## 七、本次实测数据（2026-09-27 04:18 北京时间）

```
SYS MONITOR  zywpc  192.168.31.31                                   2026-09-27 04:18:13
======================================================================================
up 43 minutes  |  load 2.75 4.41 4.30  |  mem 5.8/31.1 GiB (19%)  |  disk / 93% used, 84G free
GPU  NVIDIA GeForce RTX 5060 Ti  util 100%  VRAM 15470/16311 MiB  79C  151.34W  fan 71%
SVC  *ComfyUI:8189 xLLM:8080 xLMStudio:1234 xH3-UI:3013 xH3-API:6020
UNIT none active
keys  Ctrl-b n = GPU(nvtop)   Ctrl-b d = detach to shell   Ctrl-b o = switch pane   q = quit btop
```

- btop：**1.4.7+6e39144**，`Compiled with: g++-14`，`libnvidia-ml` 符号在位，面板内渲染出 `gpu-totals`
- nvtop：3.0.2，GPU 窗口显示 79°C / 152W / 15.54 GiB 显存，并列出 `python ... --port 8189`（ComfyUI）占 15444MiB、95% GPU
- 控制台：2560×1440 → 320×89 字符；状态栏 320×8、btop 320×80
- 布局校验：`Ctrl-b n` 切 GPU 窗口、`Ctrl-b d` 脱离回 shell、`sysmon` 重新进入 —— 均实测通过

## 八、文件清单

| 位置 | 说明 |
|---|---|
| `/usr/local/bin/sysmon.sh` | 面板启动器（建 tmux 会话/窗格、尺寸校正、快捷键栏） |
| `/usr/local/bin/sysmon-status.sh` | 顶部 8 行状态栏（每轮重读配置、GPU 走 `nvidia-smi`） |
| `/etc/sysmon.conf` | 端口表 / 单元表 / 标题 / 时区 / 刷新间隔 |
| `/usr/local/bin/sysmon` | `sysmon.sh` 的软链，手动进入面板 |
| `/usr/local/bin/sysmon-enable` / `sysmon-disable` | 开关「登录自动进面板」（`~/.sysmon-off` 标记） |
| `/etc/systemd/system/getty@tty1.service.d/autologin.conf` | tty1 免密自动登录 |
| `/home/zyw/.bash_profile` | 追加的启动块（带 `SSH_CONNECTION` 与 `tty1` 双保险，不影响 SSH 登录） |
| `/opt/btop/` | 源码编译的 btop 1.4.7（含 GPU 支持），`/usr/local/bin/btop` 指向它 |
| 本目录 `scripts/` | 上述部署脚本原件（install / uninstall / sysmon / sysmon-status / sysmon.conf） |
| 本目录 `面板文本快照.txt` | 状态栏文本快照 |

## 九、安全与影响面

- 自动登录**仅限本机物理控制台 `tty1`**；SSH 登录路径不受影响（启动块里有 `SSH_CONNECTION` 判断）。
- 其它 TTY（`Ctrl+Alt+F2`…）仍是正常登录提示符，可随时绕过面板。
- 面板进程跑在 zyw 名下，不改动任何既有服务（ComfyUI / llama.cpp / LM Studio 均未受影响）。
- 网络侧没有新增监听端口，不引入远程攻击面。
