Take-away
-
定义:virtio-vsock是一种专门用于Guest VM和Host OS交互的网络设备。他一端是Guest VM中的用户态应用,另一端是Host OS上的用户态应用
-
应用场景:目前在kata-container场景中频繁使用,本文中会时常使用kata-container作为应用背景。
-
实现方式:本文以vhost-kernel方案为例进行说明
使用方式
给一个简单的python使用范例
Server code
Python
#!/usr/bin/env python3
import socket
CID = socket.VMADDR_CID_HOST
PORT = 9999
s = socket.socket(socket.AF_VSOCK, socket.SOCK_STREAM)
s.bind((CID, PORT))
s.listen()
(conn, (remote_cid, remote_port)) = s.accept()
print(f"Connection opened by cid={remote_cid} port={remote_port}")
while True:
buf = conn.recv(64)
if not buf:
breakprint(f"Received bytes: {buf}")
Client code
Python
#!/usr/bin/env python3
import socket
CID = socket.VMADDR_CID_HOST
PORT = 9999
s = socket.socket(socket.AF_VSOCK, socket.SOCK_STREAM)
s.connect((CID, PORT))
s.sendall(b"Hello, world!")
s.close()
其中值得说明的是:
-
AF_VSOCK,是一个特殊的socket family,需要指定使用AF_VSOCK创建socket接口
-
<cid, port>: vsock的网络地址用<cid, port> 来表示,其中cid唯一指定一个VM,每个VM都有固定的cid,port是user app自己指定
QEMU启动方法
使用QEMU启动VM时,需要额外的参数配置
Python
qemu-system-x86_64 -device vhost-vsock-pci,guest-cid=123
其中
- guest-cid指定当前启动VM的cid,也就是上文中提到的vsock网络地址的<cid, port>中的cid