Come creare un'immagine hard disk di 4Gb nel formato qcow2 e avviare facendo boot da un'immagine CD-ROM.
La dimensione effettiva dell'immagine disco è dinamica (cresce secondo la necessità), il formato qcow2 supporta il salvataggio di snapshot delle macchine virtuali. In alternativa il formato raw è più facilmente esportabile verso altri emulatori, è anch'esso dinamico se il fs ospite supporta gli holes, come ext2 ed ext3.
qemu-img create -f qcow2 qemu.qcow 4G qemu -hda qemu.qcow -cdrom debian-31r0a-i386.iso -boot d
Dentro l'emulazione funzionano le seguenti combinazioni di tasti:
Ctrl+Alt+1 | Target system display |
---|---|
Ctrl+Alt+2 | Monitor |
Ctrl+Alt+3 | Serial port |
Dal monitor è possibile ad esempio salvare lo stato corrente della macchina virtuale, per poi poterla fermare e riavviare successivamente.
Lanciando Qemu con le opzioni predefinite e senza bisogno di privilegi di root nell'ambiente emulato troviamo un server DHCP che risponde all'indirizzo 10.0.2.2 e assegna indirizzi a partire dal 10.0.2.15. Il server DHCP simulato funziona anche da DNS e da firewall consentendo pertanto l'uscita su internet. Solo il ping verso internet non è supportato.
Si tratta di una configurazione più complessa ma più versatile, richiede il supporto tun/tap del kernel (CONFIG_TUN=m
, modprobe tun
) e il pacchetto Debian bridge-utils.
Come prima cosa sulla macchina reale si deve attivare un'interfaccia bridge (br0) e aggiungere ad essa la normale Ethernet (eth0), la configurazione IP passa dalla Ethernet al bridge. Inoltre si deve attivare l'IP forwarding. Per tutto questo si può predisporre uno script start/stop da eseguire come root:
#!/bin/sh # Setup the network bridge of a Qemu host. # Run this script with the "start" option before starting a Qemu VM. # Need superuser privileges. BR=br0 # Network configuration. ETH=eth0 ADDRESS=10.0.1.2 NETMASK=255.255.255.0 GATEWAY=10.0.1.254 # Default IP forward status. FORWARD=0 case "$1" in start) echo "Sostituzione dell'interfaccia $ETH con $BR..." brctl addbr $BR brctl addif $BR $ETH ifconfig $ETH 0.0.0.0 ifconfig $BR $ADDRESS netmask $NETMASK route add default gw $GATEWAY echo 1 > /proc/sys/net/ipv4/ip_forward ;; stop) echo "Reimpostazione di $ETH e rimozione di $BR..." echo $FORWARD > /proc/sys/net/ipv4/ip_forward ifconfig $BR down brctl delif $BR $ETH brctl delbr $BR ifconfig $ETH $ADDRESS netmask $NETMASK route add default gw $GATEWAY ;; *) echo "Usage: $0 {stop|start}" esac
Per sfruttare il tun/tap si lancia Qemu in questo modo:
qemu -net nic -net tap,ifname=tap0,script=/etc/qemu-ifup -hda win98.qcow
Purtroppo in questo modo Qemu deve attivare un'interfaccia tap0 e quindi ha bisogno dei privilegi di root. L'interfaccia tap0 deve essere aggiunta al bridge ed attivata, per questo lo script /etc/qemu-ifup
contiene:
#!/bin/sh case "$1" in tap*) ifconfig "$1" up brctl addif br0 "$1" ;; esac
Grazie a QEMU è possibile fare il debug di cosa avviene sulla porta seriale emulata. Si deve ricorrere ad un trucco e al programma slsnif
(che purtroppo non esiste pacchettizzato Debian). Si lancia Qemu ridirigendo la seriale dal terminale ad un file, poi si utilizza slsnif
per replicare il traffico intercettato nuovamente sulla seriale:
qemu -hda win98.qcow -serial pty > /tmp/qemu.log 2>&1 & sleep 2 slsnif -s 9600 -p `cat /tmp/qemu.log | grep /dev/pts | cut -c 27-38` /dev/ttyS0
Durante l'installazione di Windows 2000 è necessario passare il parametro speciale -win2k-hack
al qemu, altrimenti l'installazione si blocca durante il rilevamento delle periferiche:
qemu -win2k-hack -hda win2k.qcow -cdrom /dev/hda
Con Qemu 0.12.3 pacchettizzato Debian pare che sia cambiato qualche impostazione predefinita sulla modalità di funzionamento della rete, ecc. La formula magica per avviare l'emulatore con il supporto di rete in modalità user è:
qemu -net nic,model=rtl8139 -net user -hda win2k.qcow -cdrom /dev/hda
La sigla amd64 è utilizzata come sinonimo di X86-64, la sigla i386 invece è sinonimo di X86.
Su una macchina ospite i386 si è fatta una installazione Debian Lenny amd64 in ambiente Qemu x86-64, partendo dall'immagine netinst:
qemu-system-x86_64 -m 256 -hda rootfs.img -cdrom debian-testing-amd64-netinst.iso -boot d
Sfortunatamente c'è un problema con GRUB in ambiente Qemu x86_64: l'installazione di GRUB si blocca al 50%, con la CPU occupata al 100%. È necessario fare reboot, avviare in modalità rescue ed installare grub2:
apt-get install grub2 grub-install update-grub
Le performance sono scadenti in quanto tutto l'ambiente è emulato.
Se si tenta di avviare la macchina virtuale amd64 con il comando qemu-system-i386
si ottiene ovviamente l'errore:
This kernel requires an x86-64 CPU, but only detected an i686 CPU. Unable to boot - please use a kernel appropriate for your CPU.
Anche utilizzando kvm
si ha lo stesso problema, perché l'ambiente ospite è i386. Una macchina ospite kvm conviene che sia x86-64, in tal modo è possibile emulare a piena velocità macchine virtuali i386 e amd64.