quinta-feira, 21 de fevereiro de 2008

Qemu completo: instalação, acelerador e rede

UPDATE: se o seu processador suporta, recomento que use o kvm:
http://ratosdelaboratorio.blogspot.com/2008/03/kvm-pisando-no-acelerador-com-o-qemu.html
-------------------------------------------------------------------------------------------------

Objetivo: instalar qemu no Debian (provavelmente funcione no Ubuntu também), com kqemu, configurando rede, adicionando TS e usando com Seamless. O seamless permite usar o TS do Windows XP e rodar uma aplicação remotamente sem as janelas e a barra de tarefas do Windows.

Um screenshot usando o qemu, o IE7 (como uma janela, mas remotamente dentro da máquina virtual), da linha de comando no Linux e no windows. O site do br-linux só pra mostrar a rede funcionando...


Dica: vc pode usar o aptitude no lugar do apt-get...

1- Atualizar a base do apt
apt-get update
2- Instalar o qemu
apt-get install qemu
3- Instalar o kqemu
Segundo o guia do hardware, o kqemu é "um módulo de Kernel que transforma o Qemu for Linux num virtualizador similar ao VMware. Ele passa a repassar as chamadas ao invés de interpretar cada uma, como fazia até então. Mais do que isso, o desempenho também fica de 4 a 5 vezes melhor"
Instalar ele no Debian é barbada:
m-a prepare
m-a a-i kqemu
3.1- Configurar Kqemu (permissões)
Para permitir que o kqemu seja usado por qualquer usuário, o arquivo /dev/kqemu deve ter permissão de escrita para todos. Isso pode ser feito automaticamente, criando um arquivo em /etc/udev/rules.d:
vi /etc/udev/rules.d/60-kqemu.rules
com o conteúdo:
KERNEL=="kqemu", NAME="%k", MODE="0666"
Para verificar se está tudo ok, carrega-se o módulo kqemu (como root):
modprobe kqemu
e verifica-se as permissões do arquivo criado:
ls -l /dev/kqemu
a resposta deve ser como essa:
crw-rw-rw- 1 root root 10, 61 2007-12-16 22:58 /dev/kqemu
4- Rede

Para configurar uma interface de rede, vou apresentar uma forma de fazer, um pouco trabalhosa, mas que gostei dos resultados.

Crie (ou edite) o arquivo qemu-ifup, em /etc:
vi /etc/qemu-ifup
Comente a(s) linha(s) que está(ão) lá e acrescente:
#a interface que conecta com a internet
IFNAME_INTERNET='eth1'

#coloca um ip na nova interface
sudo -p "Password for $0:" /sbin/ifconfig $1 172.20.0.1

#libera nat no firewall
sudo /sbin/iptables -t nat -A POSTROUTING -o $IFNAME_INTERNET -j MASQUERADE

#libera ip_forward
sudo /bin/sh -c "/bin/echo 1 > /proc/sys/net/ipv4/ip_forward"
Depois de tudo isso, é preciso adicionar os comando para executar com o sudo. Como root:
visudo
Adicionando algo como:
rodolfo ALL = /sbin/iptables, /bin/sh -c /bin/echo 1 > /proc/sys/net/ipv4/ip_forward, /sbin/ifconfig
Tudo numa linha só, trocando "rodolfo" pelo nome do usuário que vc está usando.

4.1- Tun

Vamos instalar um pacote, para auxiliar criar nossas interfaces de rede:
apt-get install uml-utilities
E ajustamos para o módulo "tun" ter permissões corretas:
vi /etc/udev/rules.d/60-tun.rules
Com o conteúdo:
KERNEL=="tun", MODE="0666"
Carregue o módulo e seguimos adiante:
modprobe tun
5 - O kqemu

5.1 - o kqemu só funciona se o sistema emulado for o mesmo que o sistema da sua máquina (x86-64, no meu caso).

Assim, o emulador que deve ser executado é o da sua arquitetura. No meu caso, é "qemu-system-x86_64". Para ter certeza, exeute:
qemu-system-x86_64 | grep kqemu
ele deve mostrar as opções:
-kernel-kqemu enable KQEMU full virtualization (default is user mode only)
-no-kqemu disable KQEMU kernel module usage
5.2- verificar instalação e suporte ao kqemu

Vamos pegar uma imagem qualquer em http://fabrice.bellard.free.fr/qemu/download.html para testar o qemu. Eu peguei o NetBSD...
bunzip2 small.ffs.bz2
qemu-system-x86_64 -kernel-kqemu small.ffs
Para verificar se o kqemu está habilitado, clique na janela do qemu (o mouse ficará lá dentro, e o texto da barra de titulo vai mudar). Pressione, então:
ctrl+alt+2
Isso levará para a console do qemu. Digite:
info kqemu
A resposta deverá ser:
kqemu support: enabled for user and kernel code
Aqui vc pode usar o comando "help" para obter diversas informações da máquina virtual e do qemu.

