Comunicação vsock
O canal
O canal entre host e guest é um vsock (a VM de job nem tem rede):
- o guest escuta na porta vsock 5000;
- no host,
krun_add_vsock_port2comlisten=trueliga essa porta a um socket Unix num diretório de trabalho do cache; - o host conecta nesse socket Unix como em qualquer socket local.
Não existe handshake textual: a conexão no socket Unix já chega ao guest.
Formato da mensagem
Toda mensagem, nos dois sentidos, é:
+------------------------+----------------------+
| tamanho (4 bytes, BE) | payload JSON (UTF-8) |
+------------------------+----------------------+
- O tamanho é um inteiro sem sinal de 4 bytes, big-endian, e conta só o payload.
- O frame máximo é 64 MiB; o host recusa ler um frame acima disso.
O mesmo frame serve a todas as operações: o job efêmero e as operações das máquinas (exec, cópia de arquivo,
terminal, workload, porta publicada, segredos, agente SSH, S3), escolhidas pelo campo op do job.
Sequência
host guest
│ connect(socket Unix) ─────────────▶ accept (vsock 5000)
│ [tamanho][Job JSON] ──────────────▶ executa
│ ◀────────────── [tamanho][Result JSON]
│ fecha; a VM de job é destruída
Prontidão
A libkrun cria o socket Unix antes de o guest começar a escutar, então uma conexão bem-sucedida não prova que o guest está pronto. A espera de prontidão manda um job sh true a cada 1 ms até receber uma resposta. Só depois disso a VM recebe jobs reais.
Payloads
- Job:
{trace_id, lang, code, files[{name, content}], stdin, timeout}— veja Job request. - Resultado:
{trace_id, status, stdout, stderr, exception, executionTime, exit_code, error}— veja Job response.
Detalhes byte a byte em Protocolo vsock.