Hello World 😁 💻
Seguindo na minha jornada de explorar o kernel Linux, hoje eu quero falar de um recurso que, junto com os cgroups, sustenta boa parte do que a gente usa hoje quando fala de containers. O nome dele é namespace.
Mas afinal, o que é um namespace?
No Linux, namespaces são uma funcionalidade do kernel que permite isolar recursos do sistema. Na prática, isso faz com que diferentes processos enxerguem o sistema de maneiras diferentes, mesmo estando todos rodando na mesma máquina.
É como se cada grupo de processos tivesse sua própria “versão” do sistema operacional.
É justamente isso que permite que tecnologias como Docker e Kubernetes funcionem.
Mas esse tipo de isolamento não apareceu do nada.
Antes dos namespaces, já existia uma tentativa de resolver esse problema. Um exemplo clássico é o chroot, lá do Unix Version 7, em 1979.
A ideia era simples: mudar a raiz do sistema de arquivos visível para um processo. Em vez de enxergar o sistema inteiro, ele passa a enxergar só um diretório específico, como se aquilo fosse tudo.
Dá pra testar isso de forma bem direta instalando o BusyBox:
sudo apt install busybox-static
Comando de instalação do BusyBox estático.

Instalação do BusyBox.
Agora iremos criar um diretório que servirá como novo diretório raiz para o ambiente chroot e fazer as configurações necessárias para tornar isso possível. Iremos chamar esse novo diretório de meu-chroot.
mkdir -p ~/meu-chroot/bin cp /bin/busybox ~/meu-chroot/bin/ ln -s busybox ~/meu-chroot/bin/sh
Criação do diretório e configurações necessárias para o chroot.
Legenda dos comandos:
- Criação da estrutura do novo root;
- Cópia do BusyBox para o novo sistema;
- Criação do shell dentro do chroot.

Comandos no terminal.
O comando a seguir inicia um shell dentro do ambiente chroot, usando o diretório criado anteriormente como nova raiz do sistema de arquivos.
sudo chroot ~/meu-chroot /bin/sh
Execução do shell dentro do chroot.

Resultado da execução do shell dentro do chroot.
Lá dentro, parece que o sistema inteiro sumiu. Só existe o que você colocou naquele diretório. Mas, fora dali, nada mudou. O sistema continua exatamente o mesmo.
Ou seja, o processo acha que está na raiz, mas o kernel só redirecionou o que ele pode enxergar.
Mas fora do chroot, podemos ver que o filesystem (sistema de arquivo) se mantém intacto:

Chroot visto de fora no sistema.
O processo acredita que está na raiz ( / ), mas o kernel redirecionou a raiz do filesystem.
O problema é que isso era só uma ilusão parcial. O chroot isola o sistema de arquivos, mas não isola processos, não isola rede e nem é tão difícil de contornar em alguns cenários. Para o tipo de isolamento que se precisava, isso não era suficiente.
É aí que entram os namespaces.
Em vez de mexer só no sistema de arquivos, a ideia passa a ser isolar diferentes partes do sistema de forma independente. Não é mais uma única “gambiarra” para simular isolamento. É um conjunto de mecanismos pensados exatamente para isso.
Cada tipo de recurso ganha sua própria forma de isolamento.
Namespace no Linux
O primeiro namespace do Linux surgiu em 2002, o Mount Namespace. Ele permitia que processos tivessem visões diferentes do filesystem montado.
Depois disso o Linux começou a adicionar mais tipos de namespaces. Esses são os principais namespaces do kernel Linux e o ano de surgimento de cada um deles:
1) 2002 — Mount Namespace - Kernel Linux 2.4.19
Primeiro namespace introduzido no Linux. Permite que processos tenham visões diferentes da árvore de montagem de arquivos. Exemplo:
- um processo monta um filesystem;
- outro processo não vê essa montagem.
Isso é essencial para containers.
2) 2006 — UTS Namespace - Kernel Linux 2.6.19
Isola:
- hostname;
- domain name.
Assim cada container pode ter seu próprio hostname.
3) 2006 — IPC Namespace - Kernel Linux 2.6.19
Isola mecanismos de comunicação entre processos:
- shared memory;
- message queues;
- semáforos.
Evita que processos de containers diferentes compartilhem esses recursos.
4) 2008 — PID Namespace - Kernel Linux 2.6.24
Permite que processos tenham tabelas de PID separadas. Exemplo:
- um processo pode ser PID 1 dentro do container;
- mas ter outro PID no sistema host.
Isso possibilita que containers tenham seu próprio init.
5) 2009 — Network Namespace - Kernel Linux 2.6.29
Isola completamente a pilha de rede:
- interfaces;
- rotas;
- firewall;
- portas.
Cada container pode ter:
- sua própria interface;
- seu próprio IP.
6) 2013 — User Namespace - Kernel Linux 3.8
Permite mapear IDs de usuários diferentes entre host e container. Exemplo:
- root dentro do container;
- usuário comum no host.
Isso trouxe muito mais segurança para containers.
7) 2016 — Cgroup Namespace - Kernel Linux 4.6
Isola a visão dos cgroups para processos dentro de containers.
8) 2020 — Time Namespace - Kernel Linux 5.6
Permite que processos tenham visões diferentes do tempo do sistema.
Isola dois relógios principais do Linux:
- CLOCK_MONOTONIC
- CLOCK_BOOTTIME
Isso permite que processos dentro de um container tenham offsets de tempo diferentes do host. Exemplo:
- o host iniciou há 10 dias;
- um container pode ver o sistema como iniciado há poucos minutos.
Tabela de referência rápida:

