# 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.py,MIT) └── 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" # 压测镜像 tag(build.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 ``` > ⚠️ 请在授权设备上使用,未授权扫描/测试可能违反法律法规。