Pular para o conteúdo principal

Protocolo vsock

Transporte​

ItemValor
lado do guestescuta na porta vsock 5000
lado do hostsocket Unix, ligado à porta 5000 por krun_add_vsock_port2 com listen=true
handshakenenhum: a conexão no socket Unix chega direto ao guest
mensagens por conexãoum job e um resultado

Frame​

Message framing

offset 0      4                          4 + N
┌──────┬──────────────────────────┐
│ N │ JSON (N bytes, UTF-8) │
└──────┴──────────────────────────┘
uint32 big-endian
  • N conta apenas o payload.
  • O frame máximo é 64 MiB. O leitor do host recusa um tamanho acima disso antes de alocar memória: sem o limite, um prefixo corrompido (até 4 GiB) faria o leitor alocar tudo antes de ler o corpo.
  • O host envia prefixo e corpo numa única escrita, para o guest nunca ler um prefixo sem o corpo correspondente.

Exemplo​

Job {"trace_id":"t1","lang":"python","code":"print(1)","timeout":10} tem 64 bytes de JSON:

00 00 00 40  7b 22 74 72 61 63 65 5f 69 64 22 3a ...
└─ 64 ─────┘ └─ {"trace_id": ...

Payloads​

Streaming​

Com "stream": true no job, o guest responde com vários frames em vez de um, todos no mesmo formato (tamanho + JSON), em internal/protocol:

{"type":"stdout","data":"early\n"}
{"type":"stderr","data":"warn\n"}
{"type":"result","result":{"status":"success","stdout":"early\n","stderr":"warn\n","exception":null,"executionTime":12}}
  • Um frame por escrita do processo no pipe (até 32 KiB no Linux), na ordem em que o guest leu.
  • O result é sempre o último e traz o resultado completo, igual ao do modo sem streaming.
  • Sem stream, o fio é idêntico ao anterior: um frame de resultado. A prova de prontidão (sh true) usa esse modo.
  • Se o host recebe um frame sem type, o guest da imagem é anterior ao streaming: rc image build refaz a imagem.

Operações​

O campo op do job escolhe a operação. Vazio é o job de código de sempre, para o fio dos jobs efêmeros não mudar; as outras servem às máquinas persistentes (internal/protocol).

opCampos usadosO que faz
(vazio)lang, code, files, stdin, timeout, streamroda código de uma linguagem
execargv, env, cwd, user, timeout, streamroda um programa sem shell implícito
put / getpath, offset, data, final, modecópia de arquivo em pedaços de 1 MiB (até 4 GiB por arquivo)
ptyargv, rows, cols, userterminal interativo: a conexão vira um canal de eventos input/resize (host) e output/exit (guest)
workloadargv, env, cwd, user, stop_on_exitliga o processo que a máquina mantém rodando
shutdownsignal, timeoutmanda o sinal ao workload, espera, faz sync e desliga
dialportdepois do resultado de sucesso, a conexão vira um tubo de bytes até 127.0.0.1:port dentro do guest (porta publicada)
set-envenvguarda os segredos na memória do guest e junta a todo comando seguinte; nunca vão para o disco
ssh-agentpath, portabre no guest um socket Unix que repassa cada conexão à porta vsock do host (agente SSH)
mount-s3path, s3, envmonta um bucket por FUSE no guest, depois de conferir que ele responde

Outras portas vsock​

PortaSentidoUso
5000host → guesttodas as operações acima
5001guest → hostagente SSH (--ssh-agent)
5100 + iguest → hosto i-ésimo --mount-socket