Creare immagini Linux virtuali - chroot, User Mode Linux
Da Hacknowledge.
Indice |
[modifica] Creazione di un'immagine
Esamineremo qui un modo per installare in locale una Debian, da eseguire all'interno del proprio sistema Unix già installato (che sia esso Slackware, Ubuntu, Fedora, SuSe o un'altra Debian) ed eseguibile anche in User Mode Linux o su una virtual machine.
Cominciamo creando l'immagine del nostro sistema tramite dd (in questo caso creerò un'immagine grande 1 GB):
dd if=/dev/zero of=debian.img bs=1 count=1 seek=1G
Ora sul file appena creato creiamo un filesystem di tipo ext3:
mke2fs -j -v debian.img
Fatto il filesystem, provvediamo a montarlo:
mkdir /mnt/virtual mount -t ext3 -o loop debian.img /mnt/virtual
Se dovessimo ottenere un errore del tipo 'impossibile montare il filesystem come loop' probabilmente dobbiamo caricare il modulo di loop:
modprobe loop
[modifica] Installazione di Debian sull'immagine
Ora dobbiamo installare sul filesystem appena creato un sistema Debian. Per farlo usiamo il comando debootstrap messo a disposizione da Debian stessa. Se non siamo su una Debian possiamo scaricare il pacchetto .deb che ci serve, convertirlo nel formato della nostra distro e installarlo. Ad esempio, su una Slackware:
wget http://ftp.de.debian.org/debian/pool/main/d/debootstrap/debootstrap_0.3.3.2etch1_all.deb ar x debootstrap_0.3.3.2etch1_all.deb mv data.tar.gz debootstrap_0.3.3.2etch1_all.tgz installpkg debootstrap_0.3.3.2etch1_all.tgz
Installata l'utility, procediamo con l'installazione del sistema Debian nel seguente modo:
debootstrap --verbose --arch i386 etch /mnt/virtual http://ftp.de.debian.org/debian
Il processo richiederà un po' e tutti i pacchetti verranno installati sul sistema. A questo punto possiamo passare sul nostro sistema virtuale appena installato con una semplice chroot:
chroot /mnt/virtual
La prima cosa che possiamo fare è aggiornare la lista dei repository. Modifichiamo a nostro piacimento il file /etc/apt/sources.list includendo i repository che vogliamo, quindi aggiorniamo la lista:
apt-get update
E ora possiamo installare via apt-get i pacchetti che vogliamo sul nostro sistema. Per uscire e tornare sul sistema 'ospite' basterà un exit.
[modifica] User Mode Linux
Volendo possiamo anche avviare l'immagine via User Mode Linux, in modo da eseguire un'autentica piccola macchina virtuale, utile nel caso di testing di kernel e/o applicazioni o nell'ambito della sicurezza.
Per fare ciò, scarichiamo da kernel.org l'ultima versione dei sorgenti del kernel, esempio:
wget http://kernel.org/pub/linux/kernel/v2.6/linux-2.6.24.3.tar.bz2 tar jxvf linux-2.6.24.3.tar.bz2 cd linux-2.6.24.3.tar.bz2
Ora configuriamo e compiliamo il kernel in modo che sia pronto per bootare un sistema User Mode Linux:
make ARCH=um menuconfig # Configurare il kernel a modo make ARCH=um linux
Alla fine della fase di compilazione ci ritroveremo con un'immagine bootabile chiamata 'linux'. Copiamola in /usr/bin, in /usr/local/bin o in qualsiasi directory del PATH. Possiamo ora aviare il nostro sistema semplicemente in questo modo:
linux ubd0=debian.img
[modifica] COW (Copy-On-Write)
Una cosa molto utile in User Mode Linux è fare in modo di lasciare inalterata l'immagine originaria, è costruire su quest'ultima anche più di una macchina virtuale, in modo da fare esperimenti su questa senza toccare la base originaria. È anche molto utile per eseguire contemporaneamente più sistemi virtuali con caratteristiche diverse sulla stessa base. Per fare ciò, User Mode Linux mette a disposizione il meccanismo dei file COW (Copy-On-Write).
L'uso è molto semplice: quando avviamo la nostra immagine, specifichiamo anche che file COW usare:
linux ubd0=immagine1.cow,debian.img
In questo modo tutte le operazioni che faremo sul nostro sistema operativo virtualizzato verranno salvate sul file COW, lasciando inalterata l'immagine Debian.
[modifica] Interfacce di rete
Se il sistema ospite ha il modulo tuntap, è possibile condividere la sua interfaccia di rete con il sistema virtualizzato in User Mode Linux (bridged networking). Ciò è possibile semplicemente richiamando il sistema come
linux ubd0=immagine1.cow,debian.img eth0=tuntap,,,192.168.1.2
In questo caso al boot verrà creata l'interfaccia di rete eth0, che è condivisa con il sistema ospite, che in questo caso ha IP 192.168.1.2.
L'alternativa per fare esperimenti con più macchine virtuali contemporaneamente è quella di scaricare le uml-utilities e usare uml_switch. In questo caso avviamo un hub o uno switch virtuale, attraverso il quale possiamo simulare il comportamento di un'intera rete. Per creare uno switch virtuale di tipo Unix ad esempio,
uml_switch -unix /tmp/switch.ctl
Verrà creato il descrittore specificato in /tmp. Se invece di uno switch volessimo creare un hub, ovvero un semplice replicatore di pacchetti virtuale su cui fare i nostri esperimenti, daremmo il comando
uml_switch -unix /tmp/switch.ctl -hub
Ora per avviare una macchina virtuale che usi questo switch daremo
linux ubd0=immagine1.cow,debian.img eth0=daemon,,unix,/tmp/switch.ctl

