Sei sulla pagina 1di 17

User-Mode Linux

User Mode Linux (UML) è tecnologia di virtualizzazione che consente l'esecuzione di un kernel
Linux come processo utente all'interno di un altro sistema Linux. In altre parole, consente di
eseguire un'intera istanza Linux all'interno di un'altra. Questo fornisce un ambiente sicuro, isolato
e flessibile per eseguire e testare nuovi kernel, driver, e applicazioni.
UML offre la capacità di essere visto come un
normale processo per il kernel del sistema
operativo su cui viene eseguito. Allo stesso
tempo, UML si comporta come un kernel per i
processi in esecuzione all'interno dell'ambiente
virtuale, offrendo risorse virtuali come rete,
dischi, CPU, ecc. Questo offre l'isolamento tra
l'ambiente Host e l'ambiente Guest, fornendo un
livello di sicurezza e flessibilità.
Tra gli eseguibili forniti con UML ci sono:
§ linux:
Questo è il kernel UML, si comporta come un normale processo per il sistema operativo Host, e
come un kernel per i processi in esecuzione all'interno dell'ambiente UML.
§ uml_moo, uml_mkcow:
Queste sono utilità per la gestione dei dischi in modalità COW (Copy On Write). Copy On Write
è una strategia di condivisione e duplicazione delle risorse che consente di creare copie dei
dati solo quando è necessario modificarli, risparmiando spazio e migliorando le prestazioni.
§ uml_switch:
Questo è responsabile della gestione della rete virtuale all'interno dell'ambiente UML.
Permette alle istanze virtuali di comunicare tra loro e con il sistema Host.
§ uml_mconsole:
Questo gestisce le macchine virtuali dall'esterno, offrendo una sorta di "console di
amministrazione" per controllare e monitorare lo stato delle istanze UML.
Oltre a questi eseguibili, ci sono vari software e componenti che estendono le funzionalità di UML.
Ad esempio, il Virtual Distributed Ethernet (VDE) è una infrastruttura di networking che fornisce
funzionalità di rete distribuita per le macchine virtuali. VDE consente di creare switch virtuali,
permettendo alle macchine virtuali di comunicare tra loro come se fossero collegate a uno Switch
fisico, e può anche collegare le macchine virtuali alla rete fisica dell'host. Questo offre molta
flessibilità e potenza per la creazione di reti virtuali complesse.

Nota:
Per eseguire UML, è necessario avere un'immagine di un filesystem funzionante (rootfs.ext4),
che è un file organizzato come se fosse un disco fisso. Questo rappresenta il disco del sistema
operativo virtuale.

1
User-Mode Linux
Dopo l'installazione del Kernel UML, per utilizzare più facilmente kernel e rootfs di Marionnet, è
consigliabile creare dei link simbolici del Kernel linux e dell'immagine del file system
rootfs.ext4 in una directory di facile accesso:
$ ln -s /usr/share/marionnet/kernels/linux-par1 linux
$ ln -s /usr/share/marionnet/filesystems/machine-par1 rootfs.ext4

Esecuzione
Quindi Il comando per eseguire il kernel UML (User Mode Linux) dalla directory in cui sono
presenti i link simbolici, sarà il seguente:
$ ./linux [opzioni-Kernel] [opzioni-init]
Dove linux è l'eseguibile del kernel UML e [opzioni] rappresenta una serie di opzioni che
possono essere passate al kernel per controllare il comportamento dell'istanza UML. Queste
opzioni possono essere divise in:
§ [opzioni-Kernel]sono le opzioni che possono essere passate al kernel UML al momento
dell'avvio. Queste possono includere parametri per il filesystem, la rete, la memoria e altre
configurazioni specifiche del kernel.
§ [opzioni-init]sono le opzioni passate al programma init del sistema operativo ospite
UML. Queste opzioni non sono interpretate dal kernel UML stesso, ma vengono passate al
processo di init del sistema operativo ospite UML.

NOTA:
Per spegnere la macchina UML, utilizzare uno dei comandi classici utilizzati per spegnere i sistemi
GNU/Linux, ad esempio halt.
$ halt

ATTENZIONE:
Mai terminare in modo sporco i processi UML chiudendo le finestre di UML.
Dare il comando shutdown (o equivalente) dalla linea di comando del sistema UML.
$ shutdown

