虚拟机分工:路由、存储与工具机

分工原则:高内聚、低耦合

AIO 机器最大的诱惑是什么都想塞、什么都想省。但把路由、NAS、下载、影音全部揉进一个系统,一旦某个服务升级失败或配置改错,全家一起断网。所以分工的第一原则是:不同职责拆成不同虚拟机,能彼此独立重启、独立快照、独立备份。宁可每个虚拟机小一点,也不要图省事做巨型客户机。某个服务深夜崩溃时,只需重启那一台,别的业务毫无感知,这就是分工的价值。

第二个原则是网络分层。路由虚拟机承上启下,一断全网瘫痪,因此它自身要尽量纯粹,只做拨号、防火墙、DHCP 这些事,不要在路由虚拟机里挂下载器和 Docker,避免高负载时转发卡顿。存储虚拟机要求数据安全,工具机则随便折腾,崩了重装即可。三者之间依赖关系明确,排错时一眼就能定位到是谁的问题。

第三个原则是资源配额先行。分工之后每台虚拟机分多少 CPU、内存、磁盘要有计划,而不是先开着、卡了再加。临时扩容容易造成资源超卖,某天另一台虚拟机负载上来,大家一起抢,性能曲线像坐过山车。

AIO启动依赖顺序

路由虚拟机

路由是 AIO 的心脏,常见方案是 OpenWrt 或者 iKuai 这类软路由系统。虚拟机规格不用高:2 核、1GB 内存、8GB 磁盘足够日常千兆转发。OpenWrt 的 x86 版本安装后只占不到 1GB 空间,资源占用极低;iKuai 界面友好适合新手,但商用功能要授权,家用免费版够用。关键在网卡——WAN 口用直通网卡或者接 vmbr0 都行,但要保证路由虚拟机能稳定拿到光猫的拨号链路。具体直通做法见直通一章,这里只说分工。

路由虚拟机里值得放的服务:PPPoE 拨号、防火墙与端口转发、DHCP 与 DNS 分发、多拨与负载均衡(需要时)。不建议放:下载器、Docker 套件、监控全家桶。路由一旦 CPU 跑满,整个内网都会卡,这个教训几乎每个 AIO 玩家都经历过。另外强烈建议给路由虚拟机开 watchdog 类看护,死机自动重启比第二天早上才发现断网强得多。

项目 路由虚拟机建议 说明
CPU 2 核 千兆转发够用,2.5G 网口给 4 核
内存 1GB 到 2GB OpenWrt 1GB 足够,iKuai 给 2GB
磁盘 8GB 系统小,日志定期清
服务边界 只做网络相关 下载、影音一律挪走
看护 自动重启 卡死后最小化人工干预

存储虚拟机

存储虚拟机就是 AIO 里的 NAS。它的定位是数据大管家:文件共享(SMB 与 NFS)、照片备份、影音媒体库都放这里。配置上磁盘是大头,CPU 和内存反而够用就行,四核 4GB 带动基本家庭共享毫无压力;如果同时要做视频转码,核显直通给它最划算,具体做法同样在直通一章。存储虚拟机对待休眠有两种态度:要么干脆不休眠 24 小时转,要么配合硬盘休眠策略让盘休息,最忌讳的是高频繁启停,盘比电费贵。

数据盘不建议用虚拟磁盘文件再套一层,性能与故障排查都吃亏。更好的做法是把整块物理硬盘或 SATA 控制器直通进存储虚拟机,由里面的系统直接管理 ZFS 或 RAID。如果不怕麻烦,也可以宿主用 ZFS 建存储池,再把数据集以目录方式挂给虚拟机,宿主统一管快照。两种路线各有所长,按自己的运维习惯选。

两种数据盘路线;left=整盘直通;客户机直接管阵列;性能损耗小;宿主不管数据快照;right=宿主ZFS加目录挂载;宿主统一快照;多一层虚拟化开销;适合多虚拟机共享

工具机与应用容器

工具机是各种折腾服务的去处:Docker 套件、监控采集、下载器、智能家居网关、RSS 与自动化。这些服务更新频繁、偶发崩溃,放在独立虚拟机或 LXC 容器里互不影响。PVE 的 LXC 非常适合跑这类轻量服务:共享宿主内核,启动快、占用小,缺点是对内核模块依赖较强的服务兼容性差,那种就老老实实开虚拟机。

形态 适用场景 代表服务
LXC 容器 轻量服务、长期常驻 Docker 引擎、监控采集器、Nginx
虚拟机 强隔离或特殊内核需求 智能家居网关、测试环境、面板工具

工具机里跑的面板类工具,安装与配置可以参考 宝塔面板实战 里的思路,网页管理对新手友好;而多机统一管理、配置文件版本化这些做法,推荐 SSH 远程登录与加固 里的密钥登录方式。一个实用建议:工具机里把各服务的 docker-compose 文件集中放在一个目录用 git 管理,重装时一键拉起全部服务。

