NAS 里的 AI 牛马 · 完整部署方案
> AI 牛马,随叫随到。
把一台闲置的群晖 NAS 变成一台 7×24 小时在线的 AI 工作台:
手机在任何网络下派活、查进度、收结果,不需要任何电脑开机,断电重启后自动恢复。
> 授权范围与使用声明见文末「八、授权与使用声明」。
> 免费精简版见同名 synology-vmm-linux-host(仅含方法论,不含脚本与清单)。
零、怎么用我(先看这一节)
> 如果你只读一节,就读这一节。
> 下面直接用大白话说明:什么情况下该找我、你可以怎么说、以及什么情况下别找我。
0.1 你可以直接这样说
把下面任意一句发给你的 AI 助手(或直接在这个 Skill 的对话里说),我就会启动:
| # | 你可以这样说 | 我会做什么 |
|---|---|---|
| 1 | 「我有一台群晖,怎么让它 24 小时跑 AI?」 | 从头讲清整条路线,并帮你判断机器够不够格 |
| 2 | 「怎么让手机随时给我家里的电脑派活?」 | 讲清"一个宿主 + 多个遥控器"架构,给方案 |
| 3 | 「NAS 上怎么装一个需要图形界面的程序?」 | 直接给虚拟机路线 + 全部参数表 |
| 4 | 「我电脑一关机,手机里的 AI 就断了,怎么办?」 | 这就是本方案要解决的问题,给完整部署步骤 |
| 5 | 「群晖 Virtual Machine Manager 怎么用?」 | 从装 VMM 到建虚拟机的逐步指引 |
| 6 | 「Ubuntu 装在 NAS 上,断电后怎么能自己起来?」 | 三层自启链 + 断电验收方法 |
| 7 | 「我的 NAS 跑 AI 特别慢,是坏了吗?」 | 用性能四步判读法定位,告诉你是故障还是硬件天花板 |
| 8 | 「Docker 装不上,报 cgroup 错误」 | 讲清群晖 cgroup 的坑,并告诉你该不该转虚拟机 |
> 不用记这些句子 —— 意思到了就行。
> 上面这些是示例,不是必须逐字匹配的口令。
0.2 这些说法也会触发我
| 关键词 / 说法 | 说明 |
|---|---|
NAS 常驻 / AI 牛马 / 随叫随到 |
本方案的名字 |
不关机的 AI / 24 小时在线 |
核心诉求 |
群晖跑桌面版程序 / Electron 应用装不进 Docker |
典型技术场景 |
手机远程派活 / 出门在外发任务 |
使用场景 |
把闲置 NAS 用起来 |
动机场景 |
VMM 虚拟机 / 虚拟机断电自恢复 |
技术路径 |
0.3 ❌ 什么情况下别找我
| 你的需求 | 该用什么 | 为什么 |
|---|---|---|
| 纯命令行服务(下载器 / 影音库 / 数据库 / 机器人) | Container Manager(Docker) | 我反而推荐你用容器 —— 更省资源、有大量成熟镜像,上虚拟机是浪费。详见 assets/case-no-docker.md |
| 树莓派 / ARM 小主机 / 软路由 | 不适用 | 本方案依赖群晖 VMM,ARM 机型多数不支持 |
| Windows / Linux 服务器上常驻 | 不适用 | 那些平台不需要虚拟机这一层,直接装就行 |
| 帮写一个 Python / Shell 脚本 | 普通编码任务 | 与部署无关,不必调用本 Skill |
| 想让 AI 跑得和台式机一样快 | 换硬件 | 这是物理差距,软件优化找不回来。见 08-performance.md |
| 没有群晖 NAS | —— | 本方案的前提就是"已有一台闲置群晖" |
> 一句话边界:
> 要跑「必须有图形界面的桌面程序」→ 找我。
> 要跑「纯命令行 / 有网页界面的服务」→ 用 Docker,别上虚拟机。
0.4 最快的上手路径(三步)
① 想先看看是什么感觉 → 读 references/09-walkthrough.md(一篇真实部署实录)
② 确认自己的机器能不能做 → 读「二、硬性前置条件」+ 跑 scripts/nas-preflight.sh
③ 决定做了 → 按 references/00 → 06 顺序执行
> 想知道自己的群晖型号支不支持? → 直接看 §2.1 的型号对照表。
> 在犹豫用虚拟机还是 Docker? → 看 assets/case-no-docker.md(能省一整晚)。
一、这个方案解决什么问题
1.1 三个真实的痛点
| 痛点 | 具体表现 |
|---|---|
| 干活的那台必须开着 | 任务实际跑在桌面版 AI 客户端上,手机只是「遥控器」。电脑一关机,手机就断档 |
| 平台间搬运 | 官方客户端、手机云端、网页端各自保留独立的任务与数据,设备之间没有同步通道,只能人工复制粘贴 |
| PC 不能长期开 | 功耗、噪音、寿命 —— 让台式机 24 小时开着只为跑任务,代价太高 |
1.2 本方案的思路
NAS 天生就是为 7×24 运行设计的:低功耗、被动散热、系统稳定、断电容错。
它本来就该一直开着,只是我们让它闲着太久了。
于是:用群晖自带的 Virtual Machine Manager 建一台 Ubuntu 虚拟机,
在里面跑官方 Linux 版 AI 桌面客户端 —— 于是 NAS 变成一台永远在线的 AI 牛马。
1.3 为什么用虚拟机,而不是 Docker
这是本方案第一个关键决策,走错路会浪费一整晚:
| Docker 容器 | ★ VMM 虚拟机(本方案) | |
|---|---|---|
| 图形界面 | 需自行拼装 Xvfb + VNC + 一整套 GUI 依赖 | 天然自带图形控制台 |
| 首次登录 / 扫码配对 / 点开关 | 这些必须在图形界面完成的操作极难调试 | 直接在控制台点选即可 |
| 公开先例 | 桌面版客户端通常不为无头环境打包,几乎无参考 | 标准系统镜像,问题可预期 |
| 出问题 | 容器重建即丢全部调试成果 | 随时删掉虚拟机重建,不影响 NAS 主系统 |
| 资源开销 | 更省(约 1.5GB) | 多 2~3GB,换来确定性 |
| 适用场景 | 纯命令行服务 | ★ 需要图形界面的常驻应用 |
结论:目标是"必须有图形界面的桌面程序"→ 用虚拟机;目标是"纯命令行服务"→ 用容器。
> ★ 这不是理论推演,是在同一台 DS918+ 上实测失败后得出的结论。
> Docker 路线具体死在哪一步、报错信息为什么把人引向错误方向,
> 完整记录见 assets/case-no-docker.md —— 动手前建议先读,能省一整晚。
二、硬性前置条件(不满足则无法完成)
2.1 ★ 你的群晖型号支持吗(先看这张表)
判断标准只有两条:① 是 x86_64 架构;② CPU 支持硬件虚拟化(Intel VT-x / AMD-V)。
| 系列 | 代表机型 | 能做吗 | 说明 |
|---|---|---|---|
| Plus 系列(x86,主流推荐) | DS918+ / DS920+ / DS923+ / DS1019+ / DS1520+ / DS1522+ / DS1621+ / DS1821+ | ✅ 可以 | VMM 支持列表内的主力机群;内存通常可扩到 8GB+ |
| 新款 Plus(x86) | DS224+ / DS423+ / DS923+ / DS1522+ | ✅ 可以 | 较新机型,VMM 均支持 |
| 部分 Value 系列(x86) | DS220+ / DS720+ / DS420+ | ✅ 可以 | 同为 x86,但内存上限较低(多需自己扩内存) |
| j 系列(Intel Celeron) | DS220j / DS420j / DS120j | ⚠️ 多数不可行 | 部分机型 VMM 不支持,且内存多为 512MB~1GB,即使支持也跑不动 |
| Play 系列(ARM) | DS218play / DS418play | ❌ 不行 | ARM 架构,VMM 不支持 |
| 纯 ARM 机型 | DS223 / DS223j / DS124 / DS423 | ❌ 不行 | 同上 |
| 机架式 / 企业级 | RS 系列、FS 系列 | ⚠️ 以官方为准 | 多数支持,但请查官方 VMM 兼容列表 |
| 全闪 NAS | FS 系列等 | ⚠️ 以官方为准 | 同上 |
> ⚠️ 这张表是经验归纳,不是官方兼容列表 —— 群晖机型繁多,
> 最终请以群晖官方「Virtual Machine Manager 支持机型」页面为准。
> 不确定时,最快的验证方法是:跑一次 scripts/nas-preflight.sh,
> 看有没有输出 vmx(Intel)或 svm(AMD)标志 —— 有标志 = 有戏。
> ★ 本方案已在 DS918+ 上完整实测通过(DSM 7.3.2 / 12GB,含断电重启验收)。
2.2 硬性条件(不满足则无法完成)
| 项 | 要求 | 说明 |
|---|---|---|
| 群晖机型 | 见 §2.1,x86_64 且 CPU 支持 VT-x / AMD-V | ARM 机型多数不支持 VMM |
| CPU 虚拟化 | Intel VT-x / AMD-V | 2015 年后的 Intel 机型普遍支持 |
| DSM | 7.0 及以上 | 需要 VMM 套件 |
| 内存 | ≥ 8GB(建议 12GB);须给虚拟机 ≥ 4GB | 内存不足会导致换页,是最常见的性能杀手 |
| 存储 | 空间充裕的卷,可用 ≥ 60GB | 虚拟机磁盘 40GB + 系统余量;别默认放已用 80% 的卷 |
| 网络 | 虚拟机可桥接到局域网,拿到同网段 IP | 否则手机 / PC 连不上 |
| 账号 | 一个官方 AI 客户端的账号 | 需自行注册,本方案不含账号与额度 |
| 操作能力 | 会用 SSH + 基础 Linux 命令 | 全流程提供图形界面路径与脚本,SSH 用得不多但绕不开 |
> ⚠️ 必须提前说明的边界:本方案交付的是部署方法与配套工具,
> 不含任何账号、API Key、License、云服务费用。
2.3 ★ 客户端版本要求(重要)
| 项 | 说明 |
|---|---|
| 实测版本 | 本方案在客户端 5.5.6 上完整验证通过(/opt/WorkBuddy,启动命令 workbuddy) |
| 有没有最低版本要求 | 有,但官方未公开具体数字 —— 建议用当前最新版,两端版本差异可能影响手机端的流式连接 |
| 版本迭代的风险 | ⚠️ 该客户端更新频繁(下载地址、包名、内部结构都可能变)。半年后本文档的下载链接可能失效 |
| 版本变了怎么办 | ★ 不影响本方案的主体 —— 本包约 80% 的内容(虚拟化参数、系统安装、依赖库、自启链、断电验收、性能判读)与具体应用无关。换版本时只需替换 4 处(下载地址 / 包名关键词 / 启动命令 / 首次配置方式),完整方法见 references/04-app-install.md §4.0 |
| 怎么拿最新版地址 | 查官方更新接口(见 04-app-install.md §4.1),或直接去官网「Linux 下载」页 |
> 一句话:版本会过时,方法不会。
> 本文档把"跟具体版本强绑定的部分"压缩到了 4 个变量,其余全是通用的工程方法。
三、目标架构
┌──────────────────────────────────┐
手机 APP ──────▶│ │
(遥控器) │ 群晖 NAS │
│ ├─ DSM │
微信小程序 ──────▶│ └─ Virtual Machine Manager │
(遥控器) │ └─ 虚拟机 host │
│ └─ Ubuntu 22.04 │
│ └─ AI 桌面客户端 │ ← AI 牛马
│ (自动登录) │
└──────────────────────────────────┘
↑ 断电重启后自动恢复
核心认知(决定了能不能做到"随叫随到"):
> 官方架构是「一个宿主 + 多个遥控器」(宿主 = 那台真正干活的机器,
> 遥控器 = 手机这类只发指令的端),各台干活的机器之间没有同步通道。
> 所以"多端共享同一批任务"的唯一解法就是只保留一台常开的机器。
3.1 部署完成后的实际效果(实测)
手机端「选择设备」列表的实际形态(实测截图,设备名已做遮盖处理):
┌──────────────────────────────┐
│ 选择设备 ai-host│ ← 顶部标题 = 当前任务跑在 NAS 上
├──────────────────────────────┤
│ 云端 │
│ DESKTOP-xxx (在线) │
│ ai-host (在线)✓ │ ← NAS 已被手机发现、连通并选中
└──────────────────────────────┘
这个画面是本方案的核心价值证明:
- 这台 NAS(设备名已遮盖)出现在设备列表里 → 官方 Linux 版确实能被手机识别并配对(具备完整的「宿主」能力)
(官方公开文档里写明能被配对的系统只有 macOS / Windows,Linux 从未被承诺 —— 属实测突破) - 与
云端、DESKTOP-xxx并列 → 一个账号可同时管理多个落点,切换即用 - ★ 「命令行 + 网页版」路线给不出这个画面 —— 那种形态不是「宿主」(不是那台真正干活的机器),
手机设备列表里根本不会有它,只能开浏览器访问
> ⚠️ 实拍截图已对设备名做纯色遮盖(存于项目的小红书配图资料,不在本包内 ——
> 上传平台仅接受文本类文件)。如需在别处引用,请沿用遮盖版;
> 替换素材时同样要求:设备名、IP 地址、账号名一律用纯色方块覆盖
> (勿用马赛克,马赛克可被部分还原)。
四、执行流程(按顺序读 references/)
| 步骤 | 文档 | 产出 | 关键判定点 |
|---|---|---|---|
| ★ 预 | references/09-walkthrough.md |
建立全局感 | 通读一遍,知道"真做起来什么样" |
| 0 | references/00-preflight.md |
环境体检报告 | 内存 / 存储 / 共享文件夹 / VMM 四项通过 |
| 1 | references/01-vmm-setup.md |
VMM 装好、虚拟机建好、开始引导 | 网络桥接成功(拿到同网段 IP) |
| 2 | references/02-ubuntu-install.md |
系统装好、进入桌面 | 选「自动登录」(无人值守命门) |
| 3 | references/03-system-init.md |
换国内源、装 SSH、关休眠 | openssh-server 为 active |
| 4 | references/04-app-install.md |
AI 客户端装好并登录成功 | 窗口正常渲染 + 账号已登录 |
| 5 | references/05-unattended.md |
三层自启链配好 | ★ 断 NAS 电源重启后自动恢复 |
| 6 | references/06-verify.md |
全项验收 | 手机端出现设备 + 能派活 |
| 7 | references/07-troubleshooting.md |
故障速查 + 软故障排查路径 + 3 个排障实录 | 有报错查 7.1;没报错查 7.4;看别人怎么定位查 7.5 |
| 8 | references/08-performance.md |
性能判读 | vmstat 三列定性瓶颈 |
> 三种读法:
> - 首次部署 → 先读 09-walkthrough.md 建立全局感,再按 00→06 执行
> - 卡住了 → 直接跳 07-troubleshooting.md(先看 7.1 速查表,没报错就看 7.4 软故障,再看 7.5 排障实录)
> - 在犹豫路线 → 先读 assets/case-no-docker.md
配套文件:
| 目录 | 内容 |
|---|---|
scripts/ |
nas-preflight.sh(NAS 只读体检,支持 --report 出报告)、vm-init.sh(系统初始化)、install-app.sh(装客户端)、perf-diagnose.sh(性能判读)、verify.sh(验收)、bump-version.sh(版本号同步) |
assets/ |
params-quickref.md(参数速查卡)、deploy-checklist.md(部署检查清单)、known-limits.md(已知限制)、buyer-faq.md(常见问题)、★ case-no-docker.md(Docker 路线实测失败案例) |
五、关键设计决策(为什么这么做)
5.1 虚拟机参数:照抄这张表
| 向导项 | 选什么 | 为什么 |
|---|---|---|
| 机器类型 | PC(默认) | 传统芯片组 + Legacy BIOS,对 Linux 镜像兼容性最好。另一个选项通常要配 UEFI,没必要引入变数 |
| 优先级 | 标准(默认) | 只有一台虚拟机时设高也不会更快,瓶颈在绝对算力 |
| CPU 核心 | NAS 核数 × 3/4 | 例:4 核 → 给 3 核,留 1 核给 DSM |
| 内存 | NAS 总内存 × 50% | 例:12GB → 6144MB。内存不足 → 换页 → 性能断崖 |
| 虚拟硬盘 | 40 GB(精简置备) | 系统约 15GB,留余量 |
| 网络 | 默认网络 或 桥接 + 物理网卡 | ★ 必须拿到同网段独立 IP |
| 网卡型号 | virtio(默认) | 内核自带驱动、性能最好 |
| 显卡 | vmvga(默认) | 对 Linux 图形界面支持最好;花屏再换 vga |
| 固件 | Legacy BIOS | 与「机器类型 PC」配套 |
| 自动启动 | ★ 必须启用 | NAS 重启后它能自己活过来的唯一保障 |
| 同步时间 | 是 | 避免证书 / 登录态异常 |
| 启动 ISO | 挂上系统 ISO | 装完必须卸掉,否则重启又回安装菜单 |
| SR-IOV | 否 | 万兆网卡硬件直通用,家用用不上 |
> 黑屏 + 闪烁光标:先等 10~20 秒(引导需要时间);仍黑屏则关机 → 编辑 →
> 确认「启动 ISO 文件」不是「已卸载」。看虚拟机画面必须点「连接」开控制台窗口。
5.2 系统安装:五处必须拿主意
| 屏幕 | 选什么 | 原因 |
|---|---|---|
| 语言 | English | 中文会触发下载语言包,慢且易超时 |
| 安装时下载更新 | ⬜ 取消勾选 | 连的是国外源,国内会卡几十分钟甚至超时 |
| 安装类型 | Erase disk and install | 只能看到虚拟盘,碰不到 NAS 数据 |
| 用户名 | 全小写、越短越好(如 ai) |
后面每条命令都要用 |
| ★ 登录方式 | Log in automatically | 停在登录界面 = 它永远不会启动 |
5.3 三层自启链,缺一不可
NAS 重启
↓ ① VMM「自动启动 = 是」 → 虚拟机自己开机
虚拟机开机
↓ ② 系统「自动登录」 → 不停在登录界面
进入桌面
↓ ③ 桌面「开机自启应用」 → 自动拉起客户端
就绪 → 手机设备列表自动出现
任何一层断了,断电后都要人工进控制台救。 验收方式:直接断 NAS 电源,
全程不干预,等 8~10 分钟,从手机端确认设备出现且能正常使用。
5.4 控制台里点不出来的两个开关
- 「允许移动端连接」往往默认就是开的,不用手动开;
- ★ 但 「为远程访问保持唤醒 / Stay awake」这类开关通常默认是关的,
必须手动打开,否则远端根本发现不了这台机器。 - 这类开关有的不随重启持久化,重启后回控制台确认一次。
5.5 客户端下载的坑(官方 CDN)
症状:同一 URL 每次下载字节数都不一样、与 Content-Length 对不上、
sha256sum 也和官方接口给的 hash 不符。
根因:CDN 的 HTTP/2 连接会被提前关闭,而 curl -f
只检查状态码、不校验长度,于是它以为成功了。
对策:
1. 下载时加 --http1.1;
2. 官方接口里的 hash 字段未必对应该安装包的 URL(可能对应增量包),
别拿它当唯一判据 —— 最终以包管理器能否装成功为准。
5.6 群晖专属坑(最高价值的部分)
| 坑 | 现象 | 对策 |
|---|---|---|
没有 ss 命令 |
command not found |
用 cat /proc/net/tcp 查端口(十六进制,$4=="0A" 才是 LISTEN) |
没有 python3 |
脚本报错 | 脚本做 python3 / python / 纯 shell 三级兜底 |
| 共享文件夹在 File Station 看不到 | synoshare --enum ALL 里没有 |
该目录没在「控制面板 → 共享文件夹」注册过。VMM 添加 ISO 时也看不到它 → 先注册 |
\\NAS_IP\共享名 跳浏览器 |
输入后弹出浏览器 | SMB 链路有问题 → 改用 File Station 中转,或直接用 scp |
| 剪贴板吃掉长命令的字符 | edu.cn→educn、app.deb→app.db |
★ 长操作一律做成脚本文件传输。本地路径用短名,能用通配符就用通配符 |
容器 cpus: 参数让容器建不出来 |
NanoCPUs can not be set ... cgroup is not mounted |
群晖 cgroup 是定制的 → 禁用 cpus |
> 写脚本三条铁律(都是血泪):
> ① 必须 LF 换行(CRLF 会让 shell 报 \r: not found);
> ② 禁用 ! 字符(触发 shell 历史扩展,报 event not found,整条命令被拒);
> ③ 常用工具显式列入依赖,不能假定存在(curl 在 Ubuntu 桌面版默认没有!)。
5.7 性能:先诊断,别瞎优化
远端访问慢时,在虚拟机里跑 vmstat 2 30(60 秒采样),
期间发起一次真实请求,看三列:
| 列 | 含义 | 判读 |
|---|---|---|
r |
等待 CPU 的进程数 | 明显大于 vCPU 数 → CPU 瓶颈 |
wa |
I/O 等待 % | 显著大于 0(如 20+)→ 磁盘瓶颈 |
si / so |
换入/换出 swap | 非 0 → 内存不足,加内存 |
三条反直觉但极常见的经验:
- 慢 ≠ 磁盘慢。必须用
wa证实,别凭直觉去折腾存储。 lscpu里Hypervisor vendor显示Microsoft是正常的 ——
虚拟机开了 Hyper-V 兼容增强就会这样显示。判断有没有硬件加速,
看BogoMIPS是否接近原生水平(1.5GHz 的 CPU 约 3000)。- 软件优化最多找回 20~30%,弥合不了数量级差距。
差距超过 5 倍时,应该直接考虑换硬件,而不是继续调软件。
正确的期望管理:让远端发一句零计算的话(如 1+1等于几)测出的时间,
几乎全是固定启动开销。真实任务动辄数分钟,这段开销占比很小。
六、必须一并交代的"已知限制"
做完部署一定要主动告诉用户,否则他们遇到时会误判成故障:
- 远端(尤其手机 APP)可能不显示"思考过程" —— 客户端自身的呈现行为,
NAS 侧无任何开关可改。感知上的"迟钝"往往来自"没有过程反馈",而不是绝对速度。
缓解:换另一种客户端形态试(小程序 vs APP)、升级客户端到最新版。 - 远端响应时间取决于 NAS 的 CPU,与台式机差一个数量级属于正常。
- 各台干活的机器之间没有同步通道 —— "多端共享同一批任务"的唯一解是只保留一台。
- 「云端」和 NAS 上是两套数据 —— 用手机时请务必先切到那台机器再发消息。
- 固定启动开销在极简问答上最明显,在长任务上占比很小 —— 别用小问题下大结论。
七、常用操作速查
# 进它的桌面
DSM → Virtual Machine Manager → 选中虚拟机 → 「连接」
# 从电脑传文件进去(最快)
cd ~/Downloads; scp 文件名 用户名@虚拟机IP:~/
# 在里面启动客户端(不要加 sudo)
客户端启动命令
# 重启它(温和 / 强制)
VMM → 「关机」;或 「关机」下拉 → 「关闭电源」
八、授权与使用声明
- 本方案提供完整的部署方法、配套脚本与文档,免费分享。
- 不含任何 AI 客户端账号、API 额度、License —— 需自行注册并承担相应费用。
- 不含域名、云服务器、内网穿透等第三方服务的费用。
- 部署在自有设备上,数据存放位置由使用者自行决定,本方案不接触任何用户数据。
- 请遵守群晖、以及各第三方服务的用户协议。
- 许可协议:CC BY-NC 4.0。
欢迎自用、转载、改编写成你自己的教程(注明来源即可);请勿用于商业售卖。
九、资源索引
| 类别 | 文件 |
|---|---|
| ★ 完整部署实录(先读这篇建全局感) | references/09-walkthrough.md |
| ★ Docker 路线失败实测(选路线前读) | assets/case-no-docker.md |
| 前置体检 | references/00-preflight.md |
| VMM 与虚拟机 | references/01-vmm-setup.md |
| 系统安装 | references/02-ubuntu-install.md |
| 系统初始化 | references/03-system-init.md |
| 客户端安装(含换任意 Electron 应用四步法) | references/04-app-install.md |
| 无人值守 | references/05-unattended.md |
| 验收 | references/06-verify.md |
| 故障排查(速查表 + 3 个排障实录) | references/07-troubleshooting.md |
| 性能判读 | references/08-performance.md |
| 脚本 | scripts/(含 bump-version.sh 版本同步) |
| 速查与清单 | assets/ |
| 版本号单一来源 | VERSION.txt |