2
User-Mode Linux
Configurazione Disco Virtuale
L'opzione ubd<N> viene utilizzata per configurare un Dispositivo a Blocchi (UBD) in un'istanza di
User Mode Linux (UML). Un Dispositivo a Blocchi è un tipo di dispositivo di archiviazione dati che si
interfaccia con un sistema operativo e che manipola i dati in blocchi di dimensioni fisse, piuttosto
che in caratteri individuali o byte. Questo dispositivo UBD è in genere utilizzato per rappresentare
un disco o un filesystem e fungerà essenzialmente da disco virtuale all'interno dell'istanza UML.
Data la seguente sintassi:
$ ./linux ubd<N>=[<cow_file>,]<image_file>
§ ubd<N>
È l'opzione utilizzata per specificare un dispositivo UBD (disco virtuale), <N> è il carattere
alfanumerico che identifica il dispositivo UBD (la numerazione inizia da zero e le lettere vengono
utilizzate come alternativa ai numeri), solitamente ubd0 indica il filesystem di root.
§ <image_file>
È il percorso del file immagine che rappresenta il disco o il filesystem per il dispositivo UBD.
Questo file sarà utilizzato come disco virtuale all'interno dell'istanza UML.
§ <cow_file>
È un file opzionale utilizzato per implementare la funzionalità Copy-On-Write (.cow). Quando
si utilizza un file .cow, tutte le scritture al dispositivo UBD vengono in realtà effettuate sul file
.cow, lasciando il file immagine originale inalterato. Questo può essere utile per preservare lo
stato originale del file immagine o per consentire a più istanze UML di condividere lo stesso file
immagine in modalità di sola lettura.

Nota:
Quando si utilizza l'opzione ubd è obbligatorio specificare almeno un Dispositivo a Blocchi utente
(UBD) che verrà montato ed utilizzato come filesystem di root dell'istanza UML.

Esempio:
Creare l'Host H1 con filesystem di root rootfs.ext4:
$ ./linux ubd0=h1.cow,rootfs.ext4
Tramite l'opzione ubd0 si configurare il primo dispositivo UBD per l'istanza UML, il dispositivo
UBD fungerà da disco virtuale all'interno dell'istanza UML.
Il file immagine rootfs.ext4 rappresenta il filesystem root per l'istanza UML, questo file
immagine fungerà da disco per il dispositivo UBD, e contiene un filesystem che l'istanza UML potrà
montare e utilizzare come se fosse un vero disco fisico.
Il file h1.cow sarà utilizzato per implementare la funzionalità Copy-On-Write, dove tutte le
modifiche apportate al filesystem (tutte le scritture sul dispositivo UBD) verranno effettivamente
salvate nel file .cow, lasciando il file immagine originale (rootfs.ext4) inalterato.

EXTRA - Configurazione del nome dell'Host:


root$ nano /etc/hostname
H1
root$ nano /etc/host
192.168.1.1 H1
root$ reboot
root@H1$

3
User-Mode Linux
Interfacce di Rete
L'opzione eth<N> viene utilizzata per configurare le interfacce di rete, la sua sintassi generale è la
seguente dove, <N> è il carattere alfanumerico che identifica l'Interfaccia di Rete:
$ ./linux eth<N>=<trasporto>,<opzioni del trasporto>,
Esistono due principali tipi di configurazione:
• Daemon
Questa configurazione utilizza il demone UML per creare un'Interfaccia di Rete basata su un
socket di dominio UNIX. Il demone UML fornisce un meccanismo per la gestione delle connessioni
di rete tra diverse istanze UML sulla stessa macchina host. Questo configurazione è utile quando
si ha bisogno di creare una rete di macchine virtuali UML sulla stessa macchina host.
$ ./linux eth<N>=daemon,unix,<socket.ctl>
§ daemon,unix
Indica che l'interfaccia di rete dovrà utilizzare il daemon come meccanismo di trasporto, e
che il tipo di connessione sarà basato su un socket di dominio unix. Un socket di dominio
UNIX è un modo per i processi su una stessa macchina di comunicare tra di loro.
§ <socket.ctl>
Indica il percorso del file del socket di controllo da utilizzare per la connessione di rete.
Ad esempio, se il file del socket di controllo sarà in /tmp/mysocket.ctl, il comando
diventerà: $ ./linux eth0=daemon,unix,/tmp/mysocket.ctl

• VDE (Virtual Distributed Ethernet)