资源分配与开机顺序

四台虚拟机各司其职后,宿主资源要留有余量。一个常见错误是把宿主内存全部分光,结果系统缓存没有空间,整体反而变慢。建议给宿主留 2GB 到 4GB 内存与至少一个 CPU 核不被独占。开机顺序按依赖关系排:先路由、再存储、最后工具机,每台之间延迟 30 秒,避免存储还没起来应用就开始挂载数据盘。PVE 网页里设置开机自启与启动顺序即可,顺序填数字,数字小的先启动。

内存超卖要克制:路由与存储按实际占用给,工具机可以略超,但超卖总量别超过物理内存的一半,否则某次负载高峰大家一起开始交换,画面很美。

分工的常见误区

第一大误区是按服务商边界而不是按职责边界分工。有人把同一个服务商的应用全塞一台虚拟机,觉得来源一样放一起方便升级,结果是家居网关、影音、下载同住一屋,更新任何一个都担心连累全家。职责边界看的是崩溃影响面,不是软件来源:影音挂了只是没得看,网关挂了家里灯都控不了,这就不该放一起。

第二大误区是工具机无限膨胀。Docker 好用于是什么都往里塞,今天加个书签服务明天加个记账本,两年后工具机成了事实上的单点:它一挂全家人都不会用网。治理工具很简单——给它配最低资源保障(内存限额、CPU 配额),让它在大负载下不至于把宿主拖垮;同时凡是要紧的服务,要么挪进独立容器互不影响,要么写好重启看护。

第三大误区是忽视启动依赖的顺序与超时。开机顺序配好了但超时没配:某次存储虚拟机自检慢了几分钟,应用虚拟机按 30 秒延迟启动,结果数据库还没起来应用就开始连,连不上就崩。正确做法是应用层做重试而不是依赖对方的启动时间——所有连接配置里把重试间隔与次数写够,依赖关系就不再需要精确的启动编排。

从单机到多机的演化路线

绝大部分人的 AIO 都不是一次规划到位的,而是一条演化路线:初期单台路由加一台 NAS 足够;半年后开始加 Docker 服务,工具机登场;再后来监控、自动化、家居网关陆续加入。分工的节奏要跟着演化走,而不是一开始就铺开四五个虚拟机,每个都半死不活地占资源。判断是否该拆新虚拟机的信号很明确:某个服务每次升级都会连累别人、或它的资源峰值明显拖垮其他服务,这时候就是它在要自己的机器。

演化过程中的迁移成本要有数:Docker 服务的迁移是 compose 文件加数据目录,五分钟;路由系统迁移要重新拨号配置,半小时起;NAS 迁移最重,数据量决定天数。所以关键的长期服务在一开始就给它规划好独立位置,避免后期痛苦迁移。反过来像 RSS、书签这类轻量服务,随手放进现有容器环境里就好,等哪天它膨胀了再独立也不迟。

多机环境的整合点是配置管理:所有机器用同一套密钥与账号体系、同一套备份策略、同一套告警通道。这三样统一了,五台机器和五台独立山头的运维成本完全不同。家用不需要上企业级配置管理工具,一个 git 仓库加几个 shell 脚本就能把多机环境打理得井井有条。

典型AIO各虚拟机内存占用

资源分配的量化经验

具体到数字的家庭经验:一台四核 32GB 的 AIO 跑四台虚拟机,分配方式推荐路由 2 核 1GB、存储 2 核 4GB、工具机 2 核 2GB、监控 1 核 1GB,宿主留 24GB 做缓存与突发。这套分配的特征是 CPU 可超分(核心总需求高于物理核心也没关系,因为各虚拟机峰值时刻不同)而内存不超分(内存超分触发交换后所有机器一起卡)。存储 IO 的分配同理:SSD 系统盘给所有虚拟机系统、机械盘给数据,两类负载天然分开。

判断分配是否合理的方法:观察宿主的负载与缓存曲线一周。如果 CPU 长期低于 20%、内存缓存占用健康、硬盘队列不堆积,说明分配保守且恰当;如果某台虚拟机长期 CPU 满载,给它加核心;如果宿主频繁交换内存,说明超分过头了。监控数据在这里再次充当决策依据,而不是靠感觉加减配置。

一点补充:虚拟机的命名与台账

分工落地的最后一公里是台账:给每台虚拟机起稳定的名字(role-功能-编号,如 vm-router-01、vm-nas-01),对应文档里记录角色、负责人、端口清单、依赖关系。这套命名看似小学问,在虚拟机数量过五之后 Lookup 效率直线上升——半夜排错时一眼看到 vm-docker-02 就知道它是哪台、跑什么、能不能重启。命名规范配合 /etc/hosts 或内网 DNS 一起用,所有配置脚本里写主机名不写 IP,换了 IP 也不用改脚本。

延伸阅读