====== 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 **[[wp>X86-64]]**, la sigla **i386** invece è sinonimo di **[[wp>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 **[[http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=425648|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**.