OpenVZ – Conteineres travados

Quando utilizado o OpenVZ como solução de virtualização, em alguns casos pode ocorrer de o conteinere desejado apresentar a mensagem “Container already locked” ao ser solicitado o reboot eu desligamento do sistema. Neste existem dois passos simples a serem seguidos, basta seguir os seguintes passos:

  1. Remover o arquivo de lock localizado em /var/lib/vz/lock/101.lck
  2.  vzctl chkpnt 101 –kill

Neste caso é assumido que o id do conteinere a ser reiniciado é 101. Após este procedimento conteinere citado poderá ser reiniciado ou desligado tranquilamente.

OpenVZ e Conteineres

O OpenVZ é uma solução baseada em conteineres para Linux. O OpenVZ é capaz de criar mútiplos, seguros e isolados conteineres (também conhecidos como VE (Virtual Environment) ou VPS (Virtual Private Server)) em um único servidor físico fornecendo uma melhor utilização do servidor sem impedir que ocorra conflitos entre as aplicações. Cada conteinere é executado exatamente como um servidor dedicado, um conteinere pode ser reiniciado, ter seu endereço ip modificado, ter as senhas de seus usuários modificadas e até mesmo sofrer alterações de hardware como quantidade de memória e espaço em disco. Veremos neste artigo, as principais formas de gerenciamento de um sistema utilizando o OpenVZ, neste estudo assumiremos que você já possui um servidor com Debian Squeeze (Stable na data da publicação deste documento) instalado e funcionando corretamente. Caso utilize outra versão do Debian, não há problemas basta modificar algumas ações como versão do kernel ou um ou outro arquivo de configuração :D A instalação do OpenVZ é bem simples, basta instalar a versão do kernel com suporte ao OpenVZ, para identificar a versão de seu kernel você pode utilizar o comando uname -r, em seguida com auxílio do apt-get você será capaz de instalar o OpenVZ, lembrando que utilizaremos um programa auxiliar para gerenciamento, o vzctl. Portanto abaixo efetuamos a instalação de ambos:

server:/# apt-get install linux-image-openvz-amd64 vzctl

Após efetuada a instalação, são necessários alguns ajustes no sistema, iniciaremos modificando o conteúdo do arquivo /etc/sysctl.conf, para tanto efetue backup da versão atual de seu arquivo e mantenha o mesmo com os seguintes valores:

net.ipv4.conf.all.send_redirects = 0
net.ipv4.ip_forward = 1
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.accept_source_route = 0
net.ipv4.conf.all.accept_source_route = 0
kernel.sysrq = 1
kernel.core_uses_pid = 1
net.ipv4.conf.default.accept_redirects = 0
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.tcp_fin_timeout = 25
net.ipv4.tcp_keepalive_time = 1200
net.ipv4.tcp_window_scaling = 1
net.ipv4.tcp_sack = 1
net.ipv4.tcp_fack = 1
net.ipv4.tcp_timestamps = 1
net.ipv4.tcp_syncookies = 1
net.ipv4.icmp_echo_ignore_broadcasts = 1
net.ipv4.icmp_ignore_bogus_error_responses = 1
net.ipv4.tcp_reordering = 5
net.ipv4.tcp_synack_retries = 2
net.ipv4.tcp_syn_retries = 3
net.ipv4.tcp_max_syn_backlog = 2048
net.core.netdev_max_backlog = 1024
net.ipv4.tcp_max_tw_buckets = 360000
net.core.rmem_default = 65535
net.core.rmem_max = 8388608
net.ipv4.tcp_rmem = 4096 87380 8388608
net.core.wmem_default = 65535
net.core.wmem_max = 8388608
net.ipv4.tcp_wmem = 4096 65535 8388608
net.ipv4.tcp_mem = 8388608 8388608 8388608
net.core.optmem_max = 40960
net.ipv4.conf.default.forwarding = 1
net.ipv4.conf.default.proxy_arp = 1
net.ipv4.conf.default.send_redirects = 1

