A ideia de container na informática está associada ao que temos na vida real, onde teremos todo o sistema (usuários, arquivos, processos, etc.) visível para o usuário encapsulado no dito container, dessa forma temos a possibilidade de passarmos todo esse sistema do usuário de uma máquina para outra, as justificativas para isso podem ser várias, melhorar o desempenho para o usuário, diminuir gastos com energia, entre outros. A esse processo de transferir o sistema do usuário para uma outra máquina damos o nome de migração.
Para realizar a migração utilizaremos basicamente 3 ferramentas, que são CRIU (v1.6), LXC(1.1.0) e o RSYNC:
CRIU
O CRIU serve para que possamos criar e gerenciar o container, com ele podemos definir qual sistema estará presente no nosso container, definir o nome do container, podemos também realizar checkpoint e restores dos containers, porém não o utilizaremos para realizar as duas últimas operações citadas, vamos a instalação e configuração do criu.
Para começar os processos de instalações vamos primeiro atualizar nossos repositórios com o
sudo apt-get update
Para instalar o CRIU devemos primeiramente fazer o download do projeto para a nossa máquina utilizando o git, com o comando:
git clone https://github.com/xemul/criu
Agora damos uma parada na instalação do CRIU para instalarmos algumas ferramentas necessárias para a sua compilação e instalação.
Para compilar o CRIU devemos instalar o pacote build-essential com o comando:
sudo apt-get install build-essential
Devemos também instalar mais algumas ferramentas necessárias para que possamos compilar o CRIU, podemos instalar todas com o seguinte comando:
sudo apt-get install libprotobuf-dev libprotobuf-c0-dev protobuf-c-compiler protobuf-compiler python-protobuf
Temos também que instalar as bibliotecas de compilação, executando o comando:
sudo apt-get install autoconf curl g++ libtool
E por último instalar mais duas ferramentas, através do comando:
sudo apt-get install asciidoc xmlto
Após os passos anteriores, podemos então voltar para a instalação do CRIU propriamente dita, primeiro passo é entra na pasta do CRIU que clonamos do Github, estando na pasta onde baixamos a pasta do projeto, basta executar o comando:
cd criu/
Depois de entrar na pasta temos agora que compilar o projeto do CRIU, através do comando:
sudo make
E logo depois, dar um make install para instalar o CRIU:
sudo make install
Para verificar se o CRIU foi instalado corretamente pode ser executado o comando:
criu check –ms
LXC
Agora podemos partir para a configuração do LXC, que será a ferramenta utilizada em conjunto com o CRIU para fazermos os chekpoints e restores para que consigamos fazer a migração.
O primeiro passo será criarmos o container usado para o teste, executando o comando:
lxc-create -t ubuntu -n u1 -- -r trusty -a amd64
Com o comando acima estamos criando um container com um sistema Ubuntu e nome u1. Agora devemos fazer algumas configurações no arquivo de configuração do container, que se encontra no caminho /var/lib/lxc/u1/config, com o comando a seguir estamos adicionando algumas configurações ao arquivo config.
sudo vi /var/lib/lxc/u1/config # hax for criu lxc.console = none lxc.tty = 0 lxc.cgroup.devices.deny = c 5:1 rwm lxc.seccomp =
Agora podemos iniciar o container com o commando:
lxc-start -n u1
Depois do container iniciado ele pode ser acessado de duas formas, via shh ou com o comando:
lxc-attach
Ou via ssh:
ssh ubuntu@$(sudo lxc-info -i -H -n u1)
Com o comando anterior nós iremos logar via ssh com o usuário ubuntu e o comando entre parênteses serve para pegar o IP do container, portanto ficaria algo como “ssh ubuntu@10.0.3.2” depois de executado.
Via attach:
lxc-attach -n 1
Agora que já temos o container em execução e temos as opções de checkpoint e restore ativas pelo LXC, podemos partir para a parte da migração.
MIGRAÇÃO
Para realizarmos a migração utilizaremos um script que fará o checkpoint no servidor 1, fará a sincronização entre as pastas do chekpoint do servidor 1 e a pasta de checkpoint do servidor 2 e após a sincronização iniciará o container no servidor 2.
O script que será usado para realizar os passos anteriores já está comentado com explicações do que cada parte faz, segue:
#Créditos do script ao blog http://tycho.ws/
#!/bin/sh
#Apaga conteúdo do diretório checkpoint se ele existir, para evitar erros
if [ -e /tmp/checkpoint/ ]; then
rm -rf /tmp/checkpoint/*
fi
usage() {
echo $0 container user@host.to.migrate.to
exit 1
}
#Verificação de erros e argumentos passados na hora de chamar a execução do script
if [ "$(id -u)" != "0" ]; then
echo "ERROR: Must run as root."
usage
fi
if [ "$#" != "2" ]; then
echo "Bad number of args."
usage
fi
name=$1
host=$2
checkpoint_dir=/tmp/checkpoint
#Função responsável por sincronizar as pastas onde estão os arquivos dos containers entre os servidores
do_rsync() {
rsync -aAXHltzh --progress --numeric-ids --devices --rsync-path="sudo rsync" $1
$host:$1
}
# we assume the same lxcpath on both hosts, that is bad.
LXCPATH=$(lxc-config lxc.lxcpath)
#Ação responsável por criar o checkpoint
lxc-checkpoint -n $name -D $checkpoint_dir –v
#Ação responsável por fazer a sincronização entre os servidores
do_rsync $LXCPATH/$name/
do_rsync $checkpoint_dir/
#Executa um comando via ssh para “levantar” o container no servidor para o qual ele foi migrado
ssh $host "sudo lxc-checkpoint -r -n $name -D $checkpoint_dir -v"
ssh $host "sudo lxc-wait -n $name -s RUNNING"
Para finalizarmos salvamos o script com o nome migrate e damos permissão de execução ao arquivo com o comando:
chmod +x migrate
Podemos executá-lo com o comando:
sudo ./migrate u1 “Usuário da máquina destino (servidor)”@”IP da máquina destino (servidor 2)”
Como exemplo, na minha máquina eu executo o script com o seguinte comando:
sudo ./migrate u1 mininet@10.0.0.2
Para evitarmos interação do usuário inserindo senhas durante o processo de migração, devemos copiar a chave ssh do host em que o container a ser migrado está para o host em que o container será migrado. Para fazermos isso, devemos logar na conta do root, criar a chave ssh e copiá-la para o outro host.
sudo su cd /root ssh keygen ssh-copy-id -i .ssh/id_rsa.pub usuario_maquina_destino@IP_maquina_destino
No nosso exemplo:
ssh-copy-id -i .ssh/id_rsa.pub mininet@10.0.0.2
Com isso concluirmos nossa migração. Espero ter ajudado!
Autores: Carlos César e Mário Gomes.
Editado em 02/12/2015: Demis Gomes e Saulo Marques.

Um comentário em “MIGRAÇÃO DE CONTAINERS UTILIZANDO CRIU E LXC”