Hello World 😁 💻
Continuando a jornada de explorar o kernel Linux, hoje iremos falar de um camarada bem relevante dentre os recursos do kernel, e que junto com o cgroup, faz um trabalho deveras interessante no sistema. Estamos falando do Namespace.
Quem és tu, Namespace?
No Linux, Namespace é uma funcionalidade do kernel que permite isolar recursos do sistema para que diferentes processos tenham “visões” separadas do sistema operacional. Isso faz com que um grupo de processos ache que é o único dono da máquina, quando, na verdade, existem vários outros grupos operando logo ao lado.
É um conceito fundamental que permite a existência dos Containers (como Docker e Kubernetes). Sem namespaces, um container poderia ver os arquivos, a rede e os processos de outro container.
Surgimento e evolução
A história dos namespaces no Linux está ligada à evolução do isolamento de processos e ao nascimento dos containers modernos. Ela não começou com Docker, na verdade começou quase 30 anos antes.
Antes de namespaces existirem no Linux, sistemas Unix já tentavam resolver o problema de isolar ambientes. Um dos primeiros conceitos importantes foi o chroot, introduzido no Unix Version 7 em 1979. Ele basicamente muda a raiz do filesystem visível para o processo.
Testando o chroot
Vamos fazer uma pequena demonstração de como funciona o chroot. Para isso, vamos instalar o BusyBox para simular um pequeno ambiente Linux e conseguir fazer com que o chroot funcione.
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.
Podemos observar pelos comandos ls e pwd que o sistema inteiro desapareceu, só existe o que está no chroot.
Mas fora do chroot, podemos ver que o filesystem (sistema de arquivo) se mantém intacto:

Chroot visto de fora no sistema.
Ou seja: O processo acredita que está na raiz ( / ), mas o kernel redirecionou a raiz do filesystem.
Isso era usado para ambientes de teste, segurança e servidores isolados. Mas tinha problemas sérios, pois isolava apenas filesystem. Não isolava processos, não isolava rede e era relativamente fácil escapar. Ou seja, o isolamento era muito fraco.
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.
