Ci sono ottime ragioni perché un utente GNU/Linux abbia il desiderio di eseguire applicazioni scritte per Microsoft Windows all'interno del proprio sistema. Una strada è quella di eseguire un singolo applicativo via Wine, un ambiente software che fornisce le API di Windows; un'altra, quella descritta in quest'articolo, è eseguire l'intero sistema operativo in emulazione con QEMU.
QEMU, in breve, è un emulatore generico di CPU, scritto e ideato da Fabrice Bellard, è free software ed offre una buona velocità di esecuzione anche se confrontato con i suo concorrenti commerciali. QEMU offre supporto per una decina di CPU differenti, anche se quelle per cui il supporto è stabile sono x86, x86_64 e ppc. Per le macchine x86 che emulino una macchina x86 esiste poi QEMU Accelerator in grado di migliorare le prestazioni di emulazione, un prodotto che, pur essendo dello stesso autore, è proprietario per le ragioni illustrate in questa pagina.
E ora divertiamoci ad installare Windows dentro Linux!
Per gli utenti Debian, a cui è dedicata questa breve guida, l'installazione è semplice e immediata:
~# apt-get install qemu
Prima di procedere all'installazione di Windows, è oppurtuno configurare la rete, in modo che il sistema emulato possa usufruire della connessione Internet della macchina host. Per fare questo è necessario il device /dev/net/tun per virtualizzare la rete. Verificate di avere il device:
~$ file /dev/net/tun /dev/net/tun: character special (10/200)
Se invece la risposta è:
~$ file /dev/net/tun /dev/net/tun: ERROR: cannot open `/dev/net/tun' (No such file or directory)
sarà necessario crearlo:
~# mkdir -p /dev/net ~# mknod /dev/net/tun c 10 200
ed abilitare il modulo nel Kernel:
~# modprobe tun ~# echo 'tun' >> /etc/modules
Debian, di default, non permette all'utente di utilizzare questo device, dovrete quindi cambiare i permessi:
~# chgrp qemu /dev/net/tun ~# chmod g+w /dev/net/tun
Ricordate di iscrivere l'utente al gruppo qemu! L'ultimo passo per abilitare la rete è permettere al sistema ospite di utilizzarla, quindi:
~# iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE ~# echo "1" >/proc/sys/net/ipv4/ip_forward
Ora che i preliminari sono finiti possiamo fare le cose divertenti. Prima di tutto creiamo una directory di lavoro e andiamoci dentro.
~$ mkdir win2k ~$ cd win2k
Dal nome della directory è facile intuire che abbiamo deciso per l'installazione di Microsoft Windows 2000, che a quanto dice la documentazione di Qemu è un'ottima scelta tra i sistemi Windows. Quindi procuriamoci il cd di installazione e memorizziamone il contenuto all'interno di una immagine ISO.
dd if=/dev/cdrom of=win2k.iso
Ora prepariamo l'harddisk, che sarà un file lungo circa 4GB.
~$ dd of=hd.img bs=1024 seek=4000000 count=0 entrati 0+0 record usciti 0+0 record 0 bytes transferred in 0.000133 seconds (0 bytes/sec)
Creare l'immagine disco in questo modo ha il vantaggio che potremo montarla in loop e quindi intervenire sul filesystem di Windows senza necessariamente avviare il sistema in emulazione. Per montare l'immagine disco è sufficiente:
~$ mkdir loop ~$ mount -o loop,offset=32256 hd.img loop
Sarà possibile montare il disco non appena terminata l'installazione, per i dettagli far riferimento a Mounting disks with Linux's loopback device.
A questo punto è possibile installare Windows 2000 con un solo comando:
~$ qemu -hack-win2k -cdrom win2k.iso -hda hd.img -user-net -boot d
In pochi secondi si apriranno le schermate tipiche di Windows 2000 e l'installazione procederà esattamente come fosse un PC dedicato ad esso.


Installazione di Windows
2000 (1/3)


Installazione di Windows
2000 (2/3)


Installazione di Windows
2000 (3/3)
L'installazione (senza QEMU Accelerator) occupa circa due ore di tempo su una macchina con CPU da 2.4Ghz e 512MB di RAM, qualcosa come il doppio rispetto ad una installazione dedicata.
A questo punto Windows chiederà di rimuovere il cdrom di installazione e riavviare la macchina. A noi basterà un bel killall -9 qemu e poi lanciare il boot direttamente dall'immagine disco.
~$ qemu -hda hd.img -boot c -user-net
Ed ecco qua:

Boot di Windows 2000 dentro
Qemu
Quello che il software libero non è ancora riuscito a fare è migliorare il software proprietario, infatti se Windows funziona male fuori, funzionerà male anche dentro QEMU. Ecco infatti che pochi secondi dopo il boot esce una schermata inquietante: la DLL msgina.dll è corrotta e non funziona... ovviamente il suggerimento di Microsoft è quello di sostituirla con quella originale... :-(.

msgina.dll blocca il
sistema
Spulciando nella documentazione Microsoft si trova una pagina dedicata all'argomento, che dice, grosso modo: prendete un altro PC con Windows 2000, copiate msgina.dll su un floppy, fate boot con il cd di installazione e il floppy, sostituite via MS-DOS la DLL corrotta con quella del sistema funzionante.
Fantastico: per correggere un errore di Microsoft devo comprare un altro prodotto Microsoft! Sono dei campioni. Comunque, la cosa funziona, quindi salvate msgina.dll su un floppy e mettelo nel lettore della vostra Linux Box. Quindi:
~$ dd if=/dev/fd0 of=~/win2k/floppy.img
Ora fate boot con il cd di installazione e il floppy insieme...
~$ qemu -cdrom win2k.iso -hda hd.img -fda floopy.img -boot d -user-net
Seguite le istruzioni e ...
Avviando nuovamente l'emulatore da HD il boot viene completato e Windows 2000 è disponibile all'interno della finestra di QEMU. Per abilitare la rete dovrete seguire le istruzioni che appaiono cliccando l'icona "Connessione ad Internet" sul desktop, a seguire avrete un sistema Windows pienamente funzionante in cui installare applicativi o fare test ed esperimenti.


Finalmente il boot senza errori


Le proprietà del disco e il primo
programma installato
Ora è possibile spegnere il computer
Ora che funziona, la prima cosa da fare è conservare l'immagine disco, in modo che si possa lavorare in regime di backup attivo. Farlo è molto semplice, basta copiare il file:
~$ cp -v hd.img hd_copy.img
ed avviare dalla copia:
~$ qemu -hda hd_copy.img -boot c -user-net
E' ovviamente possibile installare sia Windows 95/98 che Windows XP con lo stesso sistema, anche se, senza acceleratore, le prestazioni non saranno altrettanto buone, così come è possibile installare qualsiasi distribuzione Linux per x86, mentre molto presto sarà possibile emulare MAC OS X richiamando l'emulatore qemu-ppc. Per una lista dei sistemi supportati fate riferimento alla pagina QEMU OS Support. Personalmente ho provato molte distribuzioni live, tra cui Knoppix, Ubuntu e Damn Small Linux, e tutte con ottimi risultati:
~$ qemu -cdrom live-distro.iso -boot d -user-net