Cómo usar VSOCK con libzmq: soporte nativo para comunicación entre máquinas virtuales

Fuentes: Use VSOCK with libzmq

AF_VSOCK (VSOCK) es una familia de direcciones de socket presente en el kernel de Linux desde la versión 4.8 —originalmente desarrollada por VMware como VMCI— que permite la comunicación entre una máquina virtual (invitado) y el hipervisor (anfitrión), así como entre invitados en un mismo host. Funciona de forma análoga a un socket Unix con semántica similar a TCP/UDP: emplea identificadores de contexto (CID) de 32 bits —con valores reservados como VMADDR_CID_ANY, VMADDR_CID_HYPERVISOR, VMADDR_CID_HOST y VMADDR_CID_LOCAL, este último añadido en Linux 5.6— y puertos también de 32 bits, reservados los inferiores a 1024 para root. Su uso reemplazó en muchos escenarios al puerto serie como vía de comunicación entre invitado e hipervisor, como ilustra el qemu-guest-agent de Proxmox.

Aunque VSOCK cuenta con bindings de bajo nivel en Python, C, Go y Rust, no existía una abstracción de alto nivel que ocultara los detalles del socket. Para cubrir ese vacío, el autor propuso y desarrolló una implementación de transporte VSOCK dentro de libzmq (ZeroMQ), basándose en el código VMCI ya existente. La integración, materializada en el pull request #4822 del repositorio de zeromq/libzmq, permite aprovechar AF_VSOCK desde cualquier lenguaje con binding de libzmq (Python, Ruby, Node.js, Perl, Java, Lua) y beneficiarse de funcionalidades como autenticación CurveZMQ y patrones de mensajería req/rep o pub/sub. Mientras la funcionalidad llega a una versión estable, el autor mantiene un fork de pyzmq (pyzmq-vsock) compilado con el commit más reciente de libzmq. El artículo incluye ejemplos prácticos: un 'Hello World' sobre loopback VSOCK con QEMU y un caso más avanzado que combina asyncio y autenticación CurveZMQ.