拓冰建站拓冰建站
首页 / 资讯中心 / 正文

Firecracker 如何配置 virtio-vsock 设备并打通主机与客户机之间的 vsock 连接

Firecracker 如何配置 virtio-vsock 设备并打通主机与客户机之间的 vsock 连接【免费下载链接】firecrackerSecure and fast microVMs for serverless computing.项目地址: https://gitcode.com/GitHub_Trending/fi/firecracker本文解决的问题是在已经跑起来的 Firecracker microVM 上配置 virtio-vsock 设备让主机上的程序与客户机内的程序通过 vsock 建立双向连接。完成配置后主机可以通过一个 AF_UNIX socket 主动发起连接并转发到客户机的某个 vsock 端口客户机也可以主动连接回主机host CID 固定为 2。官方文档 假设读者已熟悉 Firecracker 的启动方式与 API socket 用法并了解 Unix socket 编程运行前提可参考 getting started 指南需要 KVM 环境Firecracker 进程以--api-sock启动。前提内核配置与 vsock 设备检查vsock 依赖两侧内核配置这是 vsock 文档 明确列出的前提主机内核配置需包含CONFIG_VHOST_VSOCKm客户机内核配置需包含CONFIG_VIRTIO_VSOCKETSy确认 vsock 可用的方式是在客户机内执行ls /dev/vsock看到/dev/vsock设备存在即可。Firecracker CI 使用的客户机内核配置可以作参考位于 resources/guest_configs/。另外准备一个 socat版本 1.7.4.0 或更高用于后文的连接示例。理解连接模型AF_VSOCK 端口与 AF_UNIX socket 的 1:1 映射Firecracker 在 VMM 内实现 virtio-vsock 设备模型绕过主机内核的 vhost 代码在主机侧的 AF_UNIX socket 与客户机侧的 AF_VSOCK socket 之间中转数据。为了实现通道复用客户机的AF_VSOCK端口与主机上的AF_UNIXsocket 按 1:1 映射设备必须配置一个主机侧AF_UNIXsocket 路径即uds_path例如/path/to/v.sock。按连接发起方向分两种情况主机发起连接microVM 启动后Firecracker 会监听uds_path上的 AF_UNIX socket。主机程序连接该 Unix socket 后立即发送文本命令CONNECT port\nport为十进制端口号\n是 ASCII 0x0A 行结束符。如果客户机有程序在该端口listen()Firecracker 会把这条连接转发过去并向主机端回送确认消息OK assigned_hostside_port\n如果无人监听Firecracker 会直接断开主机侧连接。客户机发起连接当 Firecracker 检测到来自客户机的连接请求VIRTIO_VSOCK_OP_REQUEST包时会尝试把它转发到主机上监听在uds_path_PORT的 AF_UNIX socket其中PORT是连接请求包里的目标端口十进制。例如配置uds_path为./v.sock时客户机连到端口 52 就会被转发到./v.sock_52。如果该 socket 不存在或无人监听连接建立失败Firecracker 会向客户机回送VIRTIO_VSOCK_OP_RST包。配置 virtio-vsock 设备设备需要两个参数客户机 CID 和主机侧 AF_UNIX socket 路径。注意该 API 只能在开机前pre-boot调用即 Firecracker 进程已启动、但尚未发送InstanceStart之前curl --unix-socket /tmp/firecracker.socket -i \ -X PUT http://localhost/vsock \ -H Accept: application/json \ -H Content-Type: application/json \ -d { guest_cid: 3, uds_path: ./v.sock }其中/tmp/firecracker.socket是 Firecracker 进程启动时--api-sock指定的 API socket 路径guest_cid是分配给客户机的 vsock CIDuds_path是主机侧中转用的 AF_UNIX socket 路径。API 定义见 swagger 规范 中的Vsock定义uds_path用于代理 vsock 连接客户机主动连接时会被转发到形如uds_path_port的 socket。microVM 启动后Firecracker 会创建并开始监听uds_path上的 socket。后续步骤中的./v.sock均指这里配置的uds_path。验证一主机连接客户机以客户机内的 52 端口为例子。先在客户机里让端口被监听socat VSOCK-LISTEN:52,fork -然后在主机侧连接./v.sock并发起对该端口的连接请求$ socat - UNIX-CONNECT:./v.sock CONNECT 52连接建立后socat会显示确认消息文档示例输出为OK 1073741824以上1073741824是文档示例值实际会话分配到的端口号可能不同。看到OK port\n即表示主机侧socat与客户机侧socat之间的通道已经打通。如果发送CONNECT后连接直接被断开而没有确认消息说明客户机该端口无人监听。验证二客户机连接主机先让主机侧监听与客户机目标端口对应的 AF_UNIX socket仍用 52 端口socat - UNIX-LISTEN:./v.sock_52再在客户机内创建 AF_VSOCK socket 并连接到主机的 CID即整数 2和该端口socat - VSOCK-CONNECT:2:52主机侧的socataccept()到连接后通道即在双方之间建立。如果主机上不存在./v.sock_52或无人监听客户机会收到VIRTIO_VSOCK_OP_RST连接建立失败。已知限制与可选操作vsock 快照支持目前有限。跨快照恢复时 vsock 设备会被 reset恢复瞬间可能出现网络与 vsock 丢包客户机内的 vsock 监听 socket 在 VM 重新激活后仍保持可用。具体说明见 快照支持的 vsock 设备 reset 一节。快照恢复时的 UDS 路径冲突在未使用 jailer 的环境中若两个 VM 使用相同 UDS 路径恢复快照可能在同一端口上发生路径冲突。此时可在snapshot/loadAPI 中用vsock_override参数指定新的 UDS 路径恢复后该 VM 的所有连接都会以新路径作为前缀curl --unix-socket /tmp/firecracker.socket -i \ -X PUT http://localhost/snapshot/load \ -H Accept: application/json \ -H Content-Type: application/json \ -d { snapshot_path: ./snapshot_file, mem_backend: { backend_path: ./mem_file, backend_type: File }, vsock_override: { uds_path: ./v.sock.2, } }配置本身只有两个参数验证的关键在于两个方向的连接行为主机发起时以OK port\n确认消息判断成功、无确认即失败客户机发起时以主机侧uds_path_port是否被accept()判断成功。出现连接直接断开或 RST 时按上述两条检查对应侧的监听进程是否已就绪即可。【免费下载链接】firecrackerSecure and fast microVMs for serverless computing.项目地址: https://gitcode.com/GitHub_Trending/fi/firecracker创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门