什么是文件系统、镜像与可写层
一句话定义
在 CubeSandbox 里,环境的“文件世界”不是一个单层概念,而是至少由四层抽象构成:
- 镜像(Image):环境输入
- 根文件系统(Root Filesystem / rootfs):运行基础内容
- Template:可发布母版
- 可写层(Writable Layer):实例级差异状态
很多对 CubeSandbox 的误解,都来自把这四层混成“同一个东西”。
为什么必须把文件系统概念分层
如果不分层,你会很难回答这些问题:
- 为什么可以从 OCI 镜像制作 Template?
- 为什么两个 Sandbox 能共享基础环境,却不能共享彼此运行中的文件改动?
- 为什么模板制作和实例创建是两个阶段?
- 为什么实例既像“从模板复制出来”,又还能拥有自己的独立文件状态?
这些问题的答案都指向同一个事实:
CubeSandbox 不是把“一个镜像直接跑起来”,而是在管理一个分层环境系统。
什么是镜像(Image)
定义
镜像是构建环境的输入材料。
它通常描述:
- 需要哪些文件
- 需要哪些依赖
- 初始目录结构是什么
- 基础用户态环境如何组成
在 CubeSandbox 中的角色
CubeSandbox 常常从 OCI 镜像开始构建环境,但镜像本身不是最终交付对象。
更准确地说,镜像回答的是:
“这个环境的静态内容从哪里来?”
而不是:
“这个环境如何被高性能、强隔离地交付给用户?”
为什么镜像不是平台概念终点
镜像非常重要,但它还不具备:
- Guest 运行状态
- 平台探针语义
- 可复用快照状态
- 统一发布对象身份
所以镜像只是起点。
什么是根文件系统(rootfs)
定义
根文件系统是实例或模板在 Guest 内部看到的基础文件内容集合。
它比“镜像”更接近实际运行环境,因为它已经是一个可被运行时使用的文件系统基础。
它解决什么问题
镜像往往是分发格式;rootfs 更接近运行格式。
换句话说:
- 镜像描述怎么分发环境
- rootfs 描述实例启动时到底能看到哪些文件
为什么 rootfs 不是完整环境
即便有了 rootfs,也不等于已经有完整 Sandbox。
因为一个完整环境还需要:
- Guest 内核
- 运行时状态
- 网络配置
- 实例元数据
- 可写层与生命周期状态
所以 rootfs 是环境基础,但不是环境全貌。
什么是 Template 在文件系统层面的意义
Template 可以理解成“以 rootfs 为基础,再叠加可复用运行准备结果后的平台母版”。
从文件系统视角看,它至少意味着两件事:
- 基础环境已经被整理成可复用母版
- 后续实例创建时可以共享这份基础,而不必重新构造整套环境
所以 Template 不是简单“另一个文件系统格式”,而是把文件系统基础、运行状态和平台元数据组织成一个可发布对象。
什么是可写层(Writable Layer)
定义
可写层是 Sandbox 实例级的可变文件状态。
它承载的是这个实例在运行过程中发生的文件系统差异,例如:
- 新建文件
- 修改配置
- 下载依赖
- 写入工作目录
- 生成临时结果
为什么它必须是实例级的
如果多个 Sandbox 直接共享可写状态,会立即出现问题:
- 一个实例改文件会污染另一个实例
- 同一模板无法稳定复用
- 实例间缺乏边界
- 回收与问题定位会极其困难
因此 CubeSandbox 必须做到:
共享基础,不共享差异。
可写层就是这个“差异层”。
最核心的分层关系
你可以把这四层关系记成一句话:
- 镜像提供原材料
- rootfs 提供运行基础
- Template 提供可复用母版
- 可写层提供实例差异
这是理解 CubeSandbox 文件系统模型最重要的主线。
为什么这套分层对性能和密度很关键
CubeSandbox 的目标不是让每个实例都拥有一份完全独立、从零复制的完整环境,而是:
- 尽可能共享基础层
- 尽可能把差异限制在实例级可写层
- 在安全边界成立的前提下最大化复用
这会直接影响两个关键指标:
1. 存储效率
共享基础意味着不必为每个实例复制整套环境内容。
2. 内存和启动效率
当系统在文件系统和运行状态上都能良好分层时,实例创建就更接近“挂载差异层并恢复状态”,而不是“现场拼装新系统”。
为什么“镜像 -> 模板 -> 实例”是三段而不是一步
这是 CubeSandbox 设计最值得理解的一点。
第一步:镜像到基础环境
系统先从镜像得到基础内容。
第二步:基础环境到模板
系统再把基础内容预热、固化、组织成可复用 Template。
第三步:模板到实例
系统最后在共享基础之上,为每个 Sandbox 附加自己的实例差异状态。
这三步分别解决:
- 输入来源
- 母版复用
- 实例个体化
如果把它们压成一步,系统很难同时获得高性能、高密度与高可治理性。
为什么文件系统概念和快照概念紧密相连
文件系统分层主要解决“静态和实例差异怎么组织”; 快照机制主要解决“运行状态怎么复用”。
两者合在一起,才形成完整的极速交付模型:
- 文件系统共享基础
- 可写层承接差异
- Snapshot 复用运行准备状态
所以当你听到“热启动很快”,不要只想到内存快照,也要想到背后的文件系统分层。
为什么文件系统概念和安全概念也有关系
文件系统不仅关乎性能,还关乎边界。
例如:
- 实例是否能看到其它实例的状态
- 实例修改是否会污染母版
- 回收后差异状态是否被正确清理
- Guest 内文件视图是否严格限制在实例边界内
所以“分层文件系统”不仅是资源优化问题,也是隔离与治理问题。
常见误解
误解一:Template 就是一份 rootfs 归档
不对。
rootfs 是文件基础;Template 是平台母版对象,往往还包含运行状态与发布语义。
误解二:镜像和模板只是名字不同
不对。
镜像偏输入分发;模板偏平台复用与交付。
误解三:可写层只是一个小优化
不对。
可写层是实例差异边界得以成立的核心抽象之一。如果没有它,模板复用和实例隔离都会变得混乱。
运维和平台设计最该关心什么
你在实际工作中最应该关注这四个判断:
- 哪些层是共享基础,哪些层是实例差异。
- 镜像、模板、rootfs 的职责是否被混用。
- 实例回收是否真正清理了可写层状态。
- 环境变更到底应该落在镜像、模板还是实例层。
和相关文档的关系
- 想看 Template 作为母版对象: 什么是 Template
- 想看热启动能力: 什么是 Snapshot、冷启动与热启动
- 想看模板制作命令: 从 OCI 镜像制作模板
- 想看运维侧存储与目录: 安装目录、生成文件与落盘路径
下一步
理解了环境内容和状态如何分层之后,最后一个必须讲透的概念就是:
CubeSandbox 到底隔离了什么、没隔离什么,它的安全边界到底在哪里?
下一章专门回答这个问题: 什么是安全边界与隔离模型。