VM para desenvolvimento

Desenvolver para o kernel trás um pequeno inconveniente: Esperar a máquina reinicia a cada erro no seu código.

O ideal é ter dois computadores, um para desenvolver e outro para testar (e esperar reiniciar), antigamente eu fazia isto usando meu Netbook para desenvolver e o Desktop para testar, porém, agora comprei um computador novo e é um pecado usar um Atom para desenvolver e testar em um Core i5 :-), e como meu Netbook é meu fiel escudeiro não posso arriscar fazer testes nele e correr o risco de danificar o sistema, outro fato é que meu netbook não tem porta serial o que dificulta um pouco na hora de ler um oops ou panic.

Como em casa tenho estudado sub-sistemas que não dependem de hardware, diferente do trabalho onde tudo gira em torno do Hardware e rende algumas brigas de “Caras do Hardware” vs. “Caras do software”, decidi criar uma máquina virtual para desenvolver para o kernel.

Das possíveis implementações de máquinas virtual decidi por usar o KVM e como distribuição Linux optei pelo Fedora.

No Desktop eu fiz uma instalação típica de Desktop: X, Gnome, OpenOffice, Internet Gráfica mais as “Ferramentas de desenvolvimento” e o suporte a virtualização.

Após instalar, primeiro boot, atualizar o sistema, trocar o papel de parede e tomar algum café, eu iniciei a criação de uma máquina virtual no KVM e a instalação do Fedora. Para a instalação da VM optei por fazer a instalação mínima mais os pacotes de “Ferramentas de desenvolvimento”.

Após o boot da máquina virtual, instalei o vim-enhanced e inicie a configuração de algumas facilidades.

Primeiro, configurei a interface de rede da VM para pegar endereço via DHCP criando e editando o arquivo /etc/sysconfig/network-scripts/ifcfg-eth0, qual ficou com o seguinte conteúdo:

DEVICE=eth0
ONBOOT=yes
TYPE=Ethernet
BOOTPROTO=dhcp

Após isto verifiquei os serviços do sistema com o comando “chkconfig –list | sort -k 5” (o “sort -k5” é para ordenar os dados pela quinta coluna, que são os serviços do runlevel 3, assim fica mais fácil de identificar os serviços habilitados) e após ver os necessários desabilitei alguns serviços:

[root@k ~]# chkconfig auditd off
[root@k ~]# chkconfig iptables off
[root@k ~]# chkconfig ip6tables off
[root@k ~]# chkconfig netfs off
[root@k ~]# chkconfig sendmail off

Além de desabilitar estes, foi necessário habilitar o serviço network que por padrão está desabilitado pois no fedora o gerenciamento de rede é feito pelo NetworkManager.

[root@k ~]# chkconfig network on

o sistema ficou com os seguintes serviços habilitados:

[root@k ~]# chkconfig --list | sort -k 5
auditd             0:off    1:off    2:off    3:off    4:off    5:off    6:off
cgconfig           0:off    1:off    2:off    3:off    4:off    5:off    6:off
cgred              0:off    1:off    2:off    3:off    4:off    5:off    6:off
ip6tables          0:off    1:off    2:off    3:off    4:off    5:off    6:off
iptables           0:off    1:off    2:off    3:off    4:off    5:off    6:off
netconsole         0:off    1:off    2:off    3:off    4:off    5:off    6:off
netfs              0:off    1:off    2:off    3:off    4:off    5:off    6:off
nfs                0:off    1:off    2:off    3:off    4:off    5:off    6:off
rdisc              0:off    1:off    2:off    3:off    4:off    5:off    6:off
restorecond        0:off    1:off    2:off    3:off    4:off    5:off    6:off
rpcsvcgssd         0:off    1:off    2:off    3:off    4:off    5:off    6:off
saslauthd          0:off    1:off    2:off    3:off    4:off    5:off    6:off
sendmail           0:off    1:off    2:off    3:off    4:off    5:off    6:off
svnserve           0:off    1:off    2:off    3:off    4:off    5:off    6:off
crond              0:off    1:off    2:on    3:on    4:on    5:on    6:off
network            0:off    1:off    2:on    3:on    4:on    5:on    6:off
rsyslog            0:off    1:off    2:on    3:on    4:on    5:on    6:off
sshd               0:off    1:off    2:on    3:on    4:on    5:on    6:off
udev-post          0:off    1:on    2:on    3:on    4:on    5:on    6:off

Sistema reiniciado e OK.

Após o boot, verifiquei o endereço de IP que a maquina recebeu e adicionei uma entrada no arquivo hosts para não precisar digitar o IP toda vez que conectar via SSH:

192.168.122.97  k       k.bristot.eti.br

Como vou trabalhar via SSH na VM também adicionei na VM um usuário “daniel” com o mesmo id do usuario “daniel” do PC e fiz a configuração no ssh para autenticar utilizando uma chave RSA sem senha, assim não preciso ficar digitando a senha toda vez que fizer login.

Para gerar a chave, executei o seguinte comando:

[daniel@kiron Desktop]$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/daniel/.ssh/id_rsa):  (apertei enter)
Enter passphrase (empty for no passphrase):              (apertei enter)
Enter same passphrase again:                      (apertei enter)
Your identification has been saved in /home/daniel/.ssh/id_rsa.
Your public key has been saved in /home/daniel/.ssh/id_rsa.pub.
The key fingerprint is:
18:13:bc:ed:5a:ff:d1:55:65:7b:af:83:42:5d:ea:8d daniel@kiron.bristot.eti.br
The key's randomart image is:
+--[ RSA 2048]----+
|     ..         o|
|      ..       .o|
|      oo      ..o|
|      .+.  . o  +|
|      ..S . o   o|
|        o. . = o |
|       o .. E =  |
|      .   .. . . |
|           ..    |
+-----------------+

Na máquina virtual criei o diretório /home/daniel/.ssh com permição 700 e copiei o arquivo “/home/daniel/.ssh/id_rsa.pub” do PC para o diretório “/home/daniel/.ssh” da VM com o nome authorized_keys e ajustei a permissão deste arquivo para 600:

[daniel@k ~]$ mkdir .ssh
[daniel@k ~]$ chmod 700 .ssh
[daniel@k ~]$ scp "endereço do pc":.ssh/id_pub.rsa .ssh/authorized_keys
[daniel@k ~]$ chmod 600.ssh/authorized_keys

e testei a conexão a partir do PC do PC:

[daniel@kiron Desktop]$ ssh k
Last login: Sat Jan 22 17:51:15 2011 from 192.168.122.1
[daniel@k ~]$

Pronto, login sem senha do PC para a VM.

Para facilitar a troca de arquivos entre o PC e a VM eu exportei o meu diretório de fontes via NFS4 para a VM, para isto adicionei ao arquivo /etc/exports a seguinte linha:

/home/daniel/src                  k(rw,sync,no_subtree_check,no_root_squash,no_all_squash)

Já na VM, eu tive que adicionar o pacote nfs-utils:

[root@k ~]# yum install nfs-utils

criar o diretorio de montagem:

[daniel@k ~]$ mkdir src

e adicionar a seguinte linha ao fstab:

192.168.122.1:/home/daniel/src/ /home/daniel/src/    nfs4    defaults     0 0

Pronto, maquina instalada, acesso sem senha e arquivos compartilhados.

pronta para desenvolver!

Aaaaa última dica, o grub por padrão no KVM fica com um timeout de ‘0’ e você não consegue editar a linha de comando do kernel em caso de erro, então, antes de mexer no kernel, edite o arquivo /etc/grub.conf e mude o Timeout de 0 para algum valor como 3.