Macchine Virtuali con User Mode Linux

Preparazione

  • Prima di tutto dovremo predisporre due file che conterranno rispettivamente la partizione di swap ed il filesystem root della nostra macchina virtuale.
  • La partizione di swap dovrà avere il doppio della dimensione della RAM che assegneremo alla macchina virtuale
  • Il filesystem dovrà essere abbastanza grande da contenere il sistema operativo, le applicazioni ed i dati che vorremo utilizzare

Preparazione

  • Per creare questi file potremo utilizzare il comando dd, nel seguente modo
    dd if=/dev/zero of=vmswap bs=1M seek=511 count=1
    dd if=/dev/zero of=root bs=1M seek=4K count=1
  • Con questi comandi creeremo un file di swap chiamato vmswap di 512 MB ed un file principale chiamato root della dimensione di 4GB

Preparazione

  • Potremo ora formattare le nostre due partizioni con i seguenti comandi:
    /sbin/mkswap vmswap
    /sbin/mkfs -t ext3 root
    L'ultimo comando si lamenta che si vuol formattare un file invece che un dispositivo. Se usiamo la versione italiana del comando, la domanda viene posta in inglese, ma dovremo comunque rispondere s

Macchine virtuali

  • Quando noi avviamo il nostro computer, esso carica un sistema operativo che si incarica di gestire l'hardware e di coordinare l'esecuzione delle applicazioni
  • Se vogliamo provare un'altra distribuzione o del software particolare, possiamo sempre installare una nuova distribuzione in un'altra partizione e riavviare il computer con quella partizione, ma non possiamo avere la nostra distribuzione e la nuova contemporaneamente.
  • Una soluzione è quella di caricare la nuova distribuzione in una macchina virtuale.
  • Le soluzioni classiche scelte per questo sono Xen e VMWare.

Macchine virtuali

  • Xen richiede di modificare il kenrnel ed avviare Linux fin dal boot nel modo corretto per caricare le macchine virtuali, ed è abbastanza complesso da configurare
  • VMWare non richiede modifiche al sistema ospitato, intercetta tutte le chiamate all'hardware, ma questo rallenta il funzionamento.
  • Una soluzione alternativa molto più semplice è User Mode Linux.
  • Con questa soluzione noi avvieremo il kernel di Linux della nostra macchina virtuale come fosse un normale programma.

Macchine virtuali

  • In questo modo il nuovo kernel richiederà i regolari servizi del kernel del sistema reale per tutti gli accessi all'hardware, riducendo al minimo i rallentamenti.

Preparazione delle interfacce di rete

  • L'installazione prosegue avviando il sistema appena creato.
  • Per prima cosa dovremo predisporre la rete per consentire alla nostra machina virtuale di accedervi.
  • Rimanendo loggati come root, dovremo creare l'interfaccia virtuale di rete che la macchina virtuale utilizzerà. Useremo uno script che fa parte del pacchetto UML:
    tunctl -u <utente>

Preparazione delle interfacce di rete

  • Questo comando crea una coppia di interfacce di rete in comunicazione tra loro, una che verrà utilizzata dal nostro Linux virtuale ed un'altra che verrà utilizzata dal Linux reale.
  • Entrambe dovranno possedere un indirizzo IP valido, appartenente alla nostra rete.
  • Assegneremo un indirizzo al' interfaccia virtuale della macchina reale con il comando:
    ifconfig tap0 <indirizzo IP valido> up
  • Se abbiamo creato più interfacce, avremo da configurare oltre a tap0 anche tap1 ecc. Possiamo dare a tutte lo stesso indirizzo IP

Preparazione delle interfacce di rete

  • Gli indirizzi IP delle interfacce delle macchine virtuali andranno configurati nelle macchine virtuali: li abbiamo configurati nel file /etc/network/interfaces al passo precedente.

Configurazione dell'installazione

  • Prima di lanciare la nostra macchina virtuale dovremo configurare tre file con i dati del nostro sistema.
  • /<directory dove � montata l'immagine>/etc/network/interfaces
    auto eth0 iface eth0 inet static
    address <indirizzo IP della macchina virtuale>
    network <indirizzo di rete della nostra rete>
    netmask <netmask della nostra rete>
    broadcast <indirizzo di broadcast della nostra rete>
    gateway <router per internet della nostra rete>

Configurazione dell'installazione

  • /<directory dove � montata l'immagine>/etc/fstab
    /dev/hda1       /       ext3    defaults        0       0 
    /dev/hda2 none swap sw 0 0
    proc /proc proc defaults 0 0
    /dev/hdb /media/cdrom0 udf,iso9660 user,noauto 0 0
    none /media/sid hostfs <la nostra home directory> 0 0
  • /<directory dove è montata l'immagine>/etc/apt/sources.list
    deb http://ubuntu.fastbull.org/ubuntu gutsy main restricted universe

Installazione del sistema di base

  • Per installare il sistema di base nel nostro filesystem utilizzeremo l'utility deboostrap che consente appunto di installare un sistema Debian o derivato in un filesystem a partire da un sistema Debian funzionante
  • Per prima cosa dovremo fare login come root, oppure utilizzare su - (o sudo bash -) in un terminale.
  • Dovremo ora accertarci di avere debootstrap installato nel nostro sistema, ed eventualmente installarlo con il seguente comando, che si preoccupa di installare anche le dipendenze:
    aptitude install debootstrap

Installazione del sistema di base

  • Ora dovremo montare il file appena formattato, creando prima una directory per il montaggio, quindi montando la partizione:
    mkdir target
    mount root target -o loop
  • Potremo ora finalmente creare il nostro file system iniziale con debootstrap:
    debootstrap gutsy target http://ubuntu.fastbull.org/ubuntu/
  • Dove gutsy indica che stiamo installando la nuova Ubuntu Gutsy Gibbon, target è la directory dove è montato in nostro filesystem e per finire http://ubuntu.fastbull.org/ubuntu/ è un mirror italiano di Ububtu.

Pubblicazione della rete

  • Se vogliamo adesso che la nostra macchina virtuale possa accedere all'esterno, dovremo abilitare il riconoscimento delle interfacce di rete virtuali attraverso la reale.
  • Per prima cosa, abiliteremo la caratteristica nell'interfaccia con il seguente comando:
    echo 1 > /proc/sys/net/ipv4/conf/tap0/proxy_arp
  • Quindi dovremo abilitare la nostra macchina a instradare pacchetti IP, in modo che il pacchetti destinati alle macchine virtuali e ricevuti dall'interfaccia reale vengano instradati correttamente.

Pubblicazione della rete

  • Il comando per abilitare l'instradamento è:
    echo 1 > /proc/sys/net/ipv4/ip_forward
  • Dovremo ora indicare dove inviare i pacchetti per le interfacce virtuali aggiungendo una riga alla tabella di routing con il seguente comando:
    route add -host <indirizzo IP della macchina virtuale> dev tap0
  • Per finire, dovremo fare in modo che l'interfaccia di rete reale dica di possedere gli indirizzi delle schede virtuali

Pubblicazione della rete

  • Il comando per ottenere questo è:
    arp -Ds <indirizzo IP della macchina virtuale> eth0 pub

Continuazione dell'installazione

  • A questo punto il sistema installato è un sistema minimale. Dovremo installare il software che ci interessa.
  • Potremo fare login come root in una a scelta delle console. Root non ha password in questo momento
  • Nella preparazione dei file abbiamo corretto le sorgenti di APT, aggiungendo i repository necessari.
  • Dovremo aggiornare APT, lanciando come al solito il comando
    aptitude update

Continuazione dell'installazione

  • Se l'aggiornamento ha avuto successo, la rete è stata configurata correttamente, altrimenti controlliamo la configurazione della rete.
  • Possiamo ora installare il software che ci interessa, digitando
    tasksel
    che ci presenta l'elenco delle possibili configurazioni.
  • Una volta confermato, verrà installato tutto il software necessario. L'operazione può anche richiedere parecchio tempo.

Avvio della grafica

  • User Mode Linux non emula una scheda grafica, quindi il desktop non potrà essere direttamente avviato.
  • Per potere usare la grafica della nostra macchina potremo invece utilizzare un server grafico vnc (Virtual Network Client).
  • Per installare VNC, potremo lanciare i comando
    aptitude install vnc4server
  • Sarà ora opportuno creare un nuovo utente, per non dover avviare la grafica come root. Useremo:
    adduser <nome utente>

Avvio della grafica

  • Ci verrà richiesta una password ed alcune informazioni sul nuovo utente.
  • Potremo ora fare login in uno dei terminali con il nuovo utente.
  • A questo punto avvieremo e spegneremo il software grafico per poter poi configurare i file opportuni:
    vnc4server
    vnc4server --kill :1
  • Ci verrà chiesta una password di login e noi ne inventeremo una.

Problema della rinumerazione dell'interfaccia di rete

  • Il sistema che siamo per avviare utilizza udev per configurare l'hardware.
  • Per evitare il vecchio problema delle interfacce che cambiano di nome a seconda di come vengono riconosciute, quindi non vengono configurate sempre con gli IP corretti, udev registra gli indirizzi MAC delle schede di rete e li associa in maniera statica ai nomi dei dispositivi,
  • Ne nostro caso questa interessante caratteristica diventa un handicap in quanto l'interfaccia di rete virtuale ha indirizzi MAC casuali che cambiano ogni volta che avviamo la macchina virtuale.

Problema della rinumerazione dell'interfaccia di rete

  • Ad ogni riavvio udev trova una nuova scheda di rete e le assegna un nuovo nome, con l'effetto che la nostra interfaccia non verrà mai configurata.
  • Per risolvere questo problema dovremo eliminare il file che esegue questa ricerca e che registra i nomi. Dovremo usare il comando:
    rm /<directory dove è montata l'immagine>/etc/udev/rules.d/75-persistent-net-generator.rules
  • Finita l'installazione di base e la prima configurazione dovremo smontare il file preparato ed eventualmente eliminare la directory creata con i comandi:
    umount target
    rmdir target

Configurazione e collegamento della grafica

  • Prima di riavviare la grafica dovremo configurare l'ambiente grafico. Dovremo modificare .vnc/xstartup:
    #!/bin/sh 
    ## gnome-session & gnome-wm --sm-client-id default0 & gnome-panel --sm-client-id default1 &
    nautilus --no-default-window --sm-client-id default2 &
    gnome-volume-manager --sm-client-id default4 &
  • Potremo ora lanciare il server, come al solito, con il comando
    vnc4server

Configurazione e collegamento della grafica

  • Ora, da un terminale del nostro Linux (quello reale) potremo digitare:
    xvnc4viewer <ip della macchina virtuale>:1
  • Comparirà il desktop della nostra macchina virtuale. La prima volta il caricamento sarà lento, in quanto devono essere creati tutti i file di configurazione.

Primo avvio della macchina virtuale

  • Siamo pronti per avviare il nostro nuovo sistema e cominciare la configurazione del software installato.
  • Potremmo far partire la macchina virtuale con il comando:
    linux ubd0=root ubd1=vmswap eth0=tuntap,tap0 mem=256M

Primo avvio della macchina virtuale

  • In questo comando:
    • linux indica il kernel di User Mode Linux
    • ubd0=root indica di associare il file root alla partizione /dev/hda1
    • ubd1=vmswap indica di associare il file vmswap alla partizione /dev/hda2
    • eth0=tuntap,tap0 indica che l'interfaccia di rete eth0 sarà associata all'interfaccia virtuale tap0 configurata prima
    • mem=256M indica la quantità di memoria che il nostro kernel vedrà

Primo avvio della macchina virtuale

  • Questo comando avvierà il nostro nuovo Linux. Lo script di avvio creerà le solite 6 console di testo (quelle raggiungibili con i tasti <alt>F1...<alt>F6>), aperte ognuna in un terminale virtuale.

Rifinitura della configurazione della grafica

  • Per ottenere una prima configurazione abbiamo caricato i componenti della sessione direttamente dal file di configurazione.
  • Se, per le volte successive, vogliamo utilizzare il session manager per ricaricare le nostre sessioni, dobbiamo modificare il file fi configurazione .vnc/xstartup come segue:
    #!/bin/sh
    gnome-session &
[any material that should appear in print but not on the slide]