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”