English

文章

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 虚拟机。

keelOS 的结构:hyp、root、虚拟机和直通的硬盘
keelOS 的结构:hyp、root、虚拟机和直通的硬盘

宿主重启只换中间那一层。虚拟机的内存在 hyp 里不动,硬盘控制器的 DMA 由 hyp 管的 IOMMU 保持有效,所以上面的东西都不用停。

招牌能力:宿主重启,虚拟机不关机

宿主重启时虚拟机只暂停半分钟左右,然后原地继续,内存、磁盘、网络连接都在。它的原理是把“不能重启的”和“可以重启的”分开:

  1. hyp 是一个很小的 hypervisor,由 UEFI 启动后常驻内存。虚拟机的内存和 CPU 状态都在它手里。它不含驱动,没有网络栈,几乎不需要升级。
  2. root 是一个精简的 FreeBSD,跑在 hyp 上面,负责驱动、ZFS、网络和设备模拟(bhyve)。它可以随时重启。
  3. 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 一个路数:

  1. 把镜像写进 U 盘(dd、Rufus、balenaEtcher),或者用 PXE 启动,不用先装。
  2. 第一次启动的向导问几个问题(建哪个池、网络、密码),可以选择装到一块专用的启动盘,或者装到数据盘的开头一小块,其余给虚拟机的池。
  3. 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、老系统。

← 文章 · 为什么选 keelOS