Como o OpenVZ trabalha diretamente com o kernel do Linux, estas alterações se fazem necessárias no arquivo /etc/sysctl.conf, para que as mesmas tenham efeito sem que o servidor precise ser reiniciado, é necessário executar o comando sysctl -w. Após este procedimento nosso sistema está preparado para trabalhar com o OpenVZ, bastando apenas baixar o template, que no caso é uma pré instalação do sistema operacional que estaremos instalado, o mesmo pode ser baixado aqui. No caso escolhemos uma imagem mínima do Debian, mas sinta-se a vontade para baixar a imagem desejada. Após baixar a imagem, salve-a em /var/lib/vz/template/cache/.

Criaremos agora nossa máquina virtualcom a seguinte linha de comandos:

server:~# vzctl create 100 --config basic --ostemplate debian-5.0-x86_64

Repare que utilizamos o comando vzctl com a opção create e o número 100, este é um identificador deste servidor para questões de organização, o mesmo não pode se repetir, pois é a identificação de cada servidor virtual no sistema, e com a opção –ostemplate informamos o template desejado, no caso o que acabamos de baixar. Um detalhe importante é que na hora da especificação do template deve ser omitida a extensão .tar.gz. Abaixo definimos os limites de espaço em disco:

server:~# vzctl set 100 --diskspace 10G:10G --save

Como desejamos configurar a memória de 256MB destinada a este vps, manteremos os limites mínimo e máximo com as seguintes linhas de comando:

server:~# vzctl set 100 --vmguarpages 256m --save
server:~# vzctl set 100 --privvmpages 256m --save

Abaixo configuramos o vps para ser inicializado no boot do servidor dedicado:

server:~# vzctl set 100 --onboot yes --save

O comando vzctl é bastante intuitivo, definiremos agora o hostname do servidor:

server:~# vzctl set 100 --hostname server-vps --save

Endreço ip:

server:~# vzctl set 100 --ipadd 192.168.0.200 --save

Chegando perto da finalização da configuração, iremos agora definir o servidor de nomes utilizado:

server:~# vzctl set 100 --nameserver 192.168.0.245 --save

E finalmente iniciaremos nosso vps:

server:~# vzctl start 100

Com o vps iniciado,utilizamos o comando vzctl com o parâmetro enter, a partir deste ponto nosso servidor já está totalmente funcional. Para sair basta digitar o comando exit:

server:~# vzctl enter 100
entered into CT 100
server-vps:/#

Apartir deste momento, possuímos um servidor na rede da mesma forma que um servidor físico, portanto os cuidados com segurança, atualizações de software e administração do sistema são exatamente os mesmos.

MySQL – Backup e Restore

Tarefas como backup e restore de bancos de dados MySQL são extremamente úteis no dia-dia dos administradores de sistemas, seja qual for o motivo, como migração de servidores, migração de bases de dados ou diversos outros motivos. Abaixo descrevemos um exemplo simples e funcional do backup de uma base de dados  MySQL utilizando o comando mysqldump:

user@host:~$ mysqldump -h 192.168.1.20 -P 3306 -u teste --databases teste -p > /tmp/teste.sql

Com o comando mysqldump, primeiramente dizemos com a opção -h o host que queremos efetuar backup, se fosse nossa máquina local logicamente trataríamos como local host. Em seguida com a opção -P, informamos ao mysqldump qual a porta de comunicação deve ser utilizada, com a opção -u, é informado o nome de usuário com permissão a base de dados, com o parâmetro –databases é informado o nome da base de dados e finalmente com a opção -p solicitamos ao mysqldump que exiba o prompt de senha, solictando a senha do usuário. Finalizando ao final da linha de comandos redirecionamos a saída para o arquivo /tmp/teste.sql, este arquivo conterá o backup de toda a base de dados.

O restore de uma base de dados MySQL também é uma tarefa simples, bastando efetuar a linha de comandos abaixo utilizando o comando mysql informando a senha do usuário com acesso ao banco de dados e o arquivo de backup:

user@host:~$ mysql -h 192.168.1.20 -P 3306 -u teste < /tmp/teste.sql -p

Na linha de comandos acima, utilizamos algumas opções já conhecidas do mysqldump, após sua execução o banco de dados teste estará restaurado.

 

