- Um texto que acompanha a história da implantação de servidores e dos problemas de isolamento de processos, destacando como os FreeBSD jails implementaram o conceito moderno de contêineres 10 anos antes da indústria
- Introduzidos no FreeBSD 4.0 em 2000, os jails expandiram o
chroot para oferecer isolamento completo de sistema de arquivos, rede e processos como recurso nativo do kernel
- O Linux chegou aos contêineres com o LXC em 2008 e o Docker em 2013, mas nesse processo acumulou camadas complexas de abstração como namespaces, cgroups e OCI
- O que o Docker resolveu muito bem foi o problema de empacotamento e distribuição (shipping) de aplicações; os jails são excelentes em isolamento, mas têm como fraqueza a ausência de um padrão nativo de distribuição
- A continuação abordará formas práticas de operação, como infraestrutura baseada em jails, snapshots com ZFS e provisionamento com Ansible
O problema da implantação inicial de servidores
- Há algumas décadas, o método padrão para colocar algo em um servidor era copiar arquivos manualmente via FTP com ferramentas como Total Commander, FileZilla e FAR Manager; usuários mais avançados usavam
scp ou rsync, mas a essência era a mesma
- Em projetos tocados por uma só pessoa, erros não eram um grande problema, mas ao gerenciar dezenas de projetos de clientes, isso se tornava crítico
- Em uma configuração típica de backend, vários sites compartilhavam a mesma instância do servidor web Apache e, portanto, o mesmo ciclo de vida; se o Apache caísse, todos caíam
- Quando havia um pico de tráfego, um site podia consumir todos os recursos e fazer com que outros sites no mesmo servidor sufocassem silenciosamente
- Administradores de sistemas tentavam automatizar com scripts de shell, mas não existia um método padronizado para controle de versão ou rollback, e era comum usar nomes de pastas de projeto com números incrementais ou timestamps
Dois problemas centrais que precisavam ser resolvidos
- Implantação (Deployment): era necessário um método universal que garantisse entrega confiável, evitasse erro humano, implementasse versionamento e rollback e cobrisse todos os casos de negócio
- Isolamento de processos (Process Isolation): era necessário proteger mutuamente aplicações e sistema, evitar que as exigências de uma aplicação quebrassem outra sem aviso e resolver conflitos de dependência
- As tentativas de resolver o problema de implantação evoluíram para os modernos pipelines de CI/CD, padrões de empacotamento e sistemas de controle de versão, mas a história do problema de isolamento é relativamente menos conhecida
Do chroot às máquinas virtuais
- O
chroot, introduzido pelo Bell UNIX em 1979, fornecia a um processo uma visão isolada do sistema de arquivos, impedindo acesso fora de uma subárvore — uma ideia primitiva, mas útil
- Limitação: isolava apenas o sistema de arquivos; ainda era possível interferir na rede, em outros processos e nos recursos do sistema, além de também ser possível escapar
- A primeira resposta realmente corporativa foi a máquina virtual (VM), popularizada pela VMware no fim dos anos 1990
- Ela fornecia a cada aplicação um ambiente de sistema operacional totalmente isolado, mas como cada VM incluía um SO completo, havia o custo de sobrecarga significativa e tempos de inicialização medidos em minutos
O nascimento dos FreeBSD Jails
- Em 2000, uma revolução silenciosa aconteceu não no Windows Server nem no Linux, mas no FreeBSD
- O FreeBSD opera de forma fundamentalmente diferente do Linux: enquanto o Linux fornece apenas o kernel e combina userland GNU, ecossistema de pacotes e escolhas por distribuição, o FreeBSD desenvolve, versiona e testa kernel, userland, ferramentas básicas e bibliotecas como um único sistema operacional completo
- A solução construída sobre essa base consistente foi o jail, anunciado por Poul-Henning Kamp e Robert Watson e incorporado ao FreeBSD 4.0 (março de 2000) como recurso nativo do kernel
- Cada jail possui sua própria visão de sistema de arquivos, pilha de rede e espaço de processos, e o sistema hospedeiro não fica visível
- Como compartilha o kernel do host, ele oferece sobrecarga praticamente nula e tempos de inicialização quase instantâneos
- O FreeBSD alcançou em produção uma implementação prática do que hoje chamamos de contêineres 10 anos antes da indústria
Linha do tempo das tecnologias de isolamento
- O caminho real de evolução do problema de isolamento foi: servidor compartilhado sem isolamento → máquina virtual pesada, porém isolada → contêiner leve e isolado
- O FreeBSD chegou ao terceiro estágio em 2000; o Linux chegou com o LXC em 2008; o Docker surgiu em 2013
- Quando o Docker foi celebrado como revolucionário, os FreeBSD jails já estavam maduros e comprovados em campo havia 13 anos
Por que o Linux venceu
- Superioridade técnica não garante vitória em guerras de ecossistema
- O Linux venceu com tomada de decisão rápida, o efeito viral da licença GPL e o forte suporte corporativo de Red Hat e IBM
- Depois, Google, Facebook e Amazon passaram a desenvolver ferramentas para datacenters em grande escala e definiram a direção de toda a indústria
- O Linux deixou de ser “o SO gratuito para quem não podia pagar licença comercial” e se transformou em “a única opção para servidores”
A complexidade do ecossistema de contêineres no Linux
- Para resolver os problemas de isolamento e implantação, engenheiros de Linux construíram primitivas de kernel como namespaces, cgroups e seccomp e depois empilharam sobre elas camadas complexas de abstração: LXC (2008) → OCI/runc (2015) → Docker/Podman (2013/2018) → Docker Hub etc.
- O resultado foi um aglomerado excessivamente engenheirado de abstrações vazantes (leaky abstractions) voltado para infraestruturas em nuvem e dependentes de fornecedores
- Hoje, para operar aplicações em sistemas de grande escala, containerizar com Docker e orquestrar com Kubernetes virou o padrão implícito, apresentado não como uma entre várias opções, mas como a escolha óbvia
A contribuição do Docker e a fraqueza dos Jails
- O que o Docker resolveu muito bem foi o problema de shipping: empacotar aplicações com todas as suas dependências, distribuí-las via registry e executá-las da mesma forma em qualquer máquina, oferecendo um padrão universal
- O formato de imagem OCI se consolidou como padrão de fato da indústria
- Os jails resolvem muito bem o problema de isolamento, mas não têm uma solução nativa para shipping, e esse é o principal motivo de o ecossistema de jails parecer menos maduro do que o do Docker
- A comunidade reconhece essa lacuna, e algumas ferramentas (
cbsd, bastille, pot, appjail etc.) tentam imitar o ecossistema moderno de contêineres, enquanto também existem abordagens diferentes que aproveitam primitivas nativas do FreeBSD
Prévia da continuação
- Na próxima parte, serão abordadas a simplicidade e a elegância da infraestrutura baseada em FreeBSD, os fundamentos dos jails e seu funcionamento, a redução de boilerplate com gerenciadores de jail, o provisionamento e a implantação com Ansible, o poder dos snapshots com ZFS e como combinar tudo isso para construir uma infraestrutura robusta e escalável para a Hypha
1 comentários
Comentários do Hacker News
Não foi possível vencer a guerra de ecossistemas só com superioridade técnica
Em meados dos anos 90, o Linux cresceu graças à tomada de decisão rápida, à natureza contagiosa da licença GPL e ao apoio corporativo da Red Hat e da IBM
Instalei Linux em 1994, mas na comunidade FreeBSD ignoraram meu PC de US$ 3.500, dizendo que era “meia-boca”
Havia bugs na interface IDE, mas o Linux publicou uma solução alternativa em poucos dias, enquanto o lado BSD só mandava comprar equipamento SCSI
Eu era universitário na época e não tinha dinheiro, então o Linux acabou sendo a escolha prática
Mais tarde voltei a experimentar o FreeBSD, mas o Linux já fazia tudo de que eu precisava
O bug relacionado está documentado no artigo da Wikipédia sobre CMD640
Mesmo assim, gosto do fato de o FreeBSD ter mais consistência no sistema e manter estáveis componentes centrais como som e APIs de eventos
O suporte a drivers para hardware recente ainda é melhor no Linux, mas espero que o FreeBSD não fique “linuxificado” demais
Na prática, qualquer *nix moderno faz quase tudo. Agora a questão é mais de preferência e familiaridade do que de desempenho
Já o BSD enfrentou rejeição das empresas por causa do processo com a AT&T, e nesse intervalo o Linux dominou o mercado
Até hoje aparecem textos defendendo o FreeBSD, mas é difícil quebrar uma tendência consolidada nos anos 90
Ainda assim, continuo achando que o suporte a hardware ainda tem bastante espaço para melhorar
O texto foi interessante
Não concordo com a ideia de que primitivas de kernel do Linux como namespaces, cgroups e seccomp acabaram criando um ecossistema de abstrações complexas
O Linux ficou complexo porque teve sucesso, não por causa de um projeto fracassado
Se o BSD tivesse virado dominante, o mesmo ecossistema “superengenheirado” teria surgido do mesmo jeito
Contêineres no fim das contas não passam de VMs leves, então acho melhor usar VMs de verdade
O Docker ficou popular por causa da reutilização e do ecossistema, não por isolamento de segurança
O jail do FreeBSD é simples e elegante, mas os contêineres OCI no Linux são muito mais fáceis de usar
Contêineres não são uma funcionalidade isolada do kernel, e sim uma ilusão composta pela combinação de vários namespaces, mounts e isolamento de processos
O design do Linux é intencional, e cgroups e seccomp são amplamente usados também fora dos contêineres, em coisas como systemd e flatpak
A filosofia de “gado vs animal de estimação” pode ser aplicada no nível de VM e de orquestração
Dizer que jails são melhores não me parece muito convincente na prática
O Docker venceu não por isolamento técnico, mas por ecossistema
Com ferramentas como Dockerfile, registro público e Compose, dava para montar um ambiente executável em 30 segundos
O jail do FreeBSD era tecnicamente excelente, mas a barreira de entrada era alta
Mais recentemente, por causa da complexidade da stack de contêineres, também se vê um movimento de volta a jails ou VMs mais simples
Mas não é uma questão de competição; cada um só cumpre um papel diferente
No FreeBSD não existe esse conceito, e também falta um sistema de imagens
Se o FreeBSD tivesse investido em UX e ecossistema como o Docker fez, sua base de usuários teria crescido várias vezes
Por volta de 2005, cheguei a operar a empresa inteira sobre FreeBSD
Mas com o tempo o Linux passou a dominar tanto no uso pessoal quanto no trabalho
Hoje até o Docker já é bom o suficiente, e não existe mais uma razão lógica para voltar
Mas demorou a responder à era das CPUs multicore e acabou ficando para trás em relação a Linux e Windows
Hoje o desempenho se recuperou, mas continua em desvantagem por causa da falta de drivers e do limite no número de desenvolvedores
Eu uso Linux onde preciso de GPU ou CUDA, e FreeBSD em servidores estáveis
O UX do FreeBSD é mais consistente, mas, na prática, o Linux virou o “caminho feliz”
Textos apresentando o FreeBSD são sempre bem-vindos
O FreeBSD introduziu jail em 2000, mas o Linux já tinha tecnologias parecidas como OpenVZ e VServer
No fim, quando o LXC apareceu no fim dos anos 2000, surgiu a percepção de que “o FreeBSD estava na frente”
Fico curioso se existe algum texto que explique tecnicamente a forma de implementação do isolamento em contêineres e VMs
Não só no nível de “compartilham o mesmo kernel, então é mais fraco”, mas nos detalhes reais de implementação
Ultimamente, por causa de recursos como o systemd-oomd, tenho pensado em voltar para o FreeBSD
Antigamente eu deixava vários processos rodando no terminal e trabalhava registrando logs,
mas agora o systemd acaba matando processos inteiros por unidade de cgroup, e o trabalho se perde
Esse tipo de mudança de sistema incompatível quebra o fluxo de desenvolvimento, e é frustrante ter de recorrer toda hora a systemd-run ou Docker para isolar processos
O ponto central do sucesso do Linux foi a contagiosidade da GPL e o efeito de rede
À medida que os usuários passaram a enxergar o Linux como padrão, os fabricantes de hardware naturalmente começaram a lançar drivers para Linux
Graças à flexibilidade do kernel, o ecossistema de drivers open source cresceu de forma explosiva