Tutorial Qemu

De Gentoo Linux Wiki

Este artigo faz parte do grupo dos Tutoriais.

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

Aviso: Os utilizadores têm tido resultados diferentes ao tentar compilar o QEMU com o GCC 4.x. De momento, compilar o QEMU com o GCC4 não é suportado pelo Upstream, devido a complicações no código. Existe um relatório no bugzilla aqui:http://bugs.gentoo.org/show_bug.cgi?id=132667


Aviso: Se compilar o seu kernel com o gcc4 e o módulo kqemu com o gcc3, é provável que ele falhe ao ser carregado.

[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
Nota: Os utilizadores do GCC4 poderão também ter de alterar temporariamente as suas CFLAGS, simplificando - especialmente em máquinas Athlon-XP. "-march=athlon-xp" necessita de ser alterado para "-mtune=athlon-xp".

[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)

Ferramentas pessoais
Outras línguas