Comando df, analisando espaço em disco

Um dos comandos mais importantes para administradores de sistemas Linux é o comando df, com ele podemos analisar o espaço em discos e partições. Abaixo temos um exemplo de utilização do comando df sendo executados sem argumentos:

host:~# df
Sist. Arq.           1K-blocos      Usad Dispon.   Uso% Montado em
/dev/sda2             28834744   9757724  17612296  36% /
tmpfs                   513140         0    513140   0% /lib/init/rw
udev                    508860       212    508648   1% /dev
tmpfs                   513140         0    513140   0% /dev/shm
/dev/sda3             47596776  36389456   8789540  81% /home

Como podemos visualizar no exemplo acima, a primeira coluna exibe device utilizado, no caaso o disco rígido primário, secundário, área de troca (swap) ou dispositivo montado, como um pen-drive  ou um cartão de memória, na seunda coluna é exibido o tamanho do disco ou partição, na terceira coluna é possível visualizar a quantidadae  de espaço utilizado, na quarta coluna a quantidade de espaço disponível, na quinta coluna o percentual utilizado e finalmente na última coluna o ponto de montagem.

Embora o resultado do comando df no exemplo acima tenha nos dado muitas informações, as mesmas estão em formatos de bytes, porém podemos tomar a leitura mais fácil, para isso basta utilizar as opções -k ou –kilobytes para a exibição do resultdo em bytes, ou -m ou –megabytes para exibição do resultado em megabytes:

host:~# df -m
Sist. Arq.           1M-blocos      Usad Dispon.   Uso% Montado em
/dev/sda2                28159      9530     17200  36% /
tmpfs                      502         0       502   0% /lib/init/rw
udev                       497         1       497   1% /dev
tmpfs                      502         0       502   0% /dev/shm
/dev/sda3                46482     35537      8584  81% /home

Acima utilizamos o comando df com a opção -m, porém podemos melhorar a visualização dos resultados mais ainda com a opção -h ou –human-readable, que como o nome já diz facilita a leitura humana, convertendo o resultado para o formato mais conveniente como mega, giga, tera, etc:

host:~# df -h
Sist. Arq.            Size  Used Avail Use% Montado em
/dev/sda2              28G  9,4G   17G  36% /
tmpfs                 502M     0  502M   0% /lib/init/rw
udev                  497M  212K  497M   1% /dev
tmpfs                 502M     0  502M   0% /dev/shm
/dev/sda3              46G   35G  8,4G  81% /home

Com os exemplos anteriores, é possível ter um total gerenciamento do espaço em disco com o comando df. Em caso de servidores que possuem compartilhamentos de redes montados como por exemplo NFS ou SMB, é possível exibir somente pontos de montagem locais adicionando a opção -l ou –local:

host:~# df -h -l -T
Sist. Arq.    Tipo    Size  Used Avail Use% Montado em
/dev/sda2     ext3     28G  9,4G   17G  36% /
tmpfs        tmpfs    502M     0  502M   0% /lib/init/rw
udev         tmpfs    497M  212K  497M   1% /dev
tmpfs        tmpfs    502M     0  502M   0% /dev/shm
/dev/sda3     ext3     46G   35G  8,4G  81% /home

Além das opções já conhecidas, no exemplo acima utilizamos a opção -T ou –print-type, que adicionou a coluna com o tipo do sistema de arquivos, no caso a segunda coluna. de possa da informação apresentada na segunda coluna, podemos incrementar ainda mais a saída do comando df com a opção -t ou –type, especificando o tipo de sistema de arquvos no qual desejamos obter informações:

host:~# df -h -l -T -t ext3
Sist. Arq.    Tipo    Size  Used Avail Use% Montado em
/dev/sda2     ext3     28G  9,4G   17G  36% /
/dev/sda3     ext3     46G   35G  8,4G  81% /home

No exemplo acima, foi expecificado o tipo de sistema de arquivos ext3, com isso o resultado foi somente o sistema de arquivos especificado. O comando df é esencial na resolução de problemas no dia-dia,  portanto dominar suas opções e entender seus conceitos é fundamental para qualquer administrador de sistemas Linux.