Table of Contents

QEMU

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

Tasti speciali

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.

Interfaccia di rete user mode network stack

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.

Interfaccia di rete tap

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

Debug della seriale

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

Installazione di Windows 2000

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

Debian Lenny amd64 in Qemu, su host i386

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.