Files
membank/auto-check/README.md
张威33321 a8fa159f0f chore: 同步本地更改
- 新增 aio-mcp 项目框架
- 新增 .trae/skills/ OCR/SKU 设计工具
- 更新 auto-check 配置和 stress 包
- 删除 fnhelp 文档目录
- 更新 Docker 压力测试脚本
2026-08-27 20:38:13 +08:00

205 lines
8.8 KiB
Markdown
Raw Permalink 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.
# auto-check
自动化目标扫描 + SSH 登录 + 远程压力测试工具(支持 CIDR 和 IP 范围格式)。
基于 [cobra](https://github.com/spf13/cobra) 命令行框架。
## 功能
| 子命令 | 功能 | 包 |
|--------|------|-----|
| `run` | 完整流程:发现 → SSH → 压测 | 全部 |
| `scan` | 仅扫描目标,发现存活设备 | `pkg/discovery` |
| `stress` | 对指定 IP 执行压力测试 | `pkg/stress` + `pkg/sshclient` |
## 安装
```bash
go build -o auto-check .
```
## 使用
```bash
# 查看帮助
./auto-check --help
# 仅扫描目标CIDR 格式)
./auto-check scan --cidr 192.168.1.0/24
# 仅扫描目标IP 范围格式)
./auto-check scan --cidr 192.168.1.1-192.168.1.100
# 对指定主机执行压力测试
./auto-check stress --ips 192.168.1.100,192.168.1.101 --user root --password secret --stress cpu,memory,disk
# 完整流程(扫描 → SSH → 压测)
./auto-check run --cidr 192.168.1.0/24 --user root --password secret --stress cpu,memory,disk
```
## 全局标志
| 标志 | 默认值 | 说明 |
|------|--------|------|
| `--cidr` | `192.168.1.0/24` | 目标网段或 IP 范围 (CIDR 或 起始IP-结束IP) |
| `--user` | `root` | SSH 用户名 |
| `--password` | _(空)_ | SSH 密码 |
| `--key` | _(空)_ | SSH 私钥路径 |
| `--port` | `22` | SSH 端口 |
| `--timeout` | `3s` | 超时 |
| `--concurrency` | `50` | 并发扫描数 |
| `--report` | _(自动生成)_ | 报告输出路径 |
## 子命令标志
### `run` / `stress`
| 标志 | 默认值 | 说明 |
|------|--------|------|
| `--stress` | `cpu,memory` | 压测类型: `cpu`, `memory`, `disk`, `memnative`, `fnstable`, `full` |
| `--duration` | `30s` | 持续时间 |
| `--threads` | `4` | 线程数 |
| `--ips` | _(必填,仅stress)_ | 目标 IP (逗号分隔) |
## 压力测试类型
| 类型 | 工具 | 说明 |
|------|------|------|
| `cpu` | stress-ng | CPU 全方法压测 |
| `memory` | stress-ng | 内存压测 |
| `disk` | stress-ng | 磁盘IO混合压测 |
| `memnative` | stressapptest | 内存稳定性精压(数据完整性校验) |
| `fnstable` | fnscript | 稳定性门禁:社区脚本 self_inspection.py 先行检测硬件stress CPU + memtester 内存校验),通过后自有压测再跑;未通过则自有压测全部跳过 |
| `full` | stress-ng | CPU+内存+磁盘 三合一综合压测 |
## 稳定性门禁fnstable
基于飞牛社区 [fnscript](https://gitee.com/xiao-zhu245/fnscript)MIT`self_inspection.py`vendor 原样收录在 `docker/stress-test/vendor/fnscript/`,源码不做修改:
1. 门禁先跑社区脚本CPU 稳定性(`stress`+ 内存数据校验(`memtester` 可用内存 97% 单遍30-120 分钟)
2. 门禁通过 → 自有压测工具stress-ng/fio 等)再跑一遍,按自有格式出报告
3. 门禁失败 → 自有压测全部 skip报告仍完整输出硬件已有问题无需再跑
适配说明(不改社区脚本源码的代价,已在适配层 `scripts/fnstable.sh` 规避):
- 脚本 CLI 模式无论成败 exit code 均为 0结果按 stdout 关键词("未发现问题")判定
- `--memory` 有 y/n 交互确认,用 `printf 'y\ny\n'` 管道喂入
- 依赖python3/psutil/memtester/stress/sudo预装在压测镜像中
配置(`auto-check.yaml``stress.fn_memory` 控制门禁是否执行 memtester 内存校验(默认 true快速验证可设 false
## 压测执行方式Docker 容器)
压测统一在 Docker 容器中执行:工具与测试脚本预装在镜像里,无需在目标机在线安装,环境一致性好(飞牛 NAS 默认已安装 Docker
### 架构设计
```
auto-check/
├── docker/ # Docker 镜像维护目录(独立)
│ └── stress-test/
│ ├── Dockerfile # 镜像定义
│ ├── build.sh # 构建 + 导出 + 同步配置(时间戳 tag
│ ├── scripts/ # 测试脚本(打包进镜像)
│ │ ├── run.sh # 入口脚本(环境变量驱动 + 门禁调度)
│ │ ├── fnstable.sh # 稳定性门禁适配器fnscript 社区脚本 → 结构化协议)
│ │ ├── cpu.sh # CPU 压测
│ │ ├── memory.sh # 内存压测
│ │ ├── disk.sh # 磁盘压测
│ │ └── ...
│ └── vendor/fnscript/ # 社区脚本原样收录self_inspection.pyMIT
└── pkg/stress/
└── runner.go # 核心逻辑:送镜像 + 驱动容器测试
```
### 工作流程
1. 检测目标机 Docker 可用性(不可用则判失败)
2. 检查镜像是否存在(不存在则上传工程目录中的镜像 tar 并 `docker load`,不依赖 registry
3. 启动容器执行测试(脚本在镜像内,环境变量传参)
4. 解析容器输出 → 生成报告
### 容器内执行流程run.sh
1. 系统信息(`===SYSTEM_INFO===`
2. 温度监控后台采样(`temp_start.sh`
3. 稳定性门禁(`fnstable.sh`types 含 `fnstable`fnscript 社区脚本先行检测硬件稳定性,未通过则后续自有压测全部 skip
4. 各项压测先单项cpu/memory/disk/memnative、综合full最后
5. 温度监控收尾(`===MONITOR:temp===`
6. 内核日志(`===MONITOR:dmesg===``-T` 带时间戳)+ 结束标记
### 配置方式(在 `auto-check.yaml` 中)
```yaml
stress:
docker_image: "stress-test:20260824-153045" # 压测镜像 tagbuild.sh 自动维护)
docker_tar: "docker/stress-test/stress-test.tar" # 本地镜像文件,目标机无镜像时自动上传并 load
docker_args: "--network=host --privileged"
```
### 容器运行时环境变量
| 变量 | 说明 | 默认值 |
|------|------|--------|
| `AUTOCHECK_TYPES` | 测试类型(逗号分隔) | `cpu,memory` |
| `AUTOCHECK_DURATION` | 持续时间(秒) | `30` |
| `AUTOCHECK_THREADS` | 线程数 | `4` |
| `AUTOCHECK_MEM_SIZE_MB` | 内存压测大小 | `0` (自动) |
| `AUTOCHECK_DISK_SIZE_MB` | 磁盘压测大小 | `1024` |
| `AUTOCHECK_DISK_DIR` | 磁盘压测目录 | `/tmp` |
| `AUTOCHECK_TEMP_INTERVAL` | 温度采样间隔 | `10` |
| `AUTOCHECK_SAMPLE_INTERVAL` | 运行时采样间隔 | `2` |
| `AUTOCHECK_FN_MEMORY` | fnstable 门禁是否执行 memtester 内存校验 | `1` |
### 容器运行时挂载(由 auto-check 自动添加)
| 挂载 | 作用 |
|------|------|
| `-v /sys:/sys:ro` | 容器内是独立 sysfs挂载后才能读到宿主机硬件传感器温度采集依赖此项 |
| `-v /etc/localtime:/etc/localtime:ro` | 容器时区与宿主机一致dmesg 时间戳与采样时间才准确 |
> 注意:镜像内已设置 `LC_ALL=C.UTF-8`。若 locale 为纯 C`sensors` 会输出 "+51.0 C"(无 ° 符号),导致温度正则失配、采集不到数据。
### 构建镜像(维护时使用)
固定分发模式:不依赖 registry镜像以 tar 文件形式放在工程目录。推荐用 `build.sh`(自动时间戳 tag
```bash
cd docker/stress-test
./build.sh # 自动取当前时间戳YYYYMMDD-HHMMSS
./build.sh 20260824-153045 # 手动指定时间戳(重打/复现)
```
`build.sh` 会同时完成:
1. 用时间戳 tag 构建镜像(不保留 `latest``docker images` 可区分每次构建)
2. 导出两份 tar带时间戳归档 `stress-test-<时间戳>.tar` + 同步覆盖 `stress-test.tar`auto-check 默认引用)
3. 自动更新 `auto-check.yaml``docker_image` 字段,确保配置与新 tag 同步
手动构建(不推荐)需自行同步 `auto-check.yaml``docker_image`;旧时间戳镜像可 `docker rmi stress-test:<旧时间戳>` 清理。
### 镜像内预装工具
| 工具 | 用途 |
|------|------|
| `stress-ng` | CPU/内存/磁盘压测 |
| `fio` | 磁盘 IO 测试 |
| `lm-sensors` | 温度监控 |
| `sysstat` | 系统性能统计 |
| `procps` | 进程监控 |
| `python3` + `psutil` | fnscript 稳定性门禁运行环境 |
| `memtester` | fnstable 门禁内存数据校验 |
| `stress` | fnstable 门禁 CPU 压测 |
| `sudo` | fnscript 脚本内部调用 `sudo memtester`(容器以 root 运行,无密码) |
## 项目结构
```
auto-check/
├── main.go
├── cmd/
│ └── root.go # 所有子命令
├── pkg/
│ ├── discovery/ # 设备发现
│ ├── sshclient/ # SSH 客户端
│ ├── stress/ # 压力测试Docker 容器驱动)
│ │ ├── types.go # 类型定义
│ │ ├── tools.go # Docker 环境检测
│ │ ├── metrics.go # 指标定义 + 配置
│ │ └── runner.go # 调度器(送镜像 + 驱动容器)
│ └── report/ # 报告模块
├── go.mod
└── README.md
```
> ⚠️ 请在授权设备上使用,未授权扫描/测试可能违反法律法规。