VDE è un sistema di rete virtuale distribuito che può essere utilizzato per connettere diverse
macchine virtuali (non solo UML, ma anche KVM, QEMU e altre) in una rete virtuale.
$ linux eth<N>=vde,<socket-dir>[,[<mac_addr>][,<port_number>]]
§ vde
Indica che l'interfaccia di rete utilizzerà Virtual Distributed Ethernet (VDE) come
meccanismo di trasporto. VDE è un sistema di rete virtuale che può connettere diverse
macchine virtuali in una rete, permettendo loro di comunicare tra loro come se fossero su
una rete fisica.
§ <socket-dir>
Indica il percorso della directory dove si trova il socket VDE, questo rappresenta il punto di
comunicazione per la connessione VDE.
§ <mac_addr>
Parametro opzionale che permette di specificare un indirizzo MAC per l'interfaccia di rete,
se viene fornito, l'interfaccia di rete utilizzerà questo indirizzo MAC.
§ <port_number>
Parametro opzionale che permette di specificare il numero di porta per la connessione
VDE, se viene fornito, la connessione VDE utilizzerà questo numero di porta.

Esempio:
Collegare l'Host H1 alla porta 5 dello switch vde in /tmp/s1:
$ linux ubd0=h1.cow,rootfs.ext eth0=vde,/tmp/s1,,5

4
User-Mode Linux
Altre Opzioni
Le seguenti opzioni sono specifiche per l'avvio di un'istanza del kernel User Mode Linux (UML).
Queste opzioni permettono di configurare vari aspetti dell'istanza UML.
§ -mem=<MB>
Questa opzione consente di specificare la quantità di memoria (in megabyte) che l'istanza UML
dovrebbe utilizzare. Ad esempio, -mem=256 avvierà UML con 256 𝑚𝑒𝑔𝑎𝑏𝑦𝑡𝑒 di memoria.
§ -root=<nome_device>
Questa opzione specifica il dispositivo di blocco da utilizzare come filesystem root per l'istanza
UML. Il filesystem di root è il filesystem su cui è montato il directory tree del sistema
operativo. Ad esempio, -root=/dev/ubda indicherà che il dispositivo /dev/ubda deve
essere utilizzato come filesystem di root.
§ -devfs=mount
DevFS è un filesystem virtuale specifico del kernel Linux che gestisce i file di dispositivo.
L'opzione -devfs=mount indica a UML di montare automaticamente DevFS all'avvio. DevFS
è deprecato nelle versioni più recenti del kernel Linux, sostituito da udev, quindi questa
opzione potrebbe non essere disponibile o necessaria a seconda della versione del kernel UML
che sta utilizzando.
Queste opzioni vanno specificate quando si avvia l'istanza UML, quindi dovrebbero essere incluse
nel comando linux che avvia l'istanza UML. Ad esempio:
$ ./linux -mem=256 -root=/dev/ubda -devfs=mount
Questo comando avvierà un'istanza UML con 256 𝑚𝑒𝑔𝑎𝑏𝑦𝑡𝑒 di memoria, utilizzando
/dev/ubda come filesystem root, e montando automaticamente DevFS.

5
User-Mode Linux
VDE - Virtual Distributed Ethernet
Virtual Distributed Ethernet (VDE) è un sistema di rete virtuale flessibile che può essere utilizzato
per collegare tra loro varie macchine virtuali, tra cui quelle gestite da User Mode Linux (UML).
Il comando vde_switch è un componente chiave di VDE. Questo rappresenta un commutatore
Ethernet virtuale che fornisce i servizi di commutazione tra le diverse interfacce di rete virtuali
connesse ad esso. In pratica, funziona come un Switch di rete fisico, ma a livello software e per le
reti virtuali.
In un contesto UML, vde_switch può essere utilizzato per creare una rete virtuale tra diverse
istanze UML. Ogni istanza UML può essere configurata con un'Interfaccia di Rete che si connette a
un vde_switch, permettendo così alle diverse istanze di comunicare tra loro come se fossero su
una rete fisica.
Per esempio, è possibile avere due istanze UML, ognuna con un'Interfaccia di Rete configurata per
utilizzare VDE e un vde_switch che collega entrambe le Interfacce di Rete. Questo
permetterebbe alle due istanze UML di comunicare tra loro attraverso la rete virtuale.
vde_switch può anche essere utilizzato per connettere una macchina virtuale a una rete fisica,
agendo come un ponte tra la rete virtuale e la rete fisica (internet). Questo può essere utile per
esporre servizi ospitati su una macchina virtuale a client sulla rete fisica.
La sintassi generale per avviare un'istanza dello switch virtuale VDE sul sistema è la seguente:
$ vde_switch -s <socket-dir>

Nota:
Ricorda che vde_switch è solo una parte del sistema VDE, altri componenti di VDE possono
offrire funzionalità aggiuntive, come la possibilità di creare reti virtuali distribuite che si estendono
su più macchine fisiche.

