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!

segunda-feira, 27 de maio de 2013

Começando

Este é o primeiro post deste blog. Nele eu pretendo escrever coisas que vou fazendo, principalmente para minha própria referência futura. Se servir para outras pessoas, melhor ainda. Portanto, os assuntos variarão entre Ciência da Computação (programação, principalmente), administração de sistemas (não é meu foco principal, mas é interessante experimentar coisas novas) e música.

Estou pensando em iniciar com uma série de posts que falam sobre conteiners. Provavelmente, serão 2 ou 3 artigos. O primeiro deve ser sobre o systemd-nspawn. O segundo deve ser sobre ativação automática de conteiners com o systemd. O terceiro, se houver, será sobre o uso do projeto Linux Containers, ou lxc, como é conhecido. Só farei este terceiro se eu tiver mais tempo, pois ele envolve mais preparação.

Enfim, vamos ver no que dá.