ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

深入AgentENV存储层:overlaybd与ublk如何实现层叠块设备与镜像共享

深入AgentENV存储层:overlaybd与ublk如何实现层叠块设备与镜像共享 深入AgentENV存储层overlaybd与ublk如何实现层叠块设备与镜像共享【免费下载链接】AgentENVAgentENV (AENV) is a distributed platform for running agent environments at scale.项目地址: https://gitcode.com/gh_mirrors/age/AgentENVAgentENVAENV是一个用于大规模运行 AI Agent 环境的分布式平台它的存储层正是由overlaybd ublk这对组合驱动的overlaybd 把 OCI 镜像逐层叠加成一块虚拟磁盘ublk 再把这块虚拟磁盘暴露为内核认可的块设备两者共同实现了生产环境 1.5M 镜像规模下的快速启动以及 50ms 级的快照恢复。本文从读者视角拆解这两个 crate 的职责边界、层叠原理与镜像共享机制。先看懂问题为什么 Agent 环境需要专门的存储层 AgentENV 的核心负载是海量 Firecracker 微虚拟机每台都需要一份 rootfs。如果用最朴素的方式——为每台 VM 拷贝一份磁盘镜像——会立刻撞上三堵墙朴素方案的痛点AgentENV 存储层的解法镜像拷贝慢启动耗时以秒计overlaybd 层叠打开按需取数启动亚秒级每台 VM 占一份磁盘容量爆炸只读层全节点共享本地盘只做有界缓存镜像散落在仓库/对象存储里本地、OSS、OCI 仓库三种后端统一抽象于是问题拆成两半「如何把一堆镜像层变成一块虚拟磁盘」overlaybd 负责以及**「如何让内核和 VM 把这块磁盘当真实块设备用」**ublk 负责。overlaybd把镜像层叠成一块虚拟磁盘LSMT层叠镜像的记账格式 一个 overlaybd 镜像由若干层文件按父子链串起来——每层的文件头里记录了自己的 UUID 和parent_uuid从最上层沿父链回溯就能叠出完整的文件系统视图。这个层文件格式叫LSMTLog-Structured Merge Tree其核心定义在 lsmt/format.rs 中文件头HeaderTrailer以LSMT魔数开头携带层 UUID、父层 UUID、虚拟磁盘大小等元信息段映射表用极紧凑的位打包记录「虚拟偏移 → 物理偏移」的映射让随机读不必全盘扫描零映射整块全零的区域只记一条这是洞不占物理空间——层文件因此非常稀疏快照层的增量极小。只读层 可写层一写多读的关键叠层时底座是只读的 lower 层最上面盖一层可写的 upper 层由ImageFile统一封装见 image_file.rsupper 有三种写法日志结构LogStructured、稀疏Sparse与混合模式写放大与空间利用率按需取舍共享索引缓存premerged index cache多台 VM 共用同一批 lower 层时索引只需解析一次启动路径上省掉重复的索引加载开销。数据从哪来本地、对象存储与镜像仓库三后端 层文件不必都躺在本地。overlaybd 把数据源抽象成一组后端backend/mod.rs后端场景local本地层文件 / 本地缓存ossS3 兼容对象存储快照持久化落这里registryfs_v2直接从 OCI 镜像仓库远程读层tar/switchtar 适配与本地/远程缓存自动切换配合zfile压缩传输compression/zfile.rs与启动预取器prefetch.rs本地磁盘退化为有界缓存热数据留下、冷数据驱逐因此集群的镜像快照总容量可以比单机磁盘大几个数量级而启动依旧飞快——这就是 README 中生产环境 1.5M 镜像说法的底气。ublk让内核把虚拟磁盘当真实块设备 overlaybd 叠出来的虚拟磁盘还只是进程内的一块数据要挂进 Firecracker得让它变成内核认的块设备。ublkuser-space block device正是干这个的其 crate 位于 storage/ublk/用户态控制句柄通过 io_uring 向/dev/ublk-control发送 ADD 命令dev.rs 中的UVMUblkDevBuilder内核分配设备 ID创建字符设备/dev/ublkcN控制面与块设备/dev/ublkbN数据面内核把块 I/O 分发到 mmap 的 IO 描述符队列用户态队列线程异步处理全程跑在 tokio 运行时上避免内核线程上下文切换开销。设备本身要求内核 6.8设备创建与删除命令可直接参考 storage/ublk/README.md。OverlaybdTarget两块拼图的焊接点 ublk 设备需要一个背后有数据的 target。OverlaybdTargetoverlaybd_target.rs把ImageFile注册为设备后端读请求落到 target 后由 overlaybd 沿层链解析命中本地缓存直接返回未命中则回源 OSS/仓库内部状态用ArcSwap持有支持热切换镜像配置而不重建设备可选挂载启动包记录器StartupPackRecorder把启动热读集录制下来供下次秒开。一条读请求的完整旅程guest 文件系统 →/dev/ublkbN→ ublk 队列 →OverlaybdTarget→ImageFile层叠解析 → 本地层文件 / 远程 OSS / OCI 仓库。整条路径上没有任何一次整镜像落盘。镜像共享同一份内存快照多沙盒共用一块设备 存储层最妙的一笔在内存快照共享。沙盒暂停时内存被增量快照成 overlaybd 的 mem 层恢复时不走传统 userfaultfd 逐页拉取而是用这些只读内存层叠出一块只读 ublk 设备作为 Firecracker 的 File 型内存后端Firecracker 直接 mmap 这块设备首次写触发 COW 拷入匿名内存——底层设备永远不被修改多个从同一模板/快照启动的沙盒通过引用计数共享同一块 ublk 设备。这一步的连锁收益是所有同快照沙盒共享宿主页缓存同模板并发拉起时磁盘 I/O 大幅下降再叠加内存气球把 guest 闲置内存还给宿主生产环境做到了9.6x 的内存超卖比。工程落点ublk-daemon 统一收口 ⚙️块设备的 io_uring 控制面被刻意从节点服务中剥离交给长驻守护进程ublk-daemonstorage/ublk-daemon/所有 ublk 设备的创建、删除、快照都集中在一个进程内管理设备 ID 由 daemon 分配节点服务经 Unix 域套接字与之通信protocol.rs远程镜像 I/O 被调度到专用 runtime避免设备销毁时连带杀掉共享的 HTTP 连接池。沙盒侧则由 UblkDeviceManager 统一装配 rootfs、附加盘与内存设备并可配置[pool.block]预热 ublk 设备池把设备创建从恢复关键路径上摘出去。小结层叠块设备与镜像共享的设计取舍 ✅模块路径职责overlaybdstorage/overlaybd/LSMT 层叠格式、多后端按需读取、压缩与预取ublkstorage/ublk/用户态块设备暴露/dev/ublkbN异步 I/Oublk-daemonstorage/ublk-daemon/单进程收口设备生命周期守护远程 I/O沙盒集成src/sandbox/ublk/为 rootfs/附加盘/内存快照装配设备一句话总结overlaybd 用层叠 按需取数解决了镜像共享与容量问题ublk 用用户态块设备解决了高性能接入内核的问题——存储层因此既能承载百万级镜像又让快照恢复稳定在 50ms 量级。更完整的架构上下文可阅读官方文档 docs/src/internals/architecture.md。【免费下载链接】AgentENVAgentENV (AENV) is a distributed platform for running agent environments at scale.项目地址: https://gitcode.com/gh_mirrors/age/AgentENV创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表