vsock 与 virtio-fs

定义

MicroVM 中,客户机没有宿主的 Unix 套接字路径,也不能直接打开宿主文件描述符。需要两套专用通道:

  • vsock(Virtual Socket):地址是「上下文标识 + 端口号」的套接字族。宿主与客户机可以在约定端口上建立连接,语义接近 TCP,但不走客户机的 IP 网络。
  • virtio-fs:一种 virtio 设备,把宿主上的目录树导出给客户机,客户机将其挂载为普通文件系统。适合 workspace、用户卷等需要共享文件而不复制整盘的场景。

问题背景

客户机内核启动之后,宿主仍要完成四类动作:在已运行的实例中执行命令、提供交互式终端、读取日志、把目录或卷呈现给客户机。若把这些动作放到客户机 IP 网络上,则控制面与应用面混用,还依赖网络栈已经配置完成。vsock 把控制面固定在虚拟机监视器提供的通道上;virtio-fs 把文件共享固定在 virtio 设备上。二者都不要求客户机已经获得 IP。

机制说明

Box 使用的 vsock 端口

a3s-box-shimguest-init 约定若干端口,定义在 src/core(例如 EXEC_VSOCK_PORTPTY_VSOCK_PORTATTEST_VSOCK_PORTPORT_FWD_VSOCK_PORT)。对应服务位于 src/guest/init/src/

服务 作用
exec server 在客户机内启动附加进程,返回输出与退出码
PTY server 交互式终端与窗口尺寸调整
attest server TEE / 证明相关的客户机侧端点
port forward 把发布端口或宿主中继接到客户机监听

Windows 路径上的停止请求还使用约定文件,而不是完全依赖 vsock,见 WINDOWS_STOP_REQUEST_FILE。这是平台差异,不改变「控制面必须事先约定」这一原则。

virtio-fs 与 raw 根盘的分工

rootfs 可以是客户机自己的块设备(ext4 raw 磁盘),也可以是导出的目录。Box 在 macOS 上的当前默认是 guest-native ext4 raw 磁盘:启动配置与退出状态走私有控制交接,而不是让宿主在运行期挂载活动根盘。virtio-fs 更适合额外的 workspace 与用户卷。把根与卷分开,可以避免宿主在崩溃恢复时解析未重放的客户机元数据。

与共享内核路径的对比

Sandbox 没有客户机内核,因此不需要 vsock。exec、PTY 与文件操作走 OCI Runtime 的本地 IPC 与描述符受限会话。Box 的 CLI attach / cp / exec 在 OCI 路由上不得回退到「Box 拥有的 runtime socket」。同一条用户命令,底层通道不同。

在 Box 中的位置

  • 端口常量与实例规格:src/core/src/vmm.rssrc/core/src/exec.rs
  • 宿主侧:src/shim/
  • 客户机侧:src/guest/init/src/exec_server.rspty_server.rsattest_server/port_forward.rsvolume.rs

验证命令

a3s-box run -d --name vsock-demo alpine:3.20 -- sleep 3600
a3s-box exec vsock-demo -- uname -a
a3s-box rm -f vsock-demo

exec 在 MicroVM 路径上经过 vsock exec server。若该通道未建立,exec 失败,工作负载进程却可能仍在运行;二者状态必须分开解读。

相关与易混

  • 相关:MicroVMKVM / HVF / WHPX 与 libkrun卷与挂载
  • 易混:vsock 不是容器的 -p 端口发布。-p 面向应用流量;vsock 面向宿主与客户机控制面。virtio-fs 也不是镜像层:它是运行期挂载,不进入镜像摘要。