Exemplo Ilustrativo
Para ilustrar melhor, imaginaremos um prédio com vários apartamentos:
- O prédio = sistema operacional;
- Cada apartamento = namespace;
- Pessoas dentro de um apartamento não veem o que acontece nos outros.
Mesmo que todos estejam no mesmo prédio, cada apartamento tem sua própria visão do ambiente.
No Linux funciona parecido: um processo pode estar em um namespace onde ele vê apenas seus próprios processos, rede, usuários, etc.

Exemplo ilustrativo do funcionamento do Namespace no Linux.
Exemplo prático
Para um exemplo prático vamos usar o Network Namespace. É a uma forma fácil de visualizar o isolamento, pois criaremos um "universo paralelo" de rede dentro do computador que nem mesmo será possível pingar o mundo exterior até que haja autorização. Imagine que vamos criar um pequeno bunker digital chamado bunker_secreto.
1. Criando o Namespace
Precisaremos de privilégios de sudo para manipular o kernel.
Primeiro, criaremos o isolamento de rede:
sudo ip netns add bunker_secreto
Criação do namespace.
2. Listando as interfaces dentro do "bunker"
Se rodarmos o comando abaixo, veremos que o comando ip link é executado dentro do namespace.
sudo ip netns exec bunker_secreto ip link
Execução do comando dentro do namespace.

Criação do isolamento e listagem das interfaces.
O que acontece: Veremos apenas a interface lo (loopback) e ela estará DOWN. Esse processo não enxerga o Wi-Fi da máquina ou a placa de rede Ethernet. Ele está isolado.
3. O teste do isolamento (Ping)
Vamos pingar o Google de dentro do namespace:
sudo ip netns exec bunker_secreto ping 8.8.8.8
Teste de ping.

Resultado do ping.
Como podemos ver, não foi encontrada nenhuma rede. Mesmo que a internet esteja funcionando perfeitamente, para qualquer processo rodando ali dentro, a internet não existe.
Agora se testarmos o ping de fora do namespace:
sudo ping 8.8.8.8
Teste de ping.

Resultado do ping.
Veremos que a internet está funcionado perfeitamente fora dele.
Conclusão
Em resumo, namespaces são um mecanismo do kernel Linux que permite criar ambientes isolados dentro do mesmo sistema operacional. Eles funcionam fazendo com que diferentes processos tenham visões separadas de recursos do sistema, como processos, rede, usuários e sistema de arquivos. Esse isolamento torna possível executar várias aplicações de forma independente no mesmo kernel, sendo uma das bases tecnológicas que viabilizam o funcionamento de containers e outras formas modernas de virtualização leve.
Com esse artigo, exploramos mais uma pecinha do universo Linux. Estou adorando esse processo de entender o que ocorre por "debaixo dos panos" desse adorável sistema operacional. Espero que tenham gostado também.
Obrigada pela atenção e até breve! 😁
Laryssa Ramos.
