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
Strumenti personali