ADRIANOLAUREANO← Artigos
SÉRIE CASULO · 01/03LINUXRUST

O que é um container? Isolando nosso primeiro processo em Rust

docker run parece fazer um computador nascer em segundos. Mas, se não surgiu uma máquina virtual, o que realmente foi criado?

ARTIGO 24 · CASULO 0.1 · PROCESSOS E NAMESPACES

5visões isoladas

1kernel compartilhado

1init supervisor

CASULO · UM PROCESSO, VÁRIAS FRONTEIRAS
HOST LINUXPID 4821CPU · RAM · REDE/var/lib/casulo
CASULO 0.1
PIDMNTUTSNET
processomesmo kernel · outra visão
KERNEL COMPARTILHADOnamespaces · cgroups · mounts · signals

VOCABULÁRIO VISUAL

As peças do kernel que entram em cena.

01Processoprograma em execução
02Kernelnúcleo que atende chamadas do processo
03Namespacevisão isolada de um recurso
04PID 1primeiro processo e responsável pelos filhos
05Signalmensagem de controle entre processos
06Rootfsárvore de arquivos vista como raiz
O nome técnico vem depois do problema. Consulte este mapa quando uma peça reaparecer.
01
Primeiro, retire a caixa.
Programa, processo, container e máquina virtual

Um programa é um arquivo com instruções. Quando o sistema o carrega, cria um processo: memória, registradores, arquivos abertos e um identificador. Já percorremos esse início no artigo Como um computador executa um programa por dentro.

CoisaO que possuiKernel
Programabytes no disconenhum em execução
Processomemória e estado de execuçãousa o host
Container Linuxum ou mais processos com visões e limitescompartilha o host
Máquina virtualhardware virtual e sistema convidadopossui kernel convidado
Pergunta central

Se um container não é uma máquina virtual pequena, o que impede seu processo de enxergar e consumir tudo no computador?

02
O processo pede; o kernel decide.
Chamadas de sistema são a fronteira real

Para criar processo, abrir arquivo, montar filesystem ou enviar pacote, o programa pede ao kernel por uma chamada de sistema. A biblioteca Rust oferece uma interface mais segura, mas a decisão continua no kernel Linux. Por isso o Casulo é Linux: namespaces, cgroups, mounts e capabilities não são uma abstração portátil.

processo Casulo ── clone/unshare/mount ──▶ kernel Linux
processo filho  ◀── PID, memória, arquivos ──┘

nenhum kernel novo foi iniciado
Docker Desktop usa normalmente uma VM Linux em Windows e macOS justamente para obter esse kernel.
03
Separe a visão antes de limitar o consumo.
Por que namespaces existem

Nosso primeiro filho enxerga o hostname, todos os processos e as montagens do host. O kernel permite colocar um processo em namespaces: grupos que recebem uma visão própria de certos recursos.

NamespaceVisão separadaDemonstração
UTShostnameinterno: casulo-01
PIDárvore de processosfilho vira PID 1 dentro
mounttabela de montagens/proc próprio
IPCfilas e memória compartilhadaobjetos do host somem
usermapeamento de usuáriosroot interno pode mapear usuário externo

O Casulo 0.1 usa clone com flags delimitadas. Quando user namespace não está disponível, encerra com erro claro; não continua fingindo isolamento.

let flags = CloneFlags::CLONE_NEWPID
    | CloneFlags::CLONE_NEWUTS
    | CloneFlags::CLONE_NEWNS
    | CloneFlags::CLONE_NEWIPC;

clone(child_main, &mut stack, flags, Some(Signal::SIGCHLD as i32))?
04
O mesmo processo possui dois números verdadeiros.
Host e PID namespace
HOST                               DENTRO DO CASULO
PID 4821 casulo                    PID 1 /bin/sh
└─ PID 4822 /bin/sh   ◀ mesmo ─▶   └─ PID 7 sleep
   └─ PID 4830 sleep

host continua capaz de observar e administrar todos
Namespace não torna o processo invisível ao host; muda a visão recebida pelo processo contido.

O PID namespace é hierárquico. O host vê o identificador externo; dentro, o primeiro processo recebe 1. Isso traz responsabilidade.

05
PID 1 não pode abandonar seus filhos.
Sinais, reaping e encerramento

Processos terminados permanecem como registros mínimos até o pai chamar wait. Se o pai morre, órfãos chegam ao PID 1. Nosso init encaminha sinais para o processo principal e recolhe filhos para evitar zumbis.

loop {
    match waitpid(Pid::from_raw(-1), Some(WaitPidFlag::WNOHANG)) {
        Ok(WaitStatus::Exited(pid, code)) => record_exit(pid, code),
        Ok(WaitStatus::StillAlive) => break,
        Err(Errno::ECHILD) => break,
        other => handle_wait(other)?,
    }
}

SIGTERM pede parada graciosa. Depois do prazo configurado, SIGKILL encerra sem possibilidade de tratamento. O Casulo retorna o código do processo principal e sempre executa limpeza registrada.

06
Do comando ao primeiro processo.
casulo run
$ sudo casulo run ./rootfs /bin/sh
[casulo] id=01J... host_pid=4822
/ # hostname
casulo-01
/ # ps
PID COMMAND
  1 /bin/sh
  8 ps
validar rootfs e programa
 → criar registro de rollback
 → clone com namespaces
 → configurar hostname e /proc
 → iniciar supervisor PID 1
 → execve do programa
 → esperar saída
 → desmontar e limpar em ordem inversa
Se uma etapa falha, somente os recursos registrados são revertidos.
07
Casulo 0.1 ainda não é uma sandbox.
O que deliberadamente falta

Esta versão separa hostname, PIDs, mounts e IPC e pode usar mapeamento de usuário. Ela ainda não limita CPU ou memória, não cria rede privada, não aplica filtro de chamadas de sistema e recebe um rootfs preparado. Um processo pode esgotar recursos do host. Não execute código desconhecido.

Critérios objetivos

Testes comprovam hostname distinto, PID 1 interno, visibilidade externa pelo host, encaminhamento de SIGTERM, coleta de filhos e rollback de montagens temporárias. Testes privilegiados são marcados e pulados fora de Linux ou sem capacidades necessárias.

08
Fontes primárias e próximo problema.
A visão foi separada; faltam os arquivos

A implementação acompanha namespaces(7), clone(2), pid_namespaces(7) e signal(7). No próximo capítulo, responderemos de onde vêm /bin, /etc e bibliotecas — sem chamar chroot de container completo.

PROJETO COMPLETO · ESTADO EXATO DESTE CAPÍTULO

Baixe o Casulo 0.1.

Pacote exclusivo deste artigo, com código Rust, exemplos, testes condicionais para Linux e roteiro de limpeza. Não execute em produção nem use imagens desconhecidas.

Baixar Casulo 0.1 (.zip)Linux · Rust · requer privilégios documentados

O que este artigo fez você pensar?

Dúvidas, experiências e contrapontos ajudam a próxima pessoa a enxergar o assunto por outro ângulo.

Todos passam por moderação. Ao enviar, você concorda com a política de privacidade.

Receba os próximos artigos.

Uma mensagem quando uma nova investigação estiver pronta. Só isso.