6
User-Mode Linux
VDE - Virtual Distributed Ethernet
Per connettere una macchina virtuale UML (User-Mode Linux) ad uno switch VDE utilizzando lo
stack VDE, bisogna seguire questi passaggi:
• Creazione Switch VDE:
Avviare uno switch virtuale VDE:
$ vde_switch -s /tmp/switch1
§ -s /tmp/switch1
Specifica il percorso del socket di controllo per lo switch VDE. Questo socket viene
utilizzato per la comunicazione tra lo switch VDE e le macchine virtuali o altri switch VDE. In
questo caso /tmp/switch1 è il percorso del socket di controllo.
Nota:
Ricorda che per collegare una macchina virtuale allo switch VDE, dovrai configurare la
macchina virtuale per utilizzare il socket di controllo dello switch. Ad esempio, quando avvii
una macchina virtuale UML, potresti passare un'opzione come eth0=vde,/tmp/switch1
per collegare la prima interfaccia di rete della macchina virtuale allo switch VDE.

• Avvio Macchina UML con VDE


Per avviare una macchina virtuale UML con una configurazione di rete che utilizza lo switch
VDE che appena creato si pssa l'opzione eth<N>=vde,<socket-dir> al comando linux
che avvia UML. Ad esempio:
Avvio con Indirizzo MAC e Numero di Porta automatico:
$ linux ubd0=h1.cow,rootfs.ext4 eth0=vde,/tmp/switch1
Oppure:
Avvio con Indirizzo MAC automatico e Numero di Porta specificato:
$ linux ubd0=h1.cow,rootfs.ext4 eth0=vde,/tmp/switch1,,1
§ ubd0=root_fs
Configura il primo Dispositivo a Blocchi (UBD) della macchina virtuale UML. Il file root_fs
viene utilizzato come immagine del disco per questo dispositivo. In pratica, questo significa
che il sistema UML utilizzerà il file root_fs come disco principale. Il root_fs di solito
contiene l'intero filesystem di root per la macchina virtuale, incluso il sistema operativo e
tutti i suoi file di sistema.
§ eth0=vde,/tmp/switch1,,1
Questa opzione configura la prima interfaccia di rete della macchina virtuale UML. Il
parametro vde specifica che l'interfaccia di rete dovrebbe utilizzare il sistema Virtual
Distributed Ethernet (VDE) per la connettività di rete, connettendosi allo switch VDE che
utilizza il socket di controllo situato in /tmp/switch1. L'ultimo parametro, 1, specifica il
numero di porta dello switch VDE da utilizzare. Se omesso, VDE sceglierà automaticamente
un numero di porta libero.

Continuazione →

7
User-Mode Linux
VDE - Virtual Distributed Ethernet
• Configurazione Macchina UML
È possibile configurare l'interfaccia di rete eth0 all'interno di una macchina virtuale UML con
un indirizzo IP valido per la rete virtuale, in due modi:
Configurazione Temporanea:
$ ifconfig eth0 192.168.0.1 netmask 255.255.255.0 up
Oppure:
Configurazione Permanente:
$ nano /etc/network/interfaces
auto eth0
iface eth0 inet static
address 192.168.0.1
netmask 255.255.255.0

• Verifica della Connessione


Supposto che oltre a quella precedentemente settata ci sia anche un'altra macchina virtuale
UML, connessa allo switch VDE, avente indirizzo IP 192.168.0.2. Per verificare la
connessione tra i due Host collegati tramite uno switch VDE si può utilizzare il comando ping:
$ ping 192.168.0.2 → Comando eseguito sull'host precedentemente impostato

• Altre Opzioni per VDE


§ -hub
Questa opzione fa funzionare lo switch VDE come un hub invece che come uno switch. In
una rete, la differenza principale tra uno switch e un hub è che uno switch invia pacchetti
solo alla porta di destinazione, mentre un hub trasmette i pacchetti a tutte le porte. Di
conseguenza, utilizzare -hub può aumentare la quantità di traffico sulla rete virtuale.
Ad esempio:
$ vde_switch -s /tmp/switch1 -hub
§ -M <path>
Questa opzione consente di specificare un socket per connettersi da un terminale
vdeterm. Un socket di gestione è un tipo speciale di socket che può essere utilizzato per
controllare e monitorare lo switch VDE. Ad esempio:
$ vde_switch -s /tmp/switch1 -M /tmp/switch1.ctl
§ -f <path>
Questa opzione specifica il percorso del file di configurazione per lo switch VDE. Questo file
potrà contenere una serie di comandi di configurazione per lo switch VDE che verranno
eseguiti quando lo switch viene avviato. Può essere utile quando si hanno molte opzioni da
specificare. Ad esempio:
$ vde_switch -s /tmp/switch1 -f /path/to/config/file
§ -d
Questa opzione fa eseguire vde_switch in background come un demone. In questo
modo, vde_switch continuerà a eseguire anche dopo che il terminale o la sessione da
cui è stato avviato è stata chiusa. Ad esempio:
$ vde_switch -s /tmp/switch1 -d
Vedere vde_switch --help per l'elenco completo.

