Skip to content

Namespaces

Namespaces foram adicionados no kernel Linux na versão 2.6.24 e são eles que permitem o isolamento de processos quando estamos utilizando o Docker.

  • PID namespace: Permite que cada container tenha seus próprios identificadores de processos.

  • Net namespace: Permite que cada container possua sua interface de rede e portas. Para que seja possível a comunicação entre os containers, é necessário criar dois Net Namespaces diferentes, um responsável pela interface do container (normalmente, chamada de eth0) e outro responsável por uma interface do host, normalmente chamada de veth* (veth + um identificador aleatório). Essas duas interfaces estão “linkadas” através da bridge Docker0 no host, que permite a comunicação entre containers através de roteamento de pacotes.

  • Mnt namespace: É a evolução do chroot. Permite que cada container possa ser o dono do seu ponto de montagem, bem como de seu sistema de arquivos raiz. Ele garante que um processo rodando em um sistema de arquivos não consiga acessar outro sistema de arquivos montado por outro Mnt namespace.

  • IPN namespace: Provê um SystemV IPC (Comunicação Interprocessual) isolado, além de uma fila de mensagens POSIX própria.

  • UTS namespace: Responsável por prover o isolamento de hostname, nome de domínio, versão de SO, etc.

  • User namespace: Mantém o mapa de identificação de usuários em cada container.

Criando um container sem usar o Docker, só com Namespaces.

Executar os comandos abaixo em uma VM.

O debootstrap é uma ferramenta que irá instalar um sistema base Debian em um subdiretório de outro sistema já instalado.

Instalando o debootstrap
apt-get install debootstrap -y

O debootstrap faz o download de um sistema base no diretório indicado no comando.

Usando o debootstrap
debootstrap stable /debian http://deb.debian.org/debian
  • stable: Versão do Debian
  • /debian: Diretório de destino
  • http://deb.debian.org/debian: Endereço do repositório

O comando unshare executa um programa com alguns namespaces não compartilhados do processo pai.

Comando unshare
unshare --mount --uts --ipc --net --map-root-user --user --pid --fork chroot /debian bash
  • --mount: Isola o namespace de montagens
  • --uts: Isola o namespace UTS (hostname, etc.)
  • --ipc: Isola o namespace de IPC do SystemV
  • --net: Isola o namespace de rede
  • --map-root-user: mapeia usuário atual para root
  • --user: Isola o namespace do usuário
  • --pid: Isola o namespace do pid
  • --fork: faz um fork antes de executar o <programa>
  • chroot /debian bash: O chroot altera o diretório raiz do host para que os arquivos que estão no diretório /debian quando executado pelo bash no ambiente isolado.


No ambiente isolado, para conseguir visualizar os processos, é necessário montar o diretório /proc.

Montagem do diretório /proc
mount -t proc none /proc


Também é interessante montar os diretórios /sys e /tmp que são utilizados por sistemas Linux.

Montagem dos diretórios /sys e /tmp
mount -t sysfs none /sys
mount -t tmpfs none /tmp

No host, para listar as namespaces utilizadas, use o comando lsns.

A saída do comando será semelhante à abaixo:

Saída do comando lsns
NS TYPE NPROCS PID USER COMMAND
4026531834 time 108 1 root /sbin/init
4026531835 cgroup 108 1 root /sbin/init
4026531836 pid 107 1 root /sbin/init
4026531837 user 106 1 root /sbin/init
4026531838 uts 104 1 root /sbin/init
4026531839 ipc 106 1 root /sbin/init
4026531840 net 106 1 root /sbin/init
4026531841 mnt 103 1 root /sbin/init
4026532163 mnt 1 300 root ├─/usr/lib/systemd/systemd-udevd
4026532164 uts 1 300 root ├─/usr/lib/systemd/systemd-udevd
4026532291 mnt 1 592 root ├─/usr/lib/systemd/systemd-logind
4026532292 uts 1 592 root └─/usr/lib/systemd/systemd-logind
4026531862 mnt 1 25 root kdevtmpfs
4026532230 user 2 10557 root unshare --mount --pid --net --map-root-user --user --uts --fork --ipc chroot /debian bash
4026532231 mnt 2 10557 root unshare --mount --pid --net --map-root-user --user --uts --fork --ipc chroot /debian bash
4026532232 uts 2 10557 root unshare --mount --pid --net --map-root-user --user --uts --fork --ipc chroot /debian bash
4026532233 ipc 2 10557 root unshare --mount --pid --net --map-root-user --user --uts --fork --ipc chroot /debian bash
4026532234 pid 1 10558 root └─bash
4026532235 net 2 10557 root unshare --mount --pid --net --map-root-user --user --uts --fork --ipc chroot /debian bash

namespaces(7) — Linux manual page
Isolate containers with a user namespace
What Are Namespaces and cgroups, and How Do They Work?