quarta-feira, 29 de maio de 2013

ArchLinux num ambiente isolado com systemd-nspawn

Introdução

Existem várias maneiras de se executar um ambiente isolado. Podemos utilizar um simples chroot ou virtualização de hardware. Porém, o chroot apenas isola o sistema de arquivos, sendo possível explorar alguma vulnerabilidade para escapar do chroot. A virtualização isola de forma bastante completa, porém costuma ter uma pequena perda de performance, além de comprometer uma quantidade fixa de memória e espaço em disco.

No Linux, tem crescido uma alternativa Linux Containers. Eles utilizam recursos do kernel chamados Namespaces. Existem vários tipos de namespaces: de sistemas de arquivos, de rede, de processos e de usuários. Eles servem para isolar os recursos entre os tipos de namespaces. Algumas vantagens são:

  • A performance não é afetada, pois não há virtualização do hardware.
  • A memória e o espaço de disco são compartilhados entre os contêiners, então não há desperdício de recursos alocados a máquinas virtuais, mas não utilizados.

Montando o ambiente


O meu ambiente de testes é uma instalação do ArchLinux, atualizada. O kernel que estou usando é o 3.9.4, oficial da distribuição. Vamos fazer uma nova instalação do Arch, embora poderíamos utilizar o Fedora ou Debian com facilidade. Porém, como minha afinidade é maior com Arch, é o que utilizarei. Porém, isso não afeta o procedimento geral.

Os comandos a seguir devem ser executados com permissão de super usuário, obviamente.

É necessário instalar o pacote com o script de instalação do Arch.

pacman -S arch-install-scripts

Escolher um diretório que vai conter a raiz do novo sistema e criar um diretório para
conter a instalação

cd <diretorio>
mkdir archimage

Executar pacstrap para instalar um Arch básico

pacstrap -cdG archimage base

Os parâmetros usados significam:

-c
utiliza o cache de pacotes do host. Isto provavelmente vai economizar muito tempo de download, se você não apagar seu cache.
-d
permite instalar em um diretório que não é um ponto de montagem. Em meus testes, eu não criei uma partição separada para /var, /tmp, etc, pois o objetivo é ter um sistema bem contido. Eventualmente, pode-se utilizar pontos de montagem vinculados para apontar para os diretórios /var, /tmp, etc do hospedeiro.
-G
não copia o keyring do host para o guest. O guest deverá ter um keyring próprio, com uma chave privada própria.

Executar o systemd-nspawn para entrar no novo sistema

systemd-nspawn -jbD archimage --bind=/var/cache/pacman/pkg

-j
faz com que o journal do hóspede seja visível a partir do hospedeiro. Isto é interessante pois pode ser que você perca o acesso ao hóspede e queira ver o que aconteceu ou está acontecendo com ele a partir do ambiente externo.
-b
executa uma sequência de boot, chamando o /bin/init como processo pid 1. Como o systemd-nspawn utiliza o recurso de Process Namespace do kernel, ele pode reiniciar a contagem de pid no sistema hóspede sem que haja conflitos com o sistema hospedeiro.
-D
utiliza o diretório especificado como raiz do sistema. Funciona de forma muito similar ao chroot, só que utiliza o sistema de Filesystem Namespaces do kernel.
--bind=
monta um diretório ou arquivo do hospedeiro dentro do hóspede. No exemplo, o cache do pacman foi montado para evitar o download desnecessário de pacotes pelo hóspede. Pode-se utilizar esta opção mais de uma vez. Também existe a opção --bind-ro para montar como somente leitura.

Neste ponto, o ambiente isolado será inicializado e poderá ser configurado como se fosse um sistema Arch convencional que acabou de ser instalado. Isto pode ser feito tomando como referência o Guia do Iniciante. Não é necessário gerar um fstab, pois o ambiente isolado roda num subdiretório do sistema hospedeiro e, por isto, a estrutura deve ser configurada antes de executar o systemd-nspawn.

Espero que tenha sido interessante. Comentários são muito bem vindos. Obrigado!

Nenhum comentário:

Postar um comentário