Se o que aparecer for:
kqemu support: disabled
Verifique se o módulo está carregado e com as permissões corretas.

6 - Criar a imagem, bootar e instalar

6.1 - criando a imagem para o windows XP
qemu-img create windowsXP.qcow2 4G

"create" é o que vamos fazer
"4G" é o tamanho
"windowsXP.qcow2" é o nome do arquivo. A extensão é só pra bonito.
Você pode usar "-f qcow2", que indica o formato para qcow2 (que expande a imagem à medida que a máquina virtual cresce)

outras opções: "man qemu-img" no seu terminal

6.2- o boot
Como root, carregamos os módulos:
modprobe kqemu
modprobe tun
Criamos uma interface de rede para o usuário:
tunctl -t tap0 -u rodolfo
"-t tap0" indica qual interface estamos criando. Ela não pode existir ainda
"-u rodolfo" indica o dono da interface, tornando-a persistente

E iniciamos com o CD-Rom
qemu -hda windowsXP.qemu -cdrom winxp.iso -net nic -net tap,ifname=tap0 -localtime -m 256 -boot d
"-hda windowsXP.qcow2" indica que o hd será o arquivo que criamos
"-cdrom winxp.iso" é a imagem do cd com o XP
"-net nic -net tap,ifname=tap0" configura a interface de rede. É apenas uma forma, entre diversas existentes
"-localtime" coloca o horário na máquina virtual sincronizado com o real/bin/sh -c echo 1 > /proc/sys/net/ipv4/ip_forward
"-m 256" deixa 256MB de memória para a máquina virtual
"-boot d" executa o boot pelo CD.

E seguimos pela instalação do windows... como se fosse numa máquina "normal"... Demora, então seja paciente...

7 - iniciar pela primeira vez

7.1 - configurar a rede
Para configurar a rede, existem vários tutoriais na net. É um windows comum, mas não configuramos o qemu para fornecer um IP automaticamente.
No exemplo que estou criando, usei, no Windows:
IP: 172.20.0.2
Máscara: 255.255.0.0
Gateway: 172.20.0.1 (é o IP da interface criada no Linux!)
DNS: 172.20.0.1 e 192.168.0.1 (esse último é o DNS da minha rede).

7.2 - inicar o TS
Habilite o serviço de Terminal Service no XP. É uma sujestão, pois eu acho mais cômodo usá-lo no lugar do próprio QEMU.
Para configurar:

Meu computador -> Propriedades -> Remoto

Inicie o serviço

Teste a conexão usando o rdesktop:
rdesktop 172.20.0.2
8- Otimizar o Windows:

Para rodar o windows depois de instalado, use o comando:
qemu -hda windowsXP.qemu -net nic -net tap,ifname=tap0 -localtime -m 256
É o mesmo comando usado no item 6, mas sem as informações do cdrom...

Você pode simplismente copiar o arquivo "windowsXP.qemu" e usar uma das imagens para fazer testes. Se tudo der errado, é só copiar o arquivo de volta e temos um Windows XP recém instalado para brincar.

Se quiser, pode testar algumas otimizações:

http://naganimes.wordpress.com/2008/01/31/100-dicas-windows-xp-sp2-2000-a-2003/
http://www.forumpcs.com.br/viewtopic.php?t=89566
http://undergeek.wordpress.com/2008/01/20/otimizando-o-windows-xp/

Eu usei algumas e obtive uma economia significativa de memória...

9- SeamlessRDP

9.1- Instale o SeamlessRDP (isso no Windows, dentro da máquina virtual)
Baixe-o daqui http://www.cendio.com/seamlessrdp e simplesmente extraia o conteúdo na raiz (c:/) do seu windows virtual.

9.2- Conectando e executando:

Para rodar o bloco de notas, por exemplo:
rdesktop -A -N -b -p - -s "C:\seamlessrdp\seamlessrdpshell.exe notepad" 172.20.0.2
Eu uso executando o "cmd" e chamando diversas aplicações a partir dele. Eu uso, basicamente, o IE, para testar bugs que só ele consegue...


Dicas:
  • É possível usar o arquivo /etc/modules para carregar automaticamente os módulos tun e kqemu.
  • Você pode criar um script para criar a interface de rede toda vez que o computador for iniciado (como os secripts em /etc/init.d e nos "rcN°.d")

Um comentário:

Daniel disse...

Cara muito bom mesmo. \o/
Tu ajudou muito.