QEMU CPU Emulator


Come recita il sito http://fabrice.bellard.free.fr/qemu/, QEMU is a FAST! processor emulator using dynamic translation to achieve good emulation speed.
A parere mio Qemu si comporta come un bios a cui è possibile innestare una parte dell'hardware; ma questa è una considerazione tutta personale.

Le periferiche emulate sono le seguenti:
  • i440FX host PCI bridge and PIIX3 PCI to ISA bridge
  • Cirrus CLGD 5446 PCI VGA card or dummy VGA card with Bochs VESA extensions (hardware level, including all non standard modes).
  • PS/2 mouse and keyboard
  • 2 PCI IDE interfaces with hard disk and CD-ROM support
  • Floppy disk
  • NE2000 PCI network adapters
  • Serial ports
  • Soundblaster 16 card
ed è comunque possibile utilizzare floppy e cdrom 'reali'.

Si tratta di un emulatore coi fiocchi; è multipiattaforma e offre l'opportunità di provare vari sistemi operativi senza per questo doverli installare sul PC.
Dà la possibilità di usare anche immagini ISO, quindi distro live, senza che sia necessario masterizzare il file ISO nottetempo scaricato.
Su http://www.freeoszoo.org/download.php, si trovano i pacchetti per l'uso sotto Linux, MAC OS X e Windows, oltre ad immagini RAW di hard disks contenenti sistemi operativi già installati e pronti all'uso. E' ovvio che trattasi di sistemi free, quindi è inutile cercare immagini contenenti un Windows qualsiasi installato.

La documentazione si trova su http://fabrice.bellard.free.fr/qemu/qemu-doc.html e sembra piuttosto dettagliata, quindi mi limiterò all'indispensabile:

Prima di tutto installiamo il pacchetto e magari anche il launcher, che aiuta molto... anche se poi la shell è sempre la shell :P.
# apt-get install qemu qemu-launcher

[nota di mrjive: esiste l'utility qemu-img per creare l'immagine:
qemu-img create miaraw.img 2G
per creare un'immagine di due giga, e un ottimo tutorial che giuSerpe mi ha segnalato:
http://www.montellug.it/wiki/index.php/Windows_su_Linux_con_qemu ]

Prepariamo subito un'immagine RAW vuota:
$ dd of=miaraw.img bs=1024 seek=1024000 count=0
il file miaraw.img ottenuto avrà la dimensione di 1,024 GB.
Una nota particolare la richiede il partizionamento. L'uso di fdisk non ha portato a risultati idonei: rimediamo con [Ranish] che è piuttosto intuitivo. Ranish non offre molte possibilità di scelta del tipo di filsystem, ma è molto potente ed efficace ed ha giusto cio' che ci serve. L'unico guaio è che funziona sotto DOS, quindi è necessario procurarsi un floppy di boot opportuno: http://www.bootdisk.org/.

[nota di mrjive: io ho fatto senza; w2k non ne vuole sapere, ma il 98 si e' installato senza problemi.]

una volta presa l'immagine di floppy-boot che preferiamo, la portiamo su floppy con:
$ dd if=immagine_floppy-boot of=/dev/fd0
e gli aggiungiamo i files contenuti nel pacchetto di Ranish.
Ripensamenti circa la dimesione del file di un'immagine raw possono risolversi con la seguente riga, che, nell'esempio, porterà la dimensione del file image.raw a 2 Gb:
dd if=/dev/zero of=image.raw seek=20480000 count=0

A questo punto siamo pronti per partizionare la nostra immagine RAW; per farlo lasciamo il floppy nel lettore ed utilizziamo appunto qemu:
$ qemu -L /usr/share/qemu -hda miaraw.img -fda /dev/fd0 -boot a -localtime 
sarà avviato il sistema guest, in questo caso quello contenuto nel foppy, da cui far partire Ranish e partizionare a piacere in nostro file-immagine. [Screenshot]
Fatto il partizionamento, possiamo passare all'installazione del sistema che preferiamo, dopo aver inserito nel lettore cdrom il cd di installazione:
$ qemu -L /usr/share/qemu -hda miaraw.img -cdrom /dev/cdrom -boot d -localtime -pci

Lo stesso risultato è ottenibile semplicemente utilizzando l'installer del SO che abbiamo scelto di installare, a patto che non usi fdisk. Es.:
$ qemu -L /usr/share/qemu -hda miaraw.img -cdrom warty-x.iso -boot d -localtime -pci
che installerà [UBUNTU] su miaraw.img (ammesso che 1 GB ci basti) preoccupandosi del partizionamento.

Il file miaraw.img resta accessibile a Linux attraverso un mount così congegnato:
$ mount -o loop,offset=32256 miaraw.img -t vfat /punto_di_mount
Attenzione però: il "numero magico" 32256, usato per saltare la tabella delle partizioni e passare direttamente all'area dati del file RAW, può non essere corretto ed il mount può anche non funzionare; conviene perciò far ricorso ad [lomount]: un comodissimo script che farà tutto al posto nostro.

Host e Guest in LAN

Particolare attenzione merita la possibilità di condivisione delle risorse tra Host e Guest.
Per fare ciò, è necessario un gateway attraverso il quale i due sistemi possano guardarsi. Come è ovvio, prima di tutto occorre installare samba e configurarlo adeguatamente.
Poi, per dar vita al gateway è necessario installare il pacchetto vtun con:
#apt-get install vtun
mediante cui, al momento dell'avvio di qemu, sarà creata l'interfaccia di rete tun0 che rimarrà in essere fino alla chiusura di qemu stesso.
Creiamo, quindi, un file di nome /etc/qemu-ifup in cui inseriremo queste righe:
#!/bin/sh
# This is file /etc/qemu-ifup for use with tun/tap
sudo /sbin/ifconfig tun0 192.168.1.254
Cio' consentirà di attribuire all'interfaccia tun0 l'ip di gateway.
Infine, avviato qemu, bisognerà attribuire all'interfaccia di rete del sistema emulato lo stesso ip di gateway ed un idoneo ip di rete tipo:
ip      192.168.1.200
mask    255.255.225.0
gateway 192.168.1.254
Dopo il riavvio del sistema emulato (ammesso che si tratti di Windows), sarà possibile condividere porzioni di filesystem, così come, da Guest, sì avrà la possibilità di inviare i nostri lavori alla stampare di Host.

[nota di mrjive: usando l'opzione -user-net e impostando l'OS ospite per ottenere l'ip in DHCP la rete (internet) va. Per le condivisioni e' possibile usare l'opzione -smb dir (che devo ancora testare)
-user-net funziona out-of-the-box ]

[nota di micetto: sulle ultime versioni di debian bisogna assegnare un owner all'interfaccia tun0 altrimenti non puo' essere utilizzata. Per fare questo bisogna utilizzare il comando tunctl che si trova nel pacchetto uml-utilities]

Condividere la connessione ad internet

E' possibile utilizzando Linux condividere la connessione ad internet al sistema operativo
emulato.
Basta aggiungere le seguenti righe al file /etc/qemu-ifup di startup delle interfaccie di rete di qemu.
#!/bin/sh
# This is file /etc/qemu-ifup for use with tun/tap
sudo /sbin/ifconfig tun0 192.168.1.254
sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
sudo echo "1" >/proc/sys/net/ipv4/ip_forward

Utilizzando come gateway l'indirizzo 192.168.1.254 viene condivisa la connessione
ad internet.
[nota di micetto:
Nelle versione recenti di Qemu ( >= 0.8.0 ) bisogna specificare a linea di comando la configurazione di rete per l'emulatore. In particolare, per condividere la connessione bisogna avviare l'emulatore nel seguente modo:
qemu -net nic,vlan=0 -net tap,vlan=0,ifname=tun0 -L /usr/share/qemu -hda miaraw.img 
Ricordate anche che l'opzione -user-net non esiste più. Viene sostituita da -net user .
]

Qualche istruzione per Windows:

Prendiamo l'ultima versione da: ftp://ftp.freeoszoo.org/qemu/win32/daily/ ed installiamo.
Andiamo in shell di DOS ed entriamo nella dir di Qemu (solitamente c:\Programmi\qemu); quindi creiamo la nostra immagine raw con
c:\Programmi\qemu>mkdiskimage miaraw.img -s xx
in cui xx è la dimensione in MB dell'immagine da creare.
L'uso di Qemu da shell è identico a quello di Linux, tranne che, ovviamente, per il mount che non è possibile, a meno di utility che io non conosco.
Anche per Windows c'è un launcher niente male.


dd if=/dev/zero of=discoxp.img bs=1M count 48
se poi vuoi partizionarlo tu:
losetup /dev/loop0 discoxp.img
fdisk /dev/loop0
losetup -d /dev/loop0
per formattare la prima partizione:
lostetup -o 32256 /dev/loop0 discoxp.img
mkfs.vfat /dev/loop0
http://www.itsistemi.net/viewtopic-247682.html


Links:



Screenshots:


IRC:

Server irc.freenode.net
Chan #qemu-it
Chatzilla irc://irc.freenode.net/#qemu-it