keelOS: 新时代的AIO系统,专为NAS爱好者打造!
keelOS 是一台机器上跑 NAS、虚拟机和各种服务的 AIO 系统,和现有方案最大的区别是一句话:宿主系统升级、重启时,虚拟机不关机。开发机上的实测:宿主换内核重启,17 台虚拟机全部暂停不到一分钟后原地继续,TCP 连接不断,其中包括拿着整块 NVMe 的 NAS 虚拟机。它还在开发中,这篇讲它是什么、现在能做到什么。
AIO 的老问题:宿主一重启,全家都停
NAS 爱好者的机器往往只有一台:上面跑着存储,也跑着软路由、Home Assistant、下载机、一台 Windows 桌面和几台开发用的 Linux。这就是 AIO(All-in-One)。它的好处是省电省钱,坏处是一台机器就是一个故障点:宿主系统要升级内核、换驱动、打安全补丁时,上面所有东西都要停。
现有的 AIO 方案在这一点上都一样:
| 方案 | 存储在哪 | 虚拟机在哪 | 宿主重启时虚拟机 |
|---|---|---|---|
| Unraid | 宿主(自己的阵列) | KVM | 关机再开 |
| TrueNAS SCALE | 宿主(ZFS) | KVM | 关机再开 |
| Proxmox VE | 宿主(ZFS)或 NAS 虚拟机 | KVM | 关机再开;多台机器加共享存储才能在线迁移 |
| Hyper-V(Windows 主机) | 宿主(NTFS/ReFS) | Hyper-V | 保存后关机;主机每次 Windows Update 要重启,上面的虚拟机全部要停 |
| ESXi | 虚拟机 | 自有 | 关机再开;在线迁移要集群和收费版 |
| keelOS | NAS 虚拟机(硬盘控制器直通) | bhyve | 暂停半分钟,原地继续 |
大机房的办法是两台以上的机器加在线迁移,宿主重启前先把虚拟机搬走。家里和小办公室没有第二台机器,keelOS 要解的就是单机上的这个问题。
keelOS 的结构
三层:不重启的 hyp 在最下面,可以重启的 root 在中间,虚拟机在上面;硬盘绕过 root,直接归 NAS 虚拟机。
宿主重启只换中间那一层。虚拟机的内存在 hyp 里不动,硬盘控制器的 DMA 由 hyp 管的 IOMMU 保持有效,所以上面的东西都不用停。
招牌能力:宿主重启,虚拟机不关机
宿主重启时虚拟机只暂停半分钟左右,然后原地继续,内存、磁盘、网络连接都在。它的原理是把“不能重启的”和“可以重启的”分开:
- hyp 是一个很小的 hypervisor,由 UEFI 启动后常驻内存。虚拟机的内存和 CPU 状态都在它手里。它不含驱动,没有网络栈,几乎不需要升级。
- root 是一个精简的 FreeBSD,跑在 hyp 上面,负责驱动、ZFS、网络和设备模拟(bhyve)。它可以随时重启。
- root 重启时,每台虚拟机的设备状态写进检查点,内存留在 hyp 的池里不动。hyp 拦下复位信号,直接加载新内核,不经过固件自检。新 root 起来后从检查点恢复每台虚拟机。
实测(开发机,双路 Xeon,192 GB):
| 测试 | 结果 |
|---|---|
| root 重启到 ssh 可用 | 约 50 秒(经固件自检的普通重启约 146 秒),连续 100 次无失败 |
| 虚拟机在跑 ping、iperf、fio 时 root 重启 | 暂停 24–26 秒,TCP 不断,磁盘数据校验全对,时钟误差 ±0.4 秒以内 |
| 同一台 FreeBSD 虚拟机连续 20 次跨 root 重启 | 全部通过 |
| root 换新内核重启 | 通过 |
| 17 台虚拟机同时在跑(Windows 10、Server 2022、XP、FreeBSD、Debian、NetBSD、fnOS、带直通的 NAS) | 重启 65.5 秒,17 台全部恢复 |
| 带整块 NVMe 直通的 NAS 虚拟机,满负载写盘时 root 重启 | 累计 14 次,无超时、无复位,ZFS scrub 0 错误 |
虚拟机里看到的只是一段 I/O 延迟,时钟由 hyp 补偿,不会跳变。同一套机制也用于升级:新版本写进备用槽,重启一次就升完,起不来就回到原来的槽。
NAS 怎么做:硬盘控制器整块交给 NAS 虚拟机
keelOS 自己不做 NAS。存储控制器(HBA、板载 SATA 控制器或整块 NVMe)直通给一台 NAS 虚拟机,硬盘由它自己的驱动直接操作,ZFS 或别的文件系统跑在虚拟机里。你喜欢的 NAS 系统(TrueNAS、fnOS、Unraid 或自己装的 FreeBSD)照常用,看到的是真硬盘:SMART、写缓存、真实的错误都在。
典型的布局:
- 宿主自己拿一个 SSD 池(
zones),放虚拟机的系统盘和镜像。 - 机械硬盘的控制器直通给 NAS 虚拟机,它自己建池,用 NFS、SMB 共享给局域网和其他虚拟机。
- NAS 虚拟机的网卡可以是一个 SR-IOV 的 VF,接近线速,不走虚拟交换机。
几个针对 NAS 场景的设计:
| 设计 | 为了什么 |
|---|---|
| 直通设备按厂商、型号和序列号认,不按插槽 | ESXi 的直通是按插槽位置配的,调整了 PCIe 插卡就得重新配置,否则设备对不上号,往往要重启好几次才能整好。keelOS 换插槽照常工作;换了一块盘,它不会被误交给虚拟机 |
| 开机时就把这些设备留住,宿主的驱动没机会碰它们 | 宿主不会自动导入 NAS 的 ZFS 池,两边同时写会毁数据 |
| 一个设备只归一台虚拟机 | 第二台要同一块设备时直接拒绝 |
| IOMMU(VT-d)由 hyp 管,不由 root 管 | root 重启时硬盘控制器的 DMA 一直有效,虚拟机的 I/O 不丢。ESXi、Hyper-V、Xen 都不能挂起带直通设备的虚拟机 |
开发机上的 nas 虚拟机(FreeBSD)拿着整块 Intel P3600 NVMe 和一个 X710 的 VF:虚拟机里读 1.37 GB/s,ZFS 池写 20 GB 后 scrub 0 错误,NFS 共享到局域网达到千兆线速。板载的 Intel C62x SATA 控制器也能直通,原版 bhyve 因为它有一个 256 字节的 BAR 而拒绝。
这套做法的细节在另一篇文章里:《keelOS: 强化VM的硬核技术,PCIe直通,SR-IOV,一个都不能少!》。
网络性能:SR-IOV 让网卡自己干活,解放 CPU
虚拟机的网络有两条路。普通的虚拟网卡(virtio)每个包都要经过宿主:bhyve 模拟网卡、tap、网桥、真网卡驱动,每一层都要 CPU 搬一次数据、换一次上下文。到了万兆,这条路吃掉的 CPU 很可观,延迟也高。
SR-IOV 是另一条路:网卡在硬件里把自己切成多个“虚拟功能”(VF),每个 VF 直通给一台虚拟机,虚拟机的驱动直接操作硬件。包从网卡 DMA 到虚拟机内存,宿主的 CPU 不碰一下。虚拟机之间的流量由网卡内部的交换机转,也不走宿主。一块万兆网卡的 VF 在虚拟机里就是一个万兆口,没有虚拟交换机这一层折损。
keelOS 把 VF 当作日常网卡用:虚拟机配置里写“用这块网卡的一个 VF”,编号可以写 auto,开机时自动挑一个空闲的;VF 重建后 MAC 地址不变,虚拟机里的网络配置照常有效。
烂大街的 i350 也能用
SR-IOV 不是万兆卡的专利。Intel i350 是服务器上最常见的千兆网卡,二手板子很便宜,很多老平台板载就是它,每个口能切 7 个 VF。Linux 下它能开 SR-IOV,FreeBSD 却只有虚拟机里用的 VF 驱动,没有宿主这一侧的 PF 功能,iovctl 根本找不到设备。
keelOS 自己写了这个 PF 驱动:照 Intel 的数据手册写(不用 Linux 的 GPL 代码),约 700 行,开机时作为模块加载,接管内核自带的 igb 驱动,不换内核。在真的 I350-T2 上两个口都测过(2026-09-30):
| 测试 | 结果 |
|---|---|
| VF → 宿主,TCP(iperf3) | 940 Mbit/s,0 重传 |
| 宿主 → VF,TCP | 941 Mbit/s |
| VF → 宿主,UDP 1 Gbit/s | 953 Mbit/s,丢包 0.12% |
| 两个口的 VF 之间,经交换机,双向 | 各 939 Mbit/s |
| 端口 VLAN、虚拟机自己打 VLAN 标签、VF 与 VF 在网卡内部互通、MAC 防伪造、PF 断开再恢复 | 全部通过 |
万兆的 X710 也在用:开发机上 NAS 虚拟机的网卡就是它的一个 VF。开发机周围的链路是千兆,所以记录里的数字都是千兆线速;万兆的端到端测量要等万兆的对端。
这套做法的异常情况(VF 不够、两台虚拟机抢同一个 VF、运行中调整 VF 数量、网卡换了)列了 13 项测试,细节在 PCIe 直通那篇文章里。
虚拟机都能跑什么
下面都是开发机上装好并跑过跨 root 重启或挂起恢复的系统:
| 系统 | 要点 |
|---|---|
| Windows 11 | 虚拟 TPM 2.0 和 Secure Boot 过安装程序的硬件检查,不用绕过;BitLocker 可用;TPM 状态进检查点,宿主重启后不要恢复密钥 |
| Windows 10、Server 2022 | UEFI,AHCI 或 NVMe,e1000 或 virtio |
| Windows XP、Server 2003、Windows 7 | SeaBIOS 引导,IDE、PCnet、UHCI,全用系统自带的驱动 |
| Linux(Debian 等)、FreeBSD、NetBSD、Haiku | virtio 或 AHCI |
| fnOS | 飞牛 fnOS,国内流行的 NAS 系统:测试完成,完全支持 |
建虚拟机用模板:windows11、windows10、windows7、windowsxp、server、linux、freebsd、haiku 等,模板里已经选好了这个系统认得的虚拟硬件。虚拟机跑起来后,keelOS 从内存里识别它装的是什么系统,不需要往里面装代理。
keel vm create --template windows11 --alias win11 --iso Win11.iso --nic bridge0
管理:一个程序,没有数据库
管理程序 keel 是一个 Go 写的静态二进制,守护进程、命令行、网页、控制台都在里面。它的原则是宿主自己说了算:一台虚拟机的全部状态就是它的 ZFS 数据集和一个 config.json,没有数据库。管理程序挂了、重启了,虚拟机照跑。
| 功能 | 现在的样子 |
|---|---|
| 命令行 | keel vm create / start / stop / suspend / resume / list,模板,镜像 |
| 网页 | 虚拟机列表和详情、开关机、串口和图形控制台、令牌管理、内存图表;中日英三语;控制台可以弹成悬浮窗口 |
| API | 所有功能都走 HTTPS API,带权限范围的令牌(哪些操作、哪几台虚拟机、有效期、来源地址),每个写操作进审计日志 |
| AI | 内置 MCP 服务,AI 助手可以直接管理虚拟机 |
| 串口控制台 | 多人看、一人写,历史回放;终端里 Ctrl-A 在虚拟机之间切换 |
| 图形控制台 | 网页里的 VNC,以及下一节的 RDP 直连 |
内存的分配也是为 AIO 设计的。宿主只留总内存的 1/8(最少 8 GB,最多 64 GB),其余全部进 hyp 的内存池给虚拟机;双路机器上虚拟机的 CPU 和内存放在同一个 NUMA 节点。网页上能看到每台虚拟机内存里有多少是空的(零页),下一步是把这些空内存静默地收回池里,虚拟机完全不知道。
招牌之二:RDP 直连控制台,guest 里不装任何东西
用 Windows 自带的远程桌面(mstsc)、macOS 和 iPhone 上的 Windows App、或者 FreeRDP,直接连到任何一台虚拟机的屏幕。它和虚拟机自己的远程桌面是两回事:画面是宿主从虚拟机的帧缓冲里取的,所以 UEFI 界面、安装程序、没有网络的虚拟机、Windows XP 都能看能操作,里面不用装任何代理。
这是 VirtualBox VRDP 和 Hyper-V 增强会话那一类能力,bhyve 上此前没有。keel-rdp 是自己写的 RDP 服务器(Rust,基于 IronRDP),整台宿主一个进程听 3389,登录用户名就是虚拟机的名字,密码是一个带控制台权限的令牌。
| 能力 | 说明 |
|---|---|
| 零拷贝取画面 | 直接映射 bhyve 的帧缓冲,按 64×64 的格子找变化 |
| 拖窗口、滚动只发位移 | 在画面里识别整块平移,只告诉客户端“把这块搬到那里”:滚动的带宽从 0.55 MB/s 降到 0.09 MB/s |
| 编码 | RemoteFX Progressive、纯色块、客户端缓存、小矩形无损发送,每个格子选最省的 |
| 剪贴板 | Ctrl+Alt+C 把控制台上的文字拷出来,Ctrl+Alt+V 把本机的文字打进去,不需要 guest 配合 |
| 没开机的虚拟机 | 显示一张“NO SIGNAL”画面,上面有一个 START 按钮,点一下就开机 |
| 权限 | 令牌可以限定只能连哪几台、从哪些地址连 |
用户的实际感受:Edge 全屏滚动“提升巨大”。网页里的 VNC 照旧可用,平时在网页上看一眼,要流畅就开 mstsc。
安装和升级:一个镜像,写到哪里就从哪里启动
keelOS 没有安装程序,发布的是一个能直接启动的镜像,和 SmartOS、Unraid 一个路数:
- 把镜像写进 U 盘(
dd、Rufus、balenaEtcher),或者用 PXE 启动,不用先装。 - 第一次启动的向导问几个问题(建哪个池、网络、密码),可以选择装到一块专用的启动盘,或者装到数据盘的开头一小块,其余给虚拟机的池。
- root 是只读镜像,在内存里运行;配置存在池上。
升级用 A/B 两个槽:新镜像写进备用槽,重启 root 一次(虚拟机只暂停),新 root 起来确认没问题就标成当前槽;起不来,hyp 下次就用原来的槽。安装和升级是同一个写槽的流程。
现状:镜像能构建,向导和安装在 QEMU 里走通,真机上还没有试过。
现在到哪一步
keelOS 从 2026-09-26 开始开发,到今天(09-30)路线图上的核心里程碑都在真机上通过了:hyp 常驻、root 不经固件重启、bhyve 跑在 hyp 上、虚拟机跨 root 重启存活、直通设备跨 root 重启存活。两台开发机上近 30 台虚拟机在跑。
还没做完的:
- 24 小时压力测试和连续 100 次多虚拟机 root 重启的加固测试。
- SR-IOV 的 VF 跨 root 重启:带 VF 的虚拟机现在在 root 重启时关机再开,代码写好了,待实测。
- 显卡直通:给 Windows 桌面用。
- 真机上的安装:镜像和向导只在 QEMU 里验证过。
- 从 ESXi 迁移的工具:虚拟硬件已经对齐了一部分(IDE、PCnet、e1000),工具本身还没开始。
- 多台宿主的统一管理端。
还没定的:发布和许可的方式。keelOS 现在是私有仓库,没有公开版本。
它不做的也说清楚:不做多租户、SDN、自动调度、共享存储。它的对象是个人和小办公室的那一台机器。
结语
AIO 的矛盾一直是:什么都跑在一台机器上,那台机器就不能动。keelOS 的答案是把虚拟机的内存和状态放在一个不重启的小内核里,让宿主系统变成可以随时换的一层。硬盘控制器直通给 NAS 虚拟机,存储也不再依赖宿主。
仓库里的一句话是:船身可以翻修,龙骨始终在下面。keel 就是龙骨。
各项能力的细节在前几篇文章里:vTPM 和 Windows 11、PCIe 直通和 SR-IOV、老系统。