keelOS: NAS, 无缝集成到keelOS中,simple但是powerful
keelNAS 是我们给 keelOS 做的 NAS:一台从市场一键装好的小虚拟机,管理界面直接长在 keelOS 的网页里,同一个登录。它只做两件事,共享文件和保管文件,但这两件事做得很深:ZFS、快照、SMART 告警、iSCSI、统一账号、升级失败自动回滚。
先用两段话交代 keelOS。keelOS 是给家里或小办公室那一台服务器用的虚拟化系统,基于 FreeBSD 和 bhyve。UEFI 先加载一个约 100 KB 的 keel hypervisor,它保管虚拟机的内存、vCPU 状态和 IOMMU;FreeBSD 宿主跑在它上面,是一个只读镜像,可以升级、重启。
宿主重启时虚拟机只暂停约 25 秒,然后原地继续,不关机,TCP 连接不断。所以在 keelOS 上,NAS、路由器、Windows 桌面各在一台虚拟机里,宿主更新时谁也不用停。这台机器上最需要一直在线的,往往就是 NAS。
为什么要自己做一个 NAS
在 keelOS 上本来就能装飞牛 fnOS 和 TrueNAS,新建虚拟机的向导里都有模板。但拿一个完整的 NAS 系统当虚拟机用,有几处别扭:
- 两套网页、两套登录。 宿主一个,NAS 一个,用户、权限、审计各管各的。
- 网络一设错就失联。 NAS 的网页只在局域网地址上,IP 改错了就只能开控制台去救。
- 功能都按“自己是宿主”设计。 应用商店、Docker、虚拟机,装进虚拟机里都是多余的;内存要求也高,TrueNAS 要 8 GB,在 8 GB 的小主机上就没法用。
- 升级是一件要操心的事。 NAS 自己升级、自己回滚,宿主帮不上忙。
我们想要的是另一种体验:买一台 8 GB 内存的小主机,一块 SSD 加一两块硬盘,装上 keelOS,点一下就有一个 NAS,在同一个网页里管。先插一两块盘用起来,不够了再加。
别家怎么做
市面上的做法大致两类:要么 NAS 就是宿主,虚拟机是它的附属功能;要么虚拟化平台当宿主,NAS 是一台普通虚拟机,两边互不相识。
| 方案 | NAS 在哪 | 管理界面 | 宿主升级时 |
|---|---|---|---|
| TrueNAS SCALE、Unraid、飞牛 fnOS | 就是宿主,虚拟机和应用是附属功能 | 一套 | NAS 和上面的虚拟机一起停 |
| Proxmox VE 加一台 TrueNAS 虚拟机 | 一台普通虚拟机,硬盘控制器直通进去 | 两套,各自登录 | 虚拟机关机再开,直通设备的虚拟机不能挂起 |
| keelOS 加 keelNAS | 一台小虚拟机,由 keelOS 建、管、升级 | 一套,NAS 是 keelOS 网页里的一个标签页 | 暂停约 25 秒后继续,共享不断 |
还有一个值得一提的例子:HexOS 没有自己写存储,只在 TrueNAS 的 API 上做了一个简单的界面,就有人愿意付费。可见“简单、可靠的 ZFS NAS”本身就是需求。另一方面,没有哪个 NAS 系统是为“当虚拟机”设计的,这是 keelNAS 的空位。
表里各家的说法是我们调研时的理解,没有逐条实测。
Simple:只做两件事,全都长在 keelOS 里
只做共享和文件安全。 keelNAS 是一个小的 FreeBSD 15 系统,核心是 Samba、ZFS 和 FreeBSD 的 iSCSI 服务。每一项功能都要能归到“共享服务”或“文件安全”之一,归不进去的不做:没有应用、相册、影音、容器、远程访问。想要这些,飞牛和 TrueNAS 的模板还在,keelNAS 可以把文件共享给它们。
从市场一键装。 keelNAS 是一个签过名的 .kimg 包:清单、ed25519 签名、压缩过的系统盘。keel 只收它信任的密钥签过的包,下载完先核对签名和 SHA-256,没有关掉检查的开关。在网页的“市场”页点下载、点安装,选网络和数据盘大小,就完了。
管理界面就是 keelOS 的一个标签页。 keelNAS 没有自己的登录。keelOS 顶部导航多一个“keelNAS”,里面是概览、存储、共享、用户、iSCSI、网络六个子标签,中英日三种语言。页面上说的是存储、共享和用户,pool、vdev、ACL 这些词不出现。每个子标签只有列表和一个“新建”按钮,新建和编辑都在弹窗里。
一条只属于宿主的内部链路。 keel 建 keelNAS 时给它第二块网卡,接在宿主内部一个没有物理口的网桥上(169.254.77.x)。keel 经这条链路管 keelNAS:局域网地址设错了,在 keelOS 的网页上照样能改回来。也不用输任何密码:建的时候,keel 把密钥、自己的地址和证书指纹写进一块种子盘,keelNAS 起来后拿它登记。
系统和数据分开。 系统盘是包里那块盘的 ZFS 克隆,文件和设置在单独的数据盘上。升级就是换一块系统盘,数据盘不动。
浏览器和 AI 助手只和 keel 打交道;keel 验过令牌、记下审计,再经内部链路去管 keelNAS 和 keelAuth。局域网里的电脑照常经 keelNAS 自己的网卡访问共享。
Powerful:两件事都做得很深
共享服务
- SMB 共享:哪些用户能读写、哪些只能读,权限可以按组给。
- iSCSI:给别的机器当块盘用的 LUN。
- 本地用户和组,或者直接用 keelAuth 的账号(见下)。
- 局域网地址可以是固定 IP 或 DHCP。
文件安全
- 底下是 ZFS:校验和自愈。先用一块盘建存储,以后给它加一块做镜像,补上保护。
- 每个共享各自的快照:手动拍,或者自动拍并设定保留几个。误删、改坏、勒索都能退回去。
- 页面最上面是“需要处理”:SMART 报的盘健康、巡检结果、降级的存储,keelNAS 标签上直接显示有几条。
账号:接上 keelAuth
keelAuth 是市场里的另一个包,小办公室的账号服务器(基于 Kanidm)。把 keelNAS 接上它,办公室的用户和组就是 NAS 的用户。keel 在中间搬:每 10 秒问一次 keelAuth 的版本号,变了就同步,每 10 分钟再全量推一次。密码一起过去,因为 SMB 要用。断开时由你选:同步过来的用户留作本地用户,还是删掉。
和 keelOS 一体
- 所有操作都经 keel 的 HTTPS API:受同一套令牌管,看要
host:read,改要管理员;每次改动进 keel 的审计日志。 - 接上的 AI 助手经 MCP 也能做同样的事。
- 升级:宿主上有了新版本的包,实例旁边显示“新版本 → 升级”。keel 换系统盘、启动、做健康检查,不健康就自己退回旧版本;旧版本留 7 天,也可以手动退。
- keelNAS 在 keelOS 上是一台普通的 FreeBSD 虚拟机,宿主重启时和别的虚拟机走同一条路:暂停,然后继续。
实测结果
全部在我们的开发机上测,2026 年 10 月 3 日。SMB 用 Samba 自带的 smbclient(SMB3)验证。
| 测了什么 | 结果 |
|---|---|
| 从市场下载 1.2 GB 的包,验签名和 SHA-256 | 不到 20 秒(局域网内的目录) |
| 虚拟机启动到 keelNAS 登记上来 | 10–18 秒;紧接着经 keel 建存储、用户、共享,smbclient 写入成功 |
| 升级(有存储、有共享、接着 keelAuth) | 解包 29 秒,这期间不停机;停机 20 秒;地址、用户、共享都在 |
| 升级(还没建存储) | 19 秒,设置和 Samba 密码都交接过来 |
| 在 keelAuth 里改密码(经 keel) | 1.3 秒后 SMB 上新密码能用,旧密码被拒 |
| 在 keelAuth 里改密码(不经 keel,靠轮询) | 5 秒后生效 |
| 在 keelAuth 里停用一个用户 | 9 秒后 SMB 返回 ACCOUNT_DISABLED,启用后又能用 |
| 局域网地址故意设错 | 经内部链路在 keelOS 网页上改回来 |
手动回退也测了。第一次回退发现 keelnasd 应答以后几秒 smbd 才起来,于是健康检查加了“设置已经落实、没有错误”这一条;改完再升级,完成时 SMB 马上就能用。
还没做完的
- Windows 客户端没测。 SMB 只用
smbclient测过,下一步是真的 Windows 电脑打开共享、用 iSCSI 发起程序连 LUN。 - 宿主重启没有单独测。 FreeBSD 虚拟机跨宿主重启已经通过,但 keelNAS 带着 SMB 连接过一次宿主重启,还没有专门跑过。
- 没做: NFS、复制到另一台机器、硬盘休眠、UPS。它们排在第二档,有人要再做。
- 虚拟机备份到 keelNAS。 用户只做一个决定“要不要备份”,其余由 keelOS 和 keelNAS 做:有设计,还没做。
- 整块盘交给 keelNAS 现在要到它的虚拟机页面上做,keelNAS 标签页里还没有。
- 混合容量的盘(类似群晖 SHR 的分层 raidz)只在 QEMU 里试过。
- 装好的 keelOS 主机上(用安装镜像装出来的)还没有从头走过一遍。
- keelNAS 和 keelOS 一样还在开发中,会和它一起发布。
结语
keelNAS 的 simple,是把不属于 NAS 的东西都拿掉:没有第二套登录,没有第二套网页,没有应用商店,网络设错了也丢不了。它的 powerful,是把剩下的两件事做深:ZFS 和快照管住数据,keelAuth 管住账号,keel 的 API、令牌、审计和 MCP 管住操作,升级坏了自己退回去。
这些都因为它不是“装在虚拟机里的另一个系统”,而是 keelOS 的一部分。底下的 hypervisor 让宿主随时可以重启,上面的 keelNAS 让文件一直有人看着。等 Windows 客户端和虚拟机备份做完,我们再来更新这篇。