Sinistra <- DaDaBIK - Indice Generale - Copertina - Software libero per il trattamento di problemi scientifici -> Destra

Sistemi Liberi


User-Mode Linux (parte I)

di Stefano Sasso

L'articolo...

In questo primo articolo dedicato a User-Mode Linux vedremo cosa permette di fare questa "tecnologia", compileremo un kernel UML e vedremo come configurare la rete in modo che le varie istanze User-Mode Linux vi possano accedere.
Nei prossimi articoli vedremo come installare alcune distribuzioni GNU/Linux in istanze UML.



Breve introduzione a User-Mode Linux

Cos'è User-Mode Linux?

User-Mode Linux permette di eseguire Linux su se stesso!

Vi starete sicuramente chiedendo come.
In poche parole User-Mode Linux è un kernel Linux che gira sopra ad un altro kernel Linux e solo uno dei due (o più) accede effettivamente all'hardware, mentre gli altri "girano" in user space, esattamente come gli altri programmi. User-Mode Linux (UML per gli amici) non fornisce però un modo per emulare diverse architetture hardware: in parole povere sopra un kernel compilato per architettura Pentium deve per forza "girare" un kernel per Pentium e non uno per Sparc.

Come funziona UML?

Normalmente, il kernel Linux comunica con l'hardware, e i vari programmi in user space comunicano con il kernel.

Processo 1
Processo 2
...
Kernel Linux
Hardware

Il kernel UML, invece di interagire direttamente con l'hardware, comunica con il "vero" kernel (d'ora in poi Kernel Host) come qualsiasi altro programma. I programmi possono essere eseguiti su un kernel UML come se fossero eseguiti su un normale kernel.

 
Processo 2
...
Processo 1
User-Mode Linux
Kernel Linux
Hardware

Dove può essere utilizzato UML?

User-Mode Linux può essere utilizzato, per esempio, per eseguire kernel come utenti non-root, effettuare il debug del kernel come se fosse un normale processo, sperimentare nuovi kernel o patch o eseguire diverse distribuzioni contemporaneamente.

Uno dei vantaggi di UML è il fatto che possiamo provare configurazioni, programmi, distribuzioni su una macchina virtuale senza rischiare di compromettere il nostro sistema host. Inoltre, UML può essere utilizzato per effettuare servizi di virtual hosting in quanto possiamo dare ai nostri clienti/amici un sistema Linux completo e completamente modificabile da parte loro senza rischi per noi.

Compilazione di un kernel UML

La compilazione di un kernel UML è quasi uguale alla compilazione del normale kernel Linux. I passaggi da seguire per la compilazione sono i seguenti (Attenzione! La compilazione non deve essere effettuata su /usr/src/linux):

  1. Scaricare i sorgenti del kernel desiderato da http://www.kernel.org.
  2. Scaricare la patch UML appropriata per il kernel da compilare da http://user-mode-linux.sourceforge.net.
  3. Creare una directory per la compilazione, decomprimere i sorgenti del kernel e applicare la patch UML.

      mkdir /uml
      cd /uml
      tar -xjvf linux-version.tar.bz2
      cd linux-version
      bzcat uml-patch-version.bz2 | patch -p1

  4. È ora possibile procedere alla configurazione del kernel.

      make menuconfig ARCH=um

  5. È possibile configurare il kernel a piacere, ma consiglio di disabilitare il supporto per i moduli in quanto potrebbero creare problemi durante l'installazione di un sistema (devono venire inseriti nell'istanza a installazione effettuata) tenendo abilitato il supporto per il filesystem ext2.
  6. Ora lanciamo la compilazione vera e propria.

      make linux ARCH=um
      strip linux

Ora nella cartella è presente l'eseguibile linux, che è il nostro nuovo kernel UML.

Se avete compilato il kernel con il supporto per i moduli (vi avevo consigliato di non farlo), in seguito all'installazione di un sistema in UML, dopo aver montato il root filesystem usato dall'istanza, dovete lanciare:

make modules ARCH=um
make modules_install ARCH=um INSTALL_MOD_PATH=/mnt/uml_root_filesystem_mount_dir

È necessario inoltre installare sul sistema host le utilità UML, sempre scaricabili da http://user-mode-linux.sourceforge.net.

tar -xjvf uml_utilities-versione.tar.bz2
cd uml_utilities-versione
make && make install

Ad un kernel UML è possibile passare parametri come se fosse un normale kernel.
I parametri da passare per eseguire un'istanza li vedremo nel prossimo articolo; in questa sede vedremo quali sono i parametri da passare al kernel per la gestione dell'input/output dell'utente e dell'istanza UML.

Se lanciamo il kernel senza parametri particolari esso aprirà una finestra xterm per ogni terminale definito in /etc/inittab dell'istanza UML. Invece di usare xterm è possibile collegare console e linee seriali UML a console del sistema host.
I parametri "ssl0=tty:/dev/tty9 con0=tty:/dev/tty10 con1=tty:/dev/tty11 con2=xterm" fanno sì che la prima linea seriale (ssl0) sia collegata alla console 9, che la prima e la seconda console siano collegate rispettivamente alla decima e all'undicesima console e che la terza console UML sia collegata ad una xterm. Per sopprimere le altre console/linee seriali UML è sufficiente aggiungere "ssl=none con=none" alla riga di comando.

Configurazione della rete per User-Mode Linux

Introduzione

In questa parte vedremo una configurazione base della rete per UML prendendo in considerazione solo l'alternativa di rete via TUN/TAP. È necessario quindi aver installato le UML-utilities (prelevabili da http://user-mode-linux.sourceforge.net).

TUN/TAP è un dispositivo di rete virtuale punto-punto che permette di creare tunnel IP a livello kernel. Ovviamente il kernel del sistema host deve aver abilitato il supporto TUN/TAP.

Creazione del device TUN/TAP sulla macchina host

(I comandi devono essere eseguiti come root.)

Per creare il device utilizziamo il comando:

tunctl -u <uid>
chmod 666 /dev/net/tun

dove <uid> è lo user-id dell'utente che potrà accedere al device (in poche parole quello con cui eseguiremo l'istanza/le istanze UML che dovranno avere accesso alla rete).
Il comando darà come output il nome del device creato. Se non sono presenti altri device TUN/TAP il nome sarà tap0 e potrà essere configurato come se fosse una normale interfaccia di rete.

Ora abbiamo due possibilità: configurare il device come bridge o come un normale device di rete dotato di indirizzo IP.

Configurazione del device con indirizzo IP

È sufficiente configurare il device tap0 con ifconfig, come se fosse una normale interfaccia di rete:

ifconfig tap0 192.168.0.1 netmask 255.255.255.0 broadcast 192.168.0.255 up

La scheda di rete "virtuale" dell'istanza UML sarà ora come una scheda connessa ad una rete con gateway 192.168.0.1.

Configurazione del device come bridge

Questa configurazione è da utilizzare nel caso la macchina host sia connessa ad una rete e si voglia che le istanze UML accedano direttamente alla rete a cui è connesso l'host. È necessario un kernel host con supporto per ethernet bridging e i vari strumenti in user space, reperibili su http://bridge.sourceforge.net.

brctl addbr br0
ifconfig eth0 promisc up
ifconfig tap0 promisc up
ifconfig br0 192.168.0.1 netmask 255.255.255.0 broadcast 192.168.0.255 up

L'ultima riga serve per assegnare comunque alla macchina host un indirizzo IP (quello che precedentemente era assegnato alla scheda eth0).

brctl stp br0 off
brctl setfd br0 1
brctl sethello br0 1
brctl addif br0 eth0
brctl addif br0 tap0

Ora le istanze UML potranno accedere direttamente alla rete dell'host.

Parametri nella riga di comando del kernel UML

La configurazione sulla macchina host è conclusa.

Il parametro della riga di comando del kernel UML per l'attivazione della rete è "eth0=tuntap,tap0".

Ora l'istanza UML avrà una scheda di rete "virtuale" chiamata eth0, configurabile come una normale scheda di rete.



L'autore

Stefano Sasso utilizza Linux dal 2000 e si diverte a programmare in Perl, PHP e Python. È anche amministratore del server web del suo liceo, dove frequenta la classe quinta.


Sinistra <- DaDaBIK - Indice Generale - Copertina - Software libero per il trattamento di problemi scientifici -> Destra