各层做什么,项目如何组合,新实现改变什么
按职责分组,平台可以跨层。具体调用路径不必经过每一层。
宿主机视角。箭头表示控制与启动关系,运行时 I/O 不必经过所有管理层。
执行态按宿主机视角标注;用户态服务即使以 root 运行,也不属于内核态。
箭头表示控制、启动与接口关系,省略部分内部组件;并非每条指令或每次 I/O 都经过全部管理层。
上层提出要求,内核与硬件负责实施
| 功能 | 核心机制 | 演进重点 |
|---|---|---|
| 隔离进程视图 | namespaces | 与权限、挂载机制组合 |
| 限制资源使用 | cgroups | v1 → v2:统一层级与委派 |
| 执行 guest | KVM + 硬件虚拟化 | 新设备、架构与机密计算 |
sudo unshare --uts sh -c 'hostname demo; hostname'
hostname子进程看到 demo,外层仍看到原主机名。
| 术语 | 负责什么 |
|---|---|
| VT-x / AMD-V / Arm EL2 | CPU guest 执行模式与受控陷入 |
| EPT / NPT / Stage-2 | guest physical 到 host physical 的内存地址翻译 |
| IOMMU / VFIO | 设备 DMA 约束与设备直通的内核支持 |
| SR-IOV | 一块 PCIe 设备暴露多个 Virtual Functions |
| cgroups v2 | 统一资源控制层级与委派语义 |
| user namespace / idmapped mount | 身份映射与挂载上的文件所有权映射 |
OCI(Open Container Initiative)制定容器开放标准。
镜像规范管打包,分发规范管传输,运行时规范管启动。
| 实现 | 主要特色 | 比较重点 |
|---|---|---|
| runc | 经典基线,生态成熟 | 兼容与集成 |
| crun | C 实现,强调小体积 | 启动与内存开销 |
| youki | Rust 实现 | 内存安全与功能覆盖 |
sudo runc run --bundle ./bundle democonfig.json 指定命令与隔离设置,rootfs 提供程序与文件。
三个规范连接不同环节,runc 接收的是运行准备目录。
| 规范 | 约定什么 | 具体产物 / 交互 |
|---|---|---|
| Image Spec | 程序和依赖如何打包 | 镜像层、配置、manifest |
| Distribution Spec | 如何推送和拉取内容 | 客户端与 registry 的分发 API |
| Runtime Spec | 容器配置与生命周期 | bundle、create / start / delete 等 |
bundle/ config.json # 命令、挂载、隔离设置 rootfs/ # 程序、库和容器文件
上层拉取并解包镜像,准备 rootfs 与运行配置。
runc 据此调用内核,创建并启动进程。
上层仍管理容器,底层执行路径可以改变
| 路径 | 隔离方式 | 主要代价 |
|---|---|---|
| 普通容器 | 应用直接使用宿主内核 | 共享内核的信任边界 |
| gVisor | 用户态 Sentry 实现 Linux 接口 | 兼容与 I/O 需验证 |
| Kata Containers | 容器运行在独立 guest 内核中 | 引入 VM 管理与资源开销 |
sudo runsc run --bundle ./bundle sandbox-demo执行同一个 hello 程序,Linux 接口由 Sentry 承接。
它们是可选执行路径,各自把隔离边界放在不同位置。
共享宿主内核
namespaces / cgroups 等实施约束
减少直接暴露的宿主接口
需要验证兼容与 I/O
独立 guest 内核与 VM 边界
增加机器与 guest 管理
接口相近不代表边界相同;设备直通和恢复能力仍取决于具体后端。
KVM 提供执行能力,VMM 组织机器与设备模型
| 实现 | 核心取向 | 主要取舍 |
|---|---|---|
| QEMU | 广架构、广设备、成熟生态 | 兼容面与实现规模较大 |
| Cloud Hypervisor | 现代云 VM,virtio / VFIO | 减少遗留设备支持 |
| Firecracker | 精简 microVM,快照恢复 | 通用设备能力较窄 |
qemu-system-x86_64 -enable-kvm -m 1024 \
-drive file=guest.qcow2,format=qcow2 -snapshot -nographic启动一台 1 GiB VM,本次磁盘写入放在临时层。
| VMM | 设备能力侧重 | 状态与迁移边界 |
|---|---|---|
| QEMU | 设备/guest 广,VFIO 生态成熟 | 成熟迁移机制,仍受 CPU、设备、版本限制 |
| Cloud Hypervisor | 现代 virtio、VFIO、热插拔 | 有 live migration,不保证跨版本兼容 |
| Firecracker | 精简设备;virtio PCI 热插拔为开发预览 | snapshot/restore 不等于通用 live migration |
| crosvm | 客户端设备、独立设备进程、VFIO 路径 | 官方 snapshot 文档标为高度实验性 |
核验日:2026-09-23。上游 VMM 有能力,不代表每个管理平台都已支持。
把一次性的底层执行,组织成持续运行的节点服务
| 实现 | 管理范围 | 特色 |
|---|---|---|
| containerd | 镜像、快照、任务与插件 | 服务 Kubernetes、Docker 等上层 |
| CRI-O | Pod sandbox 与容器生命周期 | 围绕 Kubernetes CRI 聚焦设计 |
sudo ctr images pull docker.io/library/alpine:3.22
sudo ctr run --rm docker.io/library/alpine:3.22 demo echo hello先管理镜像,再经 shim / runc 启动任务,输出 hello。
不同接口连接不同职责,不能串成一条 OCI / CRI / CNI / CSI 流水线
| 接口 | 连接双方 | 约定的主要功能 |
|---|---|---|
| OCI | 镜像生产/消费方、执行管理方与 runtime | 镜像、分发、运行规范各有边界 |
| CRI | kubelet 与节点运行时 | Pod sandbox、容器、镜像等 RPC |
| CNI | 网络调用方与网络插件 | 接入、配置与清理容器网络 |
| CSI | 存储控制/节点组件与驱动 | 卷供应、挂载、扩容等 |
| libvirt / QMP | 管理客户端与虚拟化管理层 / QEMU | 分别提供管理抽象与具体 VMM 控制 |
Kubernetes API 则统一对象与期望状态,CRD / controller 在这个层面扩展能力。
共同关注生命周期,管理对象与产品范围各不相同
| 对象 | 代表实现 | 关键区别 |
|---|---|---|
| 应用容器 | Docker / Podman | 完整开发生态 / 无必需中心 daemon |
| VM 管理接口 | libvirt | 封装 VMM 控制,供上层调用 |
| 完整实例平台 | Incus / Proxmox | 统一实例 API / 集成虚拟化运维 |
qm start 101
qm status 101复用已保存的 CPU、磁盘与网络配置,启动并查询 VM。
把镜像、网络、卷、构建和交互操作组织成用户工作流
| 维度 | Docker · 经典生态 | Podman · 不同管理路线 |
|---|---|---|
| 进程架构 | dockerd + containerd 等组件 | 无必需中心 daemon,可开 API service |
| 权限与服务管理 | 支持 rootless,成熟开发生态 | 强调 rootless 与 systemd / Quadlet |
| 构建与应用组合 | BuildKit / buildx / Compose | Buildah 生态,Compose provider |
| 替换边界 | CLI、Engine API、Desktop 各有范围 | 需验证 API、构建与 Compose 兼容 |
共享 OCI 生态,但 Engine API、构建器和开发工作流并非全部相同。
承接 LXC / LXD 的机器式管理路线,并统一容器与 VM
init / systemd、多服务
LXC / liblxc
共享宿主内核
当前已支持 OCI 镜像
应用启动语义
仍有自身执行与管理路径
独立 guest 内核
QEMU / KVM
完整系统环境
LXD 仍在维护。Incus 的 OCI 支持不等于 Docker API,也不意味着改用 containerd。
Kubernetes 放置 Pod;Ray 在集群内调度 task / actor
| 实现 | 组织中心 | 主要优势 |
|---|---|---|
| Kubernetes | 对象 API 与控制器 | 工作负载调谐与扩展生态 |
| Ray | task / actor 与逻辑资源 | 分布式 Python、CPU / GPU 任务调度 |
| Kueue / Volcano | Kubernetes 上的批处理能力 | 准入配额 / gang scheduling |
ray job submit --address http://127.0.0.1:8265 \
--working-dir . -- python demo.py提交 Ray 作业;脚本中的 task / actor 再由 Ray 调度。
改变 VM 的管理方式,复用既有虚拟化执行栈
virtctl start demo-vm
kubectl get vm,vmi将 VM 置为启动状态,由控制器创建运行实例 VMI。
在执行与管理之上,增加租户、权限、网络和存储契约
| 职责 | OpenStack 经典实现 | 交付内容 |
|---|---|---|
| 计算 | Nova / Placement | 实例生命周期与资源分配 |
| 网络与存储 | Neutron / Cinder / Glance | 网络、卷与镜像 |
| 身份与租户 | Keystone | 项目、角色与授权基础 |
openstack server create --image demo-image --flavor m1.small \
--network demo-net --wait demo-vm申请租户 VM:云平台协调配额、计算、镜像与网络。
评价“新”的依据:具体收益,以及为此放弃了什么。
本地 CLI,Linux 为主 · 核验:2026-09-24 · 文档 / 源码分支快照
| Agent | 有无、机制与层次 | 能限制什么 / 边界 |
|---|---|---|
| Codex | 有 · L2 执行封装 → L1 内核 bubblewrap + seccomp | 文件访问、进程可见性与网络 审批另设,实际限制取决于配置 |
| Claude Code | 有 · L2 执行封装 → L1 内核 bubblewrap + 网络代理 | shell 进程树的文件与网络访问 可配置沙箱外重试 |
| Pi | 本体无 · Agent 内信任 / 扩展逻辑 可外接容器、sandbox 或 VM | 项目信任控制资源加载 执行隔离由外部环境提供 |
| OpenCode | 本体无 · Agent 内工具权限策略 官方建议外接容器 / VM | allow / ask / deny 控制工具调用 权限审批不构成 OS 隔离 |
审批与信任属于 Agent 逻辑;执行沙箱调用内核机制强制限制访问。
Linux 路线:Agent 配置策略,执行封装与内核共同实施限制。
| 限制对象 | 执行封装怎么做 | 实际边界 |
|---|---|---|
| 文件 | 只读 / 可写挂载,拒绝或屏蔽路径 | 进程能读取或修改哪些文件 |
| 进程与系统接口 | namespaces、权限收紧、seccomp | 可见性与允许使用的系统接口 |
| 网络 | 网络隔离 + 受控代理 / 过滤 | 能否出站,以及允许的目的地 |
审批负责是否放行;sandbox 限制放行后的执行。沙箱外重试会改变这条边界。
此表归纳两者涉及的机制,并不表示它们使用完全相同的配置、过滤规则或覆盖范围。
本体无 OS sandbox 时,部署边界决定哪些操作真正受限。
| 部署方式 | 受约束的范围 | 仍需留意 |
|---|---|---|
| 仅设信任 / 审批 | 项目资源加载或工具调用 | 进程仍使用原有 OS 权限 |
| 仅把工具放进 sandbox | 被包装的命令与子进程 | Agent、扩展或其他工具可在边界外 |
| 整个 Agent 放入容器 / VM | Agent、扩展及其子进程 | 挂载、凭据、网络和外部服务仍需配置 |
Pi 官方列出整进程与工具级隔离方案;OpenCode 官方建议外接 Docker 或 VM。
可访问的宿主目录与凭据仍然可被使用;运行在容器中不自动等于无宿主访问能力。
同层看取舍,上下层看接口。
我们的工作应该复用哪些层,新增哪一层能力?
Docker
CLI → dockerd → containerd → shim → runc → Linux 内核机制
Kubernetes 容器
API → controller / scheduler → kubelet → CRI → 节点 runtime
Kubernetes 虚拟机
KubeVirt → launcher Pod / libvirt → QEMU → KVM → guest
OpenStack 虚拟机
Nova → libvirt → QEMU → KVM → 硬件虚拟化
这些是管理与启动链路。运行中应用的数据访问不逐次穿过所有管理组件。
| 比较 | 关系 | 替换前需要确认 |
|---|---|---|
| runc / crun / youki | 同层 OCI 执行器 | 特性覆盖、rootless、hooks、上层集成 |
| containerd / CRI-O | Kubernetes 节点运行时候选 | CRI 兼容、镜像/存储/沙箱集成 |
| Docker / Podman | 用户 engine 工作流候选 | API、Compose、构建与 systemd 工作流 |
| Incus / Proxmox | 实例与虚拟化平台候选 | 集群、存储、备份、权限与运维体验 |
| Incus / Kubernetes | 存在场景重叠,主要对象不同 | 机器式实例与工作负载控制器体系 |
| 路径 | 应用如何访问 GPU | 需要特别确认 |
|---|---|---|
| 普通容器 / Incus 容器 | 共享宿主 GPU 驱动与设备节点 | 驱动攻击面、资源隔离与配额 |
| gVisor | nvproxy 转发受支持的 NVIDIA ioctl | 驱动与功能覆盖,仍存在宿主驱动边界 |
| Kata / VM | 直通或虚拟设备,取决于 VMM/集成 | IOMMU、设备重置、guest 驱动与兼容 |
| checkpoint / migration | 依赖 GPU 和软件栈专门支持 | 不能从普通 VM 快照能力自动推导 |
gVisor 已有 cuda-checkpoint 集成。当前文档指出该 GPU 恢复路径不支持 arm64。
| 状态类型 | 主要保存什么 | 典型遗漏 |
|---|---|---|
| 文件系统快照 | 文件或块设备内容 | 运行中内存、连接与外部副作用 |
| 进程 checkpoint | 地址空间、线程与部分内核对象 | 设备、不同内核环境与外部服务状态 |
| VM snapshot | vCPU、guest 内存与设备状态 | 磁盘可能需另管,版本/CPU 可能不兼容 |
| 应用 checkpoint | 应用主动保存的可继续计算状态 | 依赖应用实现,未必保留交互环境 |
API 应返回快照范围与一致性级别,避免只提供含糊的 rollback。
| 项目或能力 | 核验日所见状态 |
|---|---|
| Incus / LXD | 都仍维护,Incus 已有 OCI 应用容器文档 |
| Mesos / Nabla runnc | Mesos 已退休,runnc 已归档 |
| Kueue / DRA | Kueue 通常沿用默认调度器,DRA 主功能自 v1.35 稳定 |
| Daytona 原公开核心仓库 | 2026 年 6 月起不再维护,核心开发转私有 |
| agent-sandbox / E2B Runtime | 已有公开 Agent 沙箱管理与执行基础 |
资料核验:2026-09-23。项目仍维护与某项功能生产可用,是不同判断。
机制与接口
Linux KVM API OCI Kubernetes CRI
隔离与执行
gVisor 架构 Kata Containers Firecracker
调度与控制面
Kueue Overview KubeVirt Nova 架构
Agent 执行平台
agent-sandbox E2B Runtime
每页讲者备注含相关官方来源。完整分层、比较表与来源见配套 Markdown 文档。