vsock 与 virtio-fs
定义
在 MicroVM 中,客户机没有宿主的 Unix 套接字路径,也不能直接打开宿主文件描述符。需要两套专用通道:
- vsock(Virtual Socket):地址是「上下文标识 + 端口号」的套接字族。宿主与客户机可以在约定端口上建立连接,语义接近 TCP,但不走客户机的 IP 网络。
- virtio-fs:一种 virtio 设备,把宿主上的目录树导出给客户机,客户机将其挂载为普通文件系统。适合 workspace、用户卷等需要共享文件而不复制整盘的场景。
问题背景
客户机内核启动之后,宿主仍要完成四类动作:在已运行的实例中执行命令、提供交互式终端、读取日志、把目录或卷呈现给客户机。若把这些动作放到客户机 IP 网络上,则控制面与应用面混用,还依赖网络栈已经配置完成。vsock 把控制面固定在虚拟机监视器提供的通道上;virtio-fs 把文件共享固定在 virtio 设备上。二者都不要求客户机已经获得 IP。
机制说明
Box 使用的 vsock 端口
a3s-box-shim 与 guest-init
约定若干端口,定义在 src/core(例如
EXEC_VSOCK_PORT、PTY_VSOCK_PORT、ATTEST_VSOCK_PORT、PORT_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.rs、src/core/src/exec.rs。 - 宿主侧:
src/shim/。 - 客户机侧:
src/guest/init/src/exec_server.rs、pty_server.rs、attest_server/、port_forward.rs、volume.rs。
验证命令
a3s-box run -d --name vsock-demo alpine:3.20 -- sleep 3600 |
exec 在 MicroVM 路径上经过 vsock exec
server。若该通道未建立,exec
失败,工作负载进程却可能仍在运行;二者状态必须分开解读。
相关与易混
- 相关:MicroVM、KVM / HVF / WHPX 与 libkrun、卷与挂载
- 易混:vsock 不是容器的
-p端口发布。-p面向应用流量;vsock 面向宿主与客户机控制面。virtio-fs 也不是镜像层:它是运行期挂载,不进入镜像摘要。