8
User-Mode Linux
TUN/TAP – Network TUNel/TAP
TUN/TAP (network TUNnel/TAP) è un dispositivo di rete virtuale che viene spesso utilizzato nelle
macchine virtuali UML per consentire la comunicazione di rete tra la macchina UML e il sistema
Host o altre macchine. TUN e TAP sono due diversi tipi di dispositivi, ma entrambi sono utilizzati
per abilitare la comunicazione di rete.
§ TUN: Il dispositivo TUN (network TUNnel) è utilizzato per la comunicazione di rete a livello IP.
Consente alle applicazioni di inviare e ricevere pacchetti IP come se fossero presenti su una
rete fisica separata. I pacchetti inviati attraverso un dispositivo TUN vengono instradati nel
kernel del sistema host o del sistema guest, consentendo la comunicazione di rete tra i due.
§ TAP: Il dispositivo TAP (network TAP) è utilizzato per la comunicazione di rete a livello
Ethernet. Consente alle applicazioni di inviare e ricevere frame Ethernet come se fossero
collegati a un'interfaccia Ethernet fisica. I pacchetti inviati attraverso un dispositivo TAP
vengono indirizzati al kernel del sistema host o del sistema guest, permettendo la
comunicazione di rete tra i due.
Nel contesto di UML, il dispositivo TUN/TAP viene utilizzato per consentire alla macchina UML di
comunicare con il sistema host o con altre macchine tramite una connessione di rete virtuale. Ad
esempio, tramite un dispositivo TUN/TAP, la macchina UML può inviare e ricevere pacchetti IP o
frame Ethernet come se fossero presenti su una rete fisica separata.
La configurazione di un dispositivo TUN/TAP su UML coinvolge la creazione di un dispositivo TUN o
TAP sul sistema host, quindi collegando tale dispositivo all'interfaccia di rete virtuale dell'UML. In
questo modo, i pacchetti inviati dall'UML saranno instradati nel kernel del sistema host per la
trasmissione verso la rete fisica o altre destinazioni di rete, e viceversa.

Esempio:
Configura una macchina UML con interfaccia di rete eth0 utilizzando TUN/TAP.
$ ./linux ubd0=h1.cow,rootfs.ext4 eth0=tuntap

9
User-Mode Linux
Data Dump
Il comando Data Dump (dd) è un comando utilizzato per la copia e la conversione di dati in
ambienti Unix/Linux. Esso viene utilizzato per leggere dati da un origine (input) e scriverli su una
destinazione (output) secondo una serie di specifiche configurabili, la sintassi di base del comando
è la seguente:
$ dd if=<input-file> of=<output-file> bs=<blck-size> count=<blocks-number>\
seek=<offset-size>
§ if=<input-file>
Specifica il file di input da cui leggere i dati, può essere il nome di un file o di un percorso completo.
§ of=<output-file>
Specifica il file di output in cui scrivere i dati, può essere il nome di un file o di un percorso completo.
§ bs=<block-size>
Specifica la dimensione dei blocchi di input/output, può essere specificato utilizzando un unità
di misura come Byte (B), Kilobyte (K), Megabyte (M), ecc.
§ count=<blocks-number>
Specifica il numero totale di blocchi da leggere o scrivere.
§ seek=<offset-size>
Specifica l'offset di posizionamento all'interno del file di output, indicando quante unità di
blocco saltare prima di iniziare la scrittura.

Nota:
È importante utilizzare il comando dd con cautela poiché non fornisce meccanismi di sicurezza o
conferma di sovrascrittura dei dati esistenti. Un uso errato potrebbe causare la perdita dei dati.
Pertanto, è sempre consigliabile fare attenzione nella specifica delle opzioni e verificare
attentamente il comando prima di eseguirlo.

Esempio:
Copiare un file di input chiamato input.txt in un nuovo file di output chiamato output.txt
a partire dal 5° blocco del file di output, utilizzando blocchi di dimensione 512 𝑏𝑦𝑡𝑒.
$ dd if=input.txt of=output.txt bs=512 count=10 seek=5
Il comando dd leggerà 10 blocchi da input.txt e scriverà i dati in output.txt, iniziando dal
5° blocco. I blocchi avranno dimensione 512 byte ciascuno, nello specifico:
§ if=input.txt
Indica che il file di input è input.txt
§ of=output.txt
Indica che il file di output sarà output.txt
§ bs=512
Indica che il blocco di input/output avrà dimensione 512 𝑏𝑦𝑡𝑒
§ count=10
Indica che verranno copiati 10 blocchi
§ seek=5
Indica di saltare i primi 5 blocchi nel file di output prima di iniziare a scriverci

10
User-Mode Linux
Make EXT4 Filesystem
Il comando Make EXT4 Filesystem (mkfs.ext4) è un comando utilizzato per creare un filesystem
di tipo ext4 su un dispositivo di archiviazione, come un disco rigido/file immagine o una partizione,
in ambienti Linux, la sintassi generale del comando mkfs.ext4 è la seguente:
$ mkfs.ext4 [opzioni] <dispositivo>
Il parametro principale del comando è il dispositivo su cui verrà creato il filesystem, questo può
essere un disco rigido, una partizione o un dispositivo virtuale come /dev/sda1.
Di seguito sono fornite alcune delle opzioni più comunemente utilizzate:
§ -L <etichetta>
Specifica un'etichetta per il filesystem, l'etichetta è un nome descrittivo che può essere
utilizzato per identificare in modo univoco il filesystem.
§ -m <percentuale>
Specifica la percentuale di spazio riservato per l'uso del superutente (root).
§ -b <dimensione-blocco>
Specifica la dimensione del blocco del filesystem.
§ -O <opzioni>
Abilita specifiche opzioni del filesystem ext4.
§ -E <opzioni>
Abilita specifiche opzioni avanzate del filesystem ext4.

Nota:
La creazione di un filesystem è un'operazione che modifica in modo permanente il dispositivo
selezionato. Pertanto, è necessario fare attenzione nel selezionare il dispositivo corretto per
evitare la perdita accidentale dei dati.

Esempio:
Creare un filesystem ext4 su una partizione /dev/sda1.
$ mkfs.ext4 /dev/sda1
Il comando precedente comando formatta la partizione /dev/sda1 come un filesystem ext4
valido, sovrascrivendo tutti i dati precedenti presenti nella partizione.

11
User-Mode Linux
Collegare due Dischi ad una Macchina UML
Creare un nodo con due dischi virtuali:
1. Il primo disco è l'immagine rootfs.ext4, contenente un filesystem
filesystem ext4, montato come root filesystem
2. Il secondo disco è un'immagine di un filesystem ext4 vuoto, da creare
appositamente e da montare in /mnt/mydisk

Soluzione:
0. Creiamo la seconda immagine disco con un filesystem ext4 vuoto:
• Usiamo il comando dd per creare l'immagine disco:
$ dd if=/dev/zero of=myfs.ext4 bs=1 count=1 seek=300M
1+0 records in
1+0 records out
1 byte copied, 0,000677358 s, 1,5 kB/s
§ if=/dev/zero
Utilizziamo il file speciale /dev/zero come sorgente dei dati, questo file produce una
sequenza infinita di zeri
§ of=myfs.ext4
Crea un nuovo file di immagine chiamato myfs.ext4 come destinazione
§ bs=1
Utilizza un blocco di dimensione 1 𝑏𝑦𝑡𝑒
§ count=1
Legge e scrive solo 1 𝑏𝑙𝑜𝑐𝑐𝑜
§ seek=300M
Posiziona l'operazione di scrittura all'offset di 300 𝑚𝑒𝑔𝑎𝑏𝑦𝑡𝑒 all'interno del file di output
In sostanza, il comando crea un file con una dimensione approssimativa di 300 𝑚𝑒𝑔𝑎𝑏𝑦𝑡𝑒,
ma contiene solo 1 𝑏𝑦𝑡𝑒 effettivo che contiene zero. Tutti gli altri byte nel file saranno
impostati su zero in quanto il file speciale /dev/zero produce una sequenza infinita di
zeri come sorgente dei dati.
• Formattiamo l'immagine disco con un filesystem ext4:
$ mkfs.ext4 myfs.ext4
mke2fs 1.45.5 (07-Jan-2020)
Discarding device blocks: done
Creating filesystem with 76800 4k blocks and 76800 inodes
Filesystem UUID: 00ad1454-858d-456f-a831-1c51b0f83eac
Superblock backups stored on blocks:
32768

Allocating group tables: done


Writing inode tables: done
Creating journal (4096 blocks): done
Writing superblocks and filesystem accounting information: done

Continuazione →

12
User-Mode Linux
Collegare due Dischi ad una Macchina UML
1. Creiamo la Macchina UML con i due dischi:
$ ./linux ubd0=root1.cow,rootfs.ext4 ubd1=usr1.cow,myfs.ext4
Questo comando lancia una macchina virtuale Linux e imposta due dischi virtuali.
§ ubd0=root1.cow,rootfs.ext4
Configura il primo dispositivo UBD (ubd0), dove root1.cow rappresenta il file delle
modifiche (Copy-On-Write) associato al disco virtuale di root, mentre rootfs.ext4
rappresenta il file immagine principale del filesystem di root. Questo dispositivo ubd0
viene utilizzato per montare e gestire il filesystem di root all'interno dell'istanza di UML.
§ ubd1=usr1.cow,myfs.ext4
Configura il secondo dispositivo UBD (ubd1), dove usr1.cow rappresenta il file di
modifiche associato al disco virtuale della directory /usr, mentre myfs.ext4
rappresenta il file immagine principale del filesystem della directory /usr. Questo
dispositivo ubd1 viene utilizzato per montare e gestire il filesystem della directory /usr
all'interno dell'istanza di UML.

2. Controlliamo la creazione dei due dischi e identifichiamo il loro path nella directory /dev:
uml$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
ubda 98:0 0 1.5G 0 disk /
ubdb 98:16 0 300M 0 disk
uml$ blkid
/dev/ubda: UUID="ed0cc056-705f-45e7-8dd4-2069584becae" TYPE="ext4"
/dev/ubdb: UUID="00ad1454-858d-456f-a831-1c51b0f83eac" TYPE="ext4"

3. Montiamo i due dischi:


uml$ mount /dev/ubda /
uml$ mkdir /mnt/mydisk
uml$ mount /dev/ubdb /mnt/mydisk

4. Controlliamo se i due dischi sono stati montati correttamente:


uml$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
ubda 98:0 0 1.5G 0 disk /
ubdb 98:16 0 300M 0 disk /mnt/mydisk

5. Modifichiamo il file /etc/fstab che contiene le informazioni di montaggio dei filesystem


nel sistema Linux per fare in modo che i dischi vengono montati automatica all'avvio:
uml$ nano /etc/fstab
none /mnt/hostfs hostfs defaults 0 0
/dev/ubda / ext4 defaults 0 0
/dev/ubdb /mnt/mydisk ext4 defaults 0 0
1 Colonna: Path del dispositivo
2 Colonna: Mount-point tramite il quale sarà possibile accedere al contenuto
3 Colonna: Tipo di filesystem del dispositivo
4 Colonna: Opzioni di montaggio per il filesystem
5 Colonna: Backup del filesystem (0 non attivo, 1 attivo)
6 Colonna: Controllo del filesystem tramite il fsck (0 non attivo, da 1 in poi attivo nell’ordine indicato)

13
User-Mode Linux
Rete con 2 UML e Switch VDE
Collegare in rete due nodi tramite uno switch:
§ Eseguire correttamente lo Switch VDE e le due
macchine UML
§ Verificare il collegamento

Soluzione:
Creata una directory con all'interno il kernel UML (file eseguibile linux) e il filesystem rootfs.ext4.
$ ln -s /usr/share/marionnet/kernels/linux-par1 linux
$ ln -s /usr/share/marionnet/filesystems/machine-par1 rootfs.ext4
Aprire 3 terminali (Terminal Emulator) separati, uno per ogni dispositivo, S1, H1 e H2.

S1 Terminal
• Creiamo uno Switch VDE
s1$ vde_switch -s s1 -M $(pwd)/s1_term -d
§ -s s1
Specifica il nome dello switch virtuale come s1, questo sarà il nome con cui lo switch verrà
identificato nella rete.
§ -M $(pwd)/s1_term
Specifica il percorso del terminale dello switch virtuale S1, questo è il percorso in cui
verranno salvati i dati relativi alla sessione dello switch, come i log e le informazioni sullo
stato. L'espressione $(pwd) viene utilizzata per ottenere il percorso completo della
directory di lavoro corrente e inserirlo come parte del percorso del terminale dello switch
virtuale S1.
§ -d
Avvia il processo dello switch in modalità daemon, in modo che esegua in background.

• Avviamo lo Switch VDE:


s1$ vdeterm ./s1_term
s1_term$
Avviamo un terminale virtuale per interagire con lo switch virtuale VDE tramite il file di
terminale specificato, in questo caso s1_term creato dall'esecuzione del comando
precedente.

Continuazione →

14
User-Mode Linux
Rete con 2 UML e Switch VDE
H1 & H2 Terminal
Creiamo le due macchine UML entrambe agganciate allo Switch VDE S1:
h1$ ./linux ubd0=h1.cow,rootfs.ext4 eth0=vde,s1 user=filippo
filippo$
h2$ ./linux ubd0=h2.cow,rootfs.ext4 eth0=vde,s1 user=luca
luca$
§ ubd0=hX.cow,rootfs.ext4
Configura il dispositivo ubd0 dove hX.cow rappresenta il file di differenze (Copy-On-Write)
associato al disco virtuale dell'istanza di UML, mentre rootfs.ext4 rappresenta il file
immagine principale del filesystem di root. Questo dispositivo ubd0 viene utilizzato per
montare e gestire il filesystem di root all'interno dell'istanza di UML.
§ eth0=vde,s1
Configura l'interfaccia di rete virtuale eth0 dove l'opzione vde indica che l'interfaccia di rete
utilizzerà il driver VDE per la connettività virtuale, mentre s1 rappresenta il nome dello switch
virtuale a cui è collegata l'interfaccia. Ciò consente all'istanza UML di comunicare con altri
dispositivi collegati allo switch virtuale S1.
§ user=X
Specifica l'utente con cui eseguire l'istanza di UML.

S1 Terminal
Controllare l'avvenuto collegamento delle due macchine UML allo Switch S1:
s1_term$ port/print
Port 0001 untagged_vlan=0000 ACTIVE - Unnamed Allocatable
Current User: user Access Control: (User: NONE - Group: NONE)
IN: pkts 8 bytes 648
OUT: pkts 8 bytes 648
-- endpoint ID 0007 module unix prog : UML vde_transport user=?? PID=9701
Port 0002 untagged_vlan=0000 ACTIVE - Unnamed Allocatable
Current User: user Access Control: (User: NONE - Group: NONE)
IN: pkts 8 bytes 648
OUT: pkts 8 bytes 648
-- endpoint ID 0009 module unix prog : UML vde_transport user=?? PID=11548
Success

Continuazione →

15
User-Mode Linux
Rete con 2 UML e Switch VDE
Test Connettività senza Interfacce di Rete Configurate
Effettuiamo un test della connettività, si propone di seguito un test di connettività "minimal", che
non richiede la configurazione delle interfacce di rete delle due macchine UML:
H1 Terminal
filippo$ ifconfig eth0 up
filippo$ arping -0 -B -i eth0

Il comando arping invia un pacchetto ARP (Address Resolution Protocol) sulla rete tramite
l'interfaccia eth0 dell'host H1. Questo può essere utilizzato per ottenere la risoluzione degli
indirizzi MAC degli host presenti sulla stessa rete di H1. Nello specifico:
§ -0
Specifica che l'arping deve inviare un solo pacchetto ARP e terminare.
§ -B
Abilita la modalità "broadcast" per inviare il pacchetto ARP a tutti gli host sulla rete invece di
un host specifico.
§ -i eth0
Specifica l'interfaccia di rete sulla quale inviare il pacchetto ARP.

H2 Terminal
luca$ ifconfig eth0 up
luca$ tcpdump -n -i eth0

Il comando tcpdump cattura i pacchetti di rete in arrivo e in uscita sull'interfaccia di rete eth0
dell'host H2. Nello specifico:
§ -n
Disabilita la risoluzione dei nomi dei host e delle porte, questo evita che tcpdump effettui la
traduzione degli indirizzi IP e delle porte in nomi leggibili.
§ -i eth0
Specifica l'interfaccia di rete dalla quale acquisire i pacchetti.

16
User-Mode Linux
Configurazione di una rete con UML e Switch VDE
Test Connettività con Interfacce di Rete Configurate:
H1 & H2 Terminal
Configuriamo le interfacce di rete delle due macchine UML:
filippo$ nano /etc/network/interfaces
auto eth0
iface eth0 inet static
address 192.168.1.1
filippo$ ifconfig eth0 up
luca$ nano /etc/network/interfaces
auto eth0
iface eth0 inet static
address 192.168.1.2
luca$ ifconfig eth0 up

H1 & H2 Terminal
Eseguiamo il comado ping per scambiare pacchetti tra le due macchine UML:
filippo$ ping 192.168.1.2

luca$ ping 192.168.1.1

17

Potrebbero piacerti anche