Tutorial Qemu
De Gentoo Linux Wiki
Tabela de conteúdo |
[editar] Introdução
O QEMU é um software de emulação de sistemas operativos permitindo a emulação de várias plataformas diferentes (PCs IA-32 (x86), PCs AMD64, MIPS R4000, SPARC sun3 da Sun e PowerPC (PReP e Power Macintosh))
O KQEMU é um módulo de kernel acelerador para o QEMU que permite técnicas de virtualização usadas por programas semelhantes (como o VMWare ou o Microsoft Virtual PC). O KQEMU era proprietário, mas desde a versão 1.3.0pre10 (lançada a 5 de Fevereiro de 2007) ele está disponível sob a GNU GPL.
O projecto QVM86 pretendia criar um módulo de virtualização GPL para o QEMU, mas foi abandonado (pode, alternativamente, usar o KQEMU ou o VirtualBox da InnoTek).
Dois usos comuns para o QEMU são correr o Windows sobre o Gentoo ou o Gentoo sobre o Windows. Isto pode ser útil para software que ainda não suporta a outra plataforma e que não funciona correctamente com sistemas de compatibilidade (tais como o wine ou o cygwin). O QEMU também é útil para testar aplicações, uma vez que elimina a necessidade de reiniciar o computador.
[editar] Instalação
[editar] Compilar com o gcc3
A melhor forma de compilar o qemu é com o gcc3. Se não o tem instalado, necessita de o instalar.
| Código: Instalar o gcc 3.4.6 |
# emerge =sys-devel/gcc-3.4.6* |
Agora mude o compilador para o gcc-3.4.6
| Código: Mudar para o gcc3 com o gcc-config |
# gcc-config x86_64-pc-linux-gnu-3.4.6 # source /etc/profile |
Nota: se estiver a usar uma hardened-toolchain, necessita de escolher a versão hardenednopie (i.e. gcc-config x86_64-pc-linux-gnu-3.4.6-hardenednopie)
Instale os pacotes do qemu de acordo com as instruções que se seguem e quando estiver tudo concluído, reverta para o gcc 4 com:
| Código: Mudar de volta para o gcc4 |
# gcc-config x86_64-pc-linux-gnu-4.1.1 |
[editar] Compilar com o gcc4
Talvez no seu sistema, o QEMU e o KQEMU estejam ambos marcados como "em teste" (mascarados por ~arch). Pode ter de os desmascarar para que o que se segue funcione.
| Código: Desmascarando os pacotes necessários (para x86) |
# echo "app-emulation/qemu" >> /etc/portage/package.keywords # echo "app-emulation/qemu-user" >> /etc/portage/package.keywords # echo "app-emulation/qemu-softmmu" >> /etc/portage/package.keywords # echo "app-emulation/kqemu" >> /etc/portage/package.keywords |
Utilizadores do GCC4 - Se acabou de desmascarar o QEMU, recomenda-se que mascare as versões >=0.8.2, uma vez que elas não compilarão.
(De acordo com dados de 7 de Setembro de 2006)
| Código: Mascarando as versões 0.8.2 e superiores |
# echo ">=app-emulation/qemu-0.8.2" >> /etc/portage/package.mask # echo ">=app-emulation/qemu-user-0.8.2" >> /etc/portage/package.mask # echo ">=app-emulation/qemu-softmmu-0.8.2" >> /etc/portage/package.mask |
[editar] QEMU
Se quiser ter QUALQUER resultado gráfico no QEMU, terá de adicionar a use flag "sdl" à lista:
| Arquivo: /etc/portage/package.use |
|
app-emulation/qemu-softmmu sdl
|
Para instalar o QEMU, compile-o simplesmente, mas primeiro certifique-se de que tem o "sdl" activado.
| Código: Para ter apenas o QEMU |
Box $ /bin/su Box # emerge qemu -av |
Nota: Se apenas pretende correr o Windows num Linux x86 (ie. não necessita de emulação de CPU), instale o qemu-softmmu.
[editar] KQEMU
Ou se quiser o KQEMU, terá de adicionar a use flag à lista:
| Arquivo: /etc/portage/package.use |
|
app-emulation/qemu-softmmu kqemu sdl
|
De seguida, compile-o e inicialize o módulo
| Código: For QEMU+KQEMU |
Box $ /bin/su Box # emerge kqemu Box # modprobe kqemu major=0 |
NOTA: Se compilou o seu kernel com o gcc4, irá obter um erro ao tentar inicializar o módulo porque o kernel necessita que os módulos sejam compilados com o gcc4 para os poder inicializar, simplesmente reverta para o gcc3 e compile o kqemu de novo:
| Arquivo: Erro de inicialização do módulo de kernel compilado com o Gcc4 |
|
FATAL: Error inserting kqemu (/lib/modules/kernel-2.6.xxx/misc/kqemu.ko): Invalid module format
|
| Código: Para KQEMU+Kernel GCC4 |
Box $ gcc-config x86_64-pc-linux-gnu-4.1.1 Box # source /etc/profile Box # emerge -av kqemu Box # modprobe kqemu major=0 |
Provavelmente desejará inicializar o módulo sempre que inicia o computador para não ter de se lembrar de o fazer manualmente. Para tal, edite o seu ficheiro /etc/modules.autoload.d/kernel-2.6 (ou kernel-2.4) ou inicialize-o no script de arranque do QEMU (ver abaixo):
| Arquivo: /etc/modules.autoload.d/kernel-2.6 |
|
kqemu major=0
|
Finalmente, adicione o seu utilizador ao grupo qemu para ter acesso ao kqemu.
| Código: Para QEMU+KQEMU |
Box #gpasswd -a [your_user] qemu |
Por omissão o QEMU apenas corre código de utilizador com o KQEMU. 'qemu -kernel-kqemu' irá executar também código do kernel com o KQEMU, resultando numa grande melhoria da velocidade. No entanto, -kernel-kqemu apenas é suportado na arquitectura x86.
Para saber se o KQEMU foi inicializado com sucesso, use a consola do QEMU (alt+ctrl+2) e escreva 'info kqemu'. Deverá ver a informação que se segue.
| Código: Para QEMU+KQEMU |
(qemu)info kqemu kqemu support: enabled for user and kernel code |
Se vir qualquer outra mensagem, o suporte para KQEMU no kernel não está activado.
[editar] Começando
[editar] Arrancando a partir de uma imagem ISO de LiveCD
| Código: Arrancando um LiveCD |
$ qemu -cdrom mpentoo.2006.0.iso -boot d -m 128 |
O parâmetro -cdrom diz ao QEMU para ver o ficheiro ISO como um CD-ROM virtual. O parâmetro -m especifica a quantidade de RAM disponível para o SO hóspede.
[editar] Instalar um SO e arrancar
A não ser que esta simplesmente a testar uma imagem ISO de um Live CD, irá provavelmente querer criar uma imagem de disco onde o QEMU possa escrever.
Pode fazê-lo com o dd ou usando o comando qemu-img.
| Código: Imagem de disco vazia de ~4GB com o DD |
$ dd of=disk.img count=0 bs=1M seek=4096 |
ou use uma imagem redimensionável COW. O formato de imagem "qcow" irá usar apenas tanto espaço quanto o que for realmente necessário, logo a imagem será bem pequena no início (e não de 1.3 GB!).
| Código: Imagem de disco dinâmica COW |
$ qemu-img create -f qcow /path/to/xp.cow 1300M |
Para usar essa imagem de disco mas arracar a partir de CD-Rom, use:
| Código: 384 é a RAM disponível para o SO hóspede |
$ qemu -hda /caminho/para/xp.cow -boot d -cdrom /dev/cdrom -m 384 -localtime |
Poderá ter de ajustar a quantidade de memória (-m 384) ao seu sistema.
Para iniciar e arracar a partir dessa imagem de disco:
| Código: 384 é a RAM disponível para o SO hóspede |
$ qemu -hda /caminho/para/xp.cow -boot c -m 384 -localtime -k de -usb |
[editar] Usando o SO emulado com ethernet e um IP válido
Para usar a ligação ethernet do seu computador a partir do SO emulado, terá de usar o TUN/TAP.
Tem de activar o TUN/TAP no seu kernel usando a seguinte opção de configuração:
| Configuração do Kernel do Linux: Activar o suporte a TUN/TAP |
Device Drivers --->
Networking support --->
<M> Universal TUN/TAP device driver support
Networking options --->
<*> 802.1d Ethernet Bridging #NOTA : pelo menos nas séries 2.6.20
|
| Código: Carregar o módulo TUN/TAP |
# modprobe tun |
[editar] Construindo uma ponte
Configurar uma ponte na máquina-servidor para dois hóspedes (Exemplo)
| Código: Instale estes programas |
# emerge net-misc/bridge-utils # emerge sys-apps/usermode-utilities |
| Código: Crie um dispositivo tun da seguinte forma (kernel 2.4) |
# mknod /dev/net/tun c 10 200 |
| Código: Abra o /etc/conf.d/net para edição |
# nano -w /etc/conf.d/net |
Defina manualmente informação de IP para br0
IP estático:
| Arquivo: /etc/conf.d/net |
bridge_br0="eth0" config_eth0=( "null" ) config_br0=( "192.168.0.1/24" ) RC_NEED_br0="net.eth0" brctl_br0=( "setfd 0" "sethello 0" "stp off" ) routes_br0=( "default gw 192.168.0.254" ) |
Ou DHCP:
| Arquivo: /etc/conf.d/net |
bridge_br0="eth0" config_eth0=( "null" ) config_br0=( "dhcp" ) dhcpcd_br0="-t 10" RC_NEED_br0="net.eth0" brctl_br0=( "setfd 0" "sethello 0" "stp off" ) |
| Código: Adicione net.br0 ao runlevel default |
# cd /etc/init.d # ln -s net.lo net.br0 # rc-update add net.br0 default |
| Código: Adicione esta regra de iptables à sua firewall |
# /sbin/iptables -A INPUT -i br0 -j ACCEPT |
| Código: Reinicie a rede |
# /etc/init.d/net.eth0 stop # /etc/init.d/net.br0 start # ifconfig br0 # ifconfig eth0 |
Crie os scripts guest01-ifup e guest02-ifup
| Arquivo: nano -w guest01-ifup |
#!/bin/sh
#
# ____Address: 192.168.0.2 (guest01) and 192.168.0.3 (guest02)
# ____Netmask: 255.255.255.0
# ___Wildcard: 0.0.0.255
# ____Gateway: 192.168.0.254
#
if test $(/sbin/ifconfig | grep -c $1) -gt 0; then
/sbin/brctl delif br0 $1
ifconfig $1 down
fi
/sbin/ifconfig $1 0.0.0.0 promisc up
/sbin/brctl addif br0 $1
|
| Código: Crie interfaces TAP persistentes |
# tunctl -u root -t tap0 # tunctl -u root -t tap1 |
Commentário: Sugiro que crie o dispositivo tap de forma a que o seu possuidor seja o utilizador que vai correr o qemu, tal como se segue: tunctl -u <utilizador> -t tap0 Isto evita ter de correr o qemu como root em >=2.6.18 --Mistik1 00:18, 26 de Fevereiro de 2007 (UTC)
| Código: Agora inicie o QEMU para cada hóspede |
# /usr/local/bin/qemu -localtime -m 512m -cdrom /dev/cdrom \ -net nic,macaddr=52:54:00:12:34:56 -net tap,ifname=tap0,script=guest01-ifup \ -boot c -hda img=guest01.img # /usr/local/bin/qemu -localtime -m 512m -cdrom /dev/cdrom \ -net nic,macaddr=52:54:00:12:34:57 -net tap,ifname=tap1,script=guest02-ifup \ -boot c -hda guest02.img |
Atenção: Escolha endereços MAC diferentes para o guest01 e o guest02
"ifname=tap0" e "ifname=tap1" são os argumentos $1 usados no script guest-ifup
| Código: Verifique se a sua rede está correctamente configurada para cada hóspede |
# ifconfig tap0 # ping 192.168.0.2 # ifconfig tap1 # ping 192.168.0.3 |
[editar] Usar um alternador VDE
Necessita de dois scripts que simplificam as invocações dos módulos e definições necessários na zona de administrador, para os quais necessita de instalar o net-misc/vde de forma a ter o utilitário vde_switch.
| Código: Script para usar o QEMU com suporte para tun |
#!/bin/bash
set -e
IMGPATH=/mnt/qemu
IMG="-hda ${IMGPATH}/disk.img"
NETWORK="-net nic -net user"
MEMORY="-m 256"
CDROM="-cdrom /usr/local/isos/KNOPPIX_V5.0.1CD-2006-06-01-DE.iso"
BOOT="-boot c" # a - floppy (disquete), c - hd (disco rígido), d - cdrom
# preparar a rede
/bin/su -c "/usr/local/bin/qemu-helper start"
# Iniciar o QEMU
qemu ${IMG} ${MEMORY} ${CDROM} ${BOOT} ${QEMUIFUP} -localtime $1
# repor a rede, descarregar os módulos
/bin/su -c "/usr/local/bin/qemu-helper stop"
|
| Código: qemu-helper |
#!/bin/bash
case "$1" in
start) modprobe kqemu major=0
modprobe tun
vde_switch -tap tun0 -daemon
chmod 777 /tmp/vde.ctl
ifconfig tun0 10.0.0.1 up
;;
stop) ifconfig tun0 down
rm /tmp/vde.ctl
killall vde_switch
modprobe -r kqemu
modprobe -r tun
;;
esac
|
No sistema emulado, configure o endereço IP e o de DNS para serem obtidos por DHCP, devendo tudo funcionar correctamente. Pode substituir as invocações de /bin/su pelo sudo para ter mais conforto.
[editar] Utilização
- Use a opção -full-screen para ver o sistema operativo emulado em ecrã inteiro
- Clique dentro da janela do QEMU para controlar o sistema hóspede, Pressione Ctrl+Alt para regressar ao gentoo
- Pressione Ctrl+Alt+F para alternar o ecrã inteiro
- Pressione Ctrl+Alt+1-9 para alternar entre as "consolas" do QEMU. Ctrl+Alt+1 e Ctrl+Alt+2 são as mais acessíveis.
- Escreva qemu sem opções na consola para obter ajuda
- Escreva help na consola do QEMU (Ctrl+Alt+2 quando o QEMU está a correr)
[editar] Resolução de problemas
Para instalar o Windows 2000, experimente usar o parâmetro -win2k-hack para evitar erros de falta de espaço. Isto apenas se aplica ao processo de instalação do Windows e não deve ser usado quando o Windows 2000 já estiver instalado, uma vez que causa uma enorme lentidão no acesso ao disco no hóspede.
Quanto tiver problemas a compilar o QEMU experimente um gcc 3.x. Aparentemente, mesmo o QEMU mais recente (0.8.2) não suporta as versões 4.x do gcc - No entanto, a versão 0.8.1 aparenta não ter este problema. É também possível instalar o KQEMU com o GCC 4.x e outros pacotes do QEMU com o GCC 3.x. Funciona comigo e com algumas pessoas que conheço.
Se está a ter problemas com o QEMU a crashar ou reiniciar enquanto tenta instalar o Windows XP como sistema operativo hóspede correndo o módulo kqemu, tente instalar o Windows sem o ter o módulo kqemu a correr. Segundo o que se diz nos fóruns, o kqemu parece causar problemas com o processo de instalação. Após ter instalado o Windows (o que irá demorar um bocado), pode voltar a usar o kqemu.
[editar] Redimensionar imagem
Para imagens qcow, uma vez que ainda não podem ser redimensionadas nativamente:
qemu-img convert -f qcow xp.cow -O raw xp.raw dd if=/dev/zero of=xp.raw conv=notrunc seek=4300 obs=1MB count=1 qemu-img convert -f raw xp.raw -O qcow xp-resized.cow
[editar] Dicas e Truques
- Para mudar de CD-ROMs físicos quando está na imagem, abra a consola do QEMU (CTRL+ALT+2-9) e escreva
| Código: mudar CD-ROMs |
eject cdrom change cdrom /dev/cdrom |
- Use -monitor stdio -vnc 1 para correr o QEMU no modo servidor. Não vai obter uma GUI, simplesmente ligue-se através de vnc a localhost:1.
[editar] Referências externas (em inglês)
- Homepage do QEMU
- FAQ não oficial do #qemu
- documentação do KQEMU
- Página do QEMU na Wikipédia
- QEMU + WinXP nos Fóruns do Gentoo
- [http://forums.gentoo.org/viewtopic-t-384104-highlight-qemu.html Rede no SO hóspede, do fórum de língua alemã, no entanto bastante compreensível para qualquer um se olharem apenas para dentro das caixas verdes ;-).
- QEMU com conectividade vde
- Relatório de Bug do Gentoo 132667 sobre os problemas de compilação com o GCC4.
