<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://vsd.v2.cs.unibo.it/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Leonardo</id>
	<title>vsd - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://vsd.v2.cs.unibo.it/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Leonardo"/>
	<link rel="alternate" type="text/html" href="https://vsd.v2.cs.unibo.it/wiki/index.php/Special:Contributions/Leonardo"/>
	<updated>2026-05-26T10:01:58Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.35.5</generator>
	<entry>
		<id>https://vsd.v2.cs.unibo.it/wiki/index.php?title=2018_Spring_Term&amp;diff=86</id>
		<title>2018 Spring Term</title>
		<link rel="alternate" type="text/html" href="https://vsd.v2.cs.unibo.it/wiki/index.php?title=2018_Spring_Term&amp;diff=86"/>
		<updated>2018-04-05T14:42:20Z</updated>

		<summary type="html">&lt;p&gt;Leonardo: /* April 05 2018 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== February 27 2018 ==&lt;br /&gt;
&lt;br /&gt;
===Virtualità===&lt;br /&gt;
&lt;br /&gt;
Virtualizzare qualcosa significa fornire un oggetto che possa essere usato (stessa interfaccia) efficacemente al posto dell'altro.&lt;br /&gt;
Se si usa una scarpa per piantare un chiodo, la scarpa è un &amp;quot;martello virtuale&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
====Memoria virtuale====&lt;br /&gt;
*Interfaccia della memoria principale: load(indirizzo), store(indirizzo, oggetto).&lt;br /&gt;
*Semantica: se eseguo store(i, a) seguito da load(i), la seconda operazione ritornerà a.&lt;br /&gt;
La memoria secondaria può essere usata per implementare l'interfaccia di quella primaria.&lt;br /&gt;
Anche l'hardware di un calcolatore può essere visto come un'entità astratta che parla il linguaggio ISA del processore di cui fa uso.&lt;br /&gt;
Se virtualizziamo l'hardware tramite un programma che ne implementa la stessa interfaccia otteniamo una macchina virtuale.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Possibilità di virtualizzare il tempo.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Significato di '''virtualsquare'''&lt;br /&gt;
&lt;br /&gt;
Una piazza dove i vari tipi di virtualià coesistono, un laboratorio internazionale sulla virtualità.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Concetto di VIEW====&lt;br /&gt;
&lt;br /&gt;
I processi &amp;quot;vedono&amp;quot; l'ambiente di esecuzione. Se non stanno eseguendo istruzioni di calcolo, i processi si interfacciano (&amp;quot;vedono&amp;quot;) al sistema (accedono a memoria, fanno routing) usando system calls.&lt;br /&gt;
ogni processo può vedere un file diverso allo stesso path name&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;umview&amp;lt;/u&amp;gt; vecchia macchina parziale virtuale&lt;br /&gt;
&lt;br /&gt;
L''''Hypervisor''' agisce parzialmente come un debugger: intercetta le system calls ed intraprende azioni.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Virtual Distributed Ethernet (VDE)====&lt;br /&gt;
&lt;br /&gt;
VDE è una rete Ethernet virtuale che può essere distribuita su diverse macchine fisiche presenti in rete.&lt;br /&gt;
Usare concetti reali nello &amp;quot;Standard&amp;quot; ethernet e vitualizzarli. ad esmpio uno switch con il vitual switch, più avanti nelle versioni sono stati creati dei &amp;quot;tasselli&amp;quot; che si posso interfacciare con vari altri tasselli per formare una rete virtuale personalizzata&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Tip: &amp;quot;Trovate il nome giusto da dare a tutte le cose che pensate&amp;quot;&lt;br /&gt;
&lt;br /&gt;
PeDaNTe S.P.A. (Physical, Data link, Network, Transport, Session, Presentation, Application)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Internet of Threads====&lt;br /&gt;
&lt;br /&gt;
Dare un indirizzo IP non alla macchina, ma direttamente al processo, questo ti pemette di migrare i processi da una macchina ad un'altra senza che il client deve riconfigurare l'IP della chiamata a quel processo (IPV6 è praticamente obbligatorio per rendere Internet of Threads utillizzabile, perchè IPV4 ha troppi pochi indirizzi)&lt;br /&gt;
Se abbiamo due web servers virtuali sulla stessa macchina fisica vogliamo che abbiano comunque diversi indirizzi ip.&lt;br /&gt;
&lt;br /&gt;
== March 01 2018 ==&lt;br /&gt;
&lt;br /&gt;
===INFO===&lt;br /&gt;
Le comunicazioni e lo scambio di idee avverranno nel gruppo Telegram.&lt;br /&gt;
&lt;br /&gt;
Per iscriversi/scrivere nel wiki occorre il [http://so.v2.cs.unibo.it/wiki/index.php?title=Qui numero magico] usato già per il corso di Sistemi Operativi.&lt;br /&gt;
&lt;br /&gt;
Vecchio materiale [http://www.cs.unibo.it/~renzo/vsd/ Virtual System Design]&lt;br /&gt;
&lt;br /&gt;
Altre risorse su [https://github.com/rd235 GitHub]&lt;br /&gt;
&lt;br /&gt;
Nickname del docente&lt;br /&gt;
* rd235 (derivato dai documenti RFC es. [https://tools.ietf.org/html/rfc1166 RFC 1166])&lt;br /&gt;
* iz4dje&lt;br /&gt;
&lt;br /&gt;
===Tipi di virtualizzazione===&lt;br /&gt;
[https://www.finnix.org/ finnix] è un sistema operativo live da usare &amp;quot;quando si è nei guai&amp;quot;, non ha interfaccia grafica e permette di provare i sistemi virtuali; la versione 1.0 è quella che funziona bene.&lt;br /&gt;
&lt;br /&gt;
Il sistema operativo in cui viene eseguita la macchina virtuale, viene detto '''host''' (ospitante) mentre la macchina virtuale è chiamata '''guest''' (ospite).&lt;br /&gt;
&lt;br /&gt;
====Emulazione====&lt;br /&gt;
Scrivendo un emulatore di una macchina emulo i passi di esecuzione dell'hardware: convertire le istruzioni dal linguaggio del processore che vuole essere emulato ad istruzioni per la macchina host.&lt;br /&gt;
&lt;br /&gt;
'''QEMU''' è un esempio: traduce il codice macchina guest in codice macchina host (traduzione dinamica). QEMU contiene i sorgenti con le istruzioni del vari assembler (sottoforma di funzioni) che vengono messi in un vettore; fa uso di cache come fanno i browser: il codice non viene tradotto di continuo ma viene eseguito quello &amp;quot;in cache&amp;quot; e questo lo fa risultare 15/20 volte più veloce.&lt;br /&gt;
&lt;br /&gt;
('''NOTA:''' rimane in sospeso '''slirp''', lo vedremo nel dettaglio in futuro)&lt;br /&gt;
&lt;br /&gt;
'''Busybox''' è un piccolo eseguibile che combina diverse applicazioni standard Unix, in pratica le utility Unix non sono altro che un alias di busybox; si può scaricare e compilare i binari di busybox per ''mips'' (arm), se attivo il servizio ''binfmt-support'' il sistema utilizzerà QEMU per eseguire i binari mips, mentre disattivando il servizio sarà possibile utilizzare '''KVM'''.&lt;br /&gt;
&lt;br /&gt;
=====Esempi di emulazione=====&lt;br /&gt;
''qemu-system-''* (wildcard) è il comando per lanciare un'architettura:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
qemu-system-x86_64 -cdrom finnix-110.iso -m 512M&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
dove ''-m 512M'' è la quantità di ram che gli rendiamo disponibile.&lt;br /&gt;
&lt;br /&gt;
Con QEMU possiamo eseguire ''finnix-armhf-111.iso'' su macchina x86_64 seguendo le [https://www.finnix.org/ARM istruzioni], per avere successo bisogna montare l'immagine iso ed estrarre il contenuto (''initrd.xz'', ''linux'' e ''vexpress-v2p-ca9.dtb'') della directory ''/boot/armhf/'' nella cartella da cui si lancia QEMU.&lt;br /&gt;
&lt;br /&gt;
====Virtualizzazione parziale====&lt;br /&gt;
&lt;br /&gt;
'''KVM''', acronimo di Kernel-based Virtual Machine (utilizza VT per Intel e AMD-V per AMD), ha un comportamento a &amp;quot;trigger&amp;quot; il processore si comporta come la routine normale, soltanto quando vengono lanciate determinate call viene cambiata la routine da quella nativa a quella apposita per simulare altri processori. Questo permette di avere macchine virtuali molto più veloci, visto che girano direttamente sul processore escluse le varie eccezione rende una correlazione praticamente 1 a 1.&lt;br /&gt;
&lt;br /&gt;
Si può abilitare la modalità KVM in QEMU usando l'opzione ''-enable-kvm'' che ovviamente richiede che i moduli siano stati caricati.&lt;br /&gt;
&lt;br /&gt;
====Virtualizzazione totale====&lt;br /&gt;
&lt;br /&gt;
'''VirtualBox''' è un esempio di virtualizzazione totale.&lt;br /&gt;
&lt;br /&gt;
'''User-Mode Linux''' è una macchina virtuale i cui sorgenti sono presenti nel kernel linux; usa lo stesso supporto del comando '''strace''' (utile per vedere le system call di un comando); User-Mode Linux è molto vicino a '''umview''' (che appunto sta per '''User-Mode View'''); in quanto a velocità sta in mezzo tra qemu e kvm.&lt;br /&gt;
&lt;br /&gt;
=====Differenze=====&lt;br /&gt;
&lt;br /&gt;
QEMU virtualizzazione a livello di processo ('''PVM'''), KVM a livello di sistema ('''SVM'''), VirtualBox a livello di system call ('''SCVM'''). Vedere [http://www.cs.unibo.it/~renzo/so/lucidi/so-03-struttura-os-1p.pdf#page=36 pag. 36] e a seguire.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
qemu-system-* é formato dal processore di traduzioni dinamiche qemu_(arm, mips...) e dalle periferiche.&lt;br /&gt;
&lt;br /&gt;
kvm invece non fa uso di qemu ma al posto suo usa l'accellerazione del processore (oltre alle periferiche).&lt;br /&gt;
&lt;br /&gt;
qemu funziona come processo utente e non ha bisogno di permessi eccezionali;&lt;br /&gt;
kvm invece risulta vincolato al processore (egrep '^flags.*(vmx|svm)' /proc/cpuinfo) e occorre anche il modulo kernel (lsmod | grep kvm).&lt;br /&gt;
&lt;br /&gt;
VirtualBox non può convivere con KVM.&lt;br /&gt;
&lt;br /&gt;
===Macchine virtuali in rete===&lt;br /&gt;
&lt;br /&gt;
È possibile creare una propria macchina virtuale online usando le credenziali unibo [https://okeanos.grnet.gr/home/ okeanos grnet]&lt;br /&gt;
&lt;br /&gt;
Tip: '''molly-guard''' protects machines from accidental shutdowns/reboots (via ssh); è un software che se si tenta un reboot/poweroff chiede di digitare il nome della macchina, in questo modo si evita di spegnere una macchina virtuale non voluta tra le varie finestre aperte.&lt;br /&gt;
&lt;br /&gt;
== March 06 2018 ==&lt;br /&gt;
&lt;br /&gt;
[https://liveunibo-my.sharepoint.com/:u:/g/personal/francesco_fornari2_studio_unibo_it/EcBK9t59dgVEjB6Y-Lx2tAEBaQ2THtSBZZk9W7p9j5cVSQ?e=tHE25e Registrazione 06/03/2018]&lt;br /&gt;
&lt;br /&gt;
===I requisiti di virtualizzazione===&lt;br /&gt;
&lt;br /&gt;
[https://en.wikipedia.org/wiki/Popek_and_Goldberg_virtualization_requirements I requisiti di virtualizzazione di Popek e Goldberg] sono delle condizioni sufficienti per un'architettura per supportare la virtualizzazione (in modo efficiente):&lt;br /&gt;
&lt;br /&gt;
* '''Equivalenza / Fedeltà''' - Un programma virtualizzato dovrebbe esibire un comportamento essenzialmente identico a quello dimostrato quando viene eseguito su una macchina equivalente direttamente.&lt;br /&gt;
&lt;br /&gt;
* '''Controllo delle risorse / Sicurezza''' - L'hypervisor deve avere il completo controllo delle risorse virtualizzate.&lt;br /&gt;
&lt;br /&gt;
* '''Efficienza / Performance'''&lt;br /&gt;
&lt;br /&gt;
Davoli: &amp;quot;Il livello di sicurezza richiesto dipende dall'applicazione&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Popek e Goldberg descrivono anche le caratteristiche che l'ISA della macchina ospite deve possedere per essere in grado di far girare un hypervisor che goda dei tre requisiti precedenti.&lt;br /&gt;
&lt;br /&gt;
===Teoremi di virtualizzazione===&lt;br /&gt;
&lt;br /&gt;
Le istruzioni di un'ISA sono classificate in tre gruppi:&lt;br /&gt;
# '''Istruzioni privilegiate''' - le istruzioni che generano una trap se il processore è in '''user mode''' e non generano una trap se il processore è in '''kernel mode''' (e.g. divisione per zero, system call, accesso ad indirizzo di memoria non mappato).&lt;br /&gt;
# '''Istruzioni control sensitive''' - le istruzioni che cercano di cambiare la configurazione delle risorse del sistema (e.g. assegnare memoria, acquisire una risorsa).&lt;br /&gt;
# '''Istruzioni behavior sensitive''' - istruzioni che hanno comportamenti diversi a seconda della configurazione delle risorse (e.g. istruzioni che dipendono dal valore del registro di rilocazione o dalla modalità di esecuzione del processore).&lt;br /&gt;
&lt;br /&gt;
====Teorema relativo alle istruzioni privilegiate====&lt;br /&gt;
Si può creare una VM effettiva se e solo se le istruzioni privilegiate sono un sovrainsieme dell'unione delle istruzioni degli altri due tipi; in altre parole tutte le istruzioni &amp;quot;sensitive&amp;quot; generano una trap se eseguite in user mode.&lt;br /&gt;
&amp;lt;br&amp;gt;Le istruzioni '''sensitive''' sono quelle che possono influenzare il corretto funzionamento dell'hypervisor. Queste istruzioni devono essere tutte privilegiate.&lt;br /&gt;
&amp;lt;br&amp;gt;Le istruzioni '''control sensitive''' devono essere privilegiate perché il processo virtualizzato non deve essere in grado di allocare nuove risorse a sè stesso.&lt;br /&gt;
&amp;lt;br&amp;gt;Le istruzioni '''behavior sensitive''' devono essere privilegiate perché il processo virtualizzato deve vedere ...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
(IBM Introduce le maccine virtuali per introdurre sistemi operativi multitasking su macchine monotask)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;Negli anni 90 si producono processori senza considerare il teorema di Popek e Goldberg. L'ISA di questi processori non soddisfaceva le condizioni del teorema.&lt;br /&gt;
Vengono aggiunte istruzioni di virtualizzazione (da usare in ambienti virtuali) che non sono altro che le corrispettive istruzioni privilegiate delle istruzioni sensitive non privilegiate.&lt;br /&gt;
&lt;br /&gt;
(''Robert P. Goldberg: Architectural Principles for Virtual Computer Systems'')&lt;br /&gt;
&lt;br /&gt;
È difficile fare virtualizzazione tramite l'emulazione (problemi di efficienza).&lt;br /&gt;
&lt;br /&gt;
L''''emulazione''' consiste nell'emulare ogni singola funzione del sistema operativo e lo traduce per il livello sottostante.&lt;br /&gt;
&amp;lt;br&amp;gt;La '''simulazione''' consiste nel convertire il codice assembler per un certo processore in codice macchina del processore di base.&lt;br /&gt;
&amp;lt;br&amp;gt;Simulatore: apparenza (Simulatore di volo)&lt;br /&gt;
&amp;lt;br&amp;gt;Emulatore: funzione effettiva e veritiera al 100% ma per questa molto più lenta (Ali di cera del racconto greco)&lt;br /&gt;
&lt;br /&gt;
Qemu può funzionare in due modalità:&lt;br /&gt;
* Macchina virtuale: virtualità al livello di sistema (qemu-system-*).&lt;br /&gt;
* Virtualizzare solo il processore: tutte le system call sono gestite dal sistema operativo reale (qemu-*).&lt;br /&gt;
&lt;br /&gt;
Esperimento: Prendere busybox per architettura arm ed eseguirlo anche se siamo su un intel&lt;br /&gt;
&amp;lt;br&amp;gt;Busybox: eseguibile che fa da contenitore per molti comandi. Permette di risparmiare RAM e disco.&lt;br /&gt;
&amp;lt;br&amp;gt;Sistemi embedded: spesso fatti con kernel + busybox + applicazione per cui è nato il sistema.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[https://www.finnix.org/ARM Finnix arm]&lt;br /&gt;
Per far partire Finnix su Arm occorre prendere dall'immagine del file system dei file che servono all'esterno.&lt;br /&gt;
Per far partire un sistema occorre sicuramente il kernel e poi in molti casi (non tutti) il file system.&lt;br /&gt;
Il kernel viene caricato dal boot loader.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
qemu-system-arm -display none -machine vexpress-a9 -m 256 \&lt;br /&gt;
-kernel linux -initrd initrd.xz -dtb vexpress-v2p-ca9.dtb \&lt;br /&gt;
-append &amp;quot;console=ttyAMA0,115200&amp;quot; -serial stdio \&lt;br /&gt;
-drive file=finnix-armhf.iso,id=cd0,format=raw \&lt;br /&gt;
-device virtio-blk-device,drive=cd0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
kernel linux --&amp;gt; cerca nella directory corrente un file &amp;quot;linux&amp;quot; contenente il kernel&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''initrd''' è un file di configurazione che contiene i moduli kernel usato per l'inizializzazione.&lt;br /&gt;
&amp;lt;br&amp;gt;Perché nasce initrd?&lt;br /&gt;
&amp;lt;br&amp;gt;Il kernel quando fa boot ha bisogno dei driver per tutti i device che servono per caricare il kernel.&lt;br /&gt;
Se vogliamo progettare un kernel che possa fare boot da vari dischi inserire tutti i device driver di questi dischi all'interno del kernel non è una scelta saggia.&lt;br /&gt;
Possiamo studiare un modo per caricare solo i &amp;quot;moduli&amp;quot; che ci servono --&amp;gt; initrd&lt;br /&gt;
&lt;br /&gt;
Quando il kernel è partito possiamo caricare i moduli che ci servono.&lt;br /&gt;
initrd ha al suo interno un file system (banale, di sola lettura, ad allocazione contigua) che contiene un'altra copia dei moduli kernel (.ko).&lt;br /&gt;
&amp;lt;br&amp;gt;In questo modo si ha un piccolo spreco di memoria: i moduli compaiono sia in initrd che in /sys/. Ad oggi anche nei sistemi embedded si preferisce accettare questo piccolo spreco di memoria flash.&lt;br /&gt;
&lt;br /&gt;
'''DTB (Device Tree Binary)'''&lt;br /&gt;
Descrive la configurazione del '''sistem on chip''' alla partenza.&lt;br /&gt;
&amp;lt;br&amp;gt;'''sistem on chip''': integratore contenente processore ed altre cose. Lo stesso integrato può essere configurato per fare un sacco di cose diverse. Si possono scegliere le interfacce dei device da attivare.&lt;br /&gt;
&amp;lt;br&amp;gt;Quando il kernel parte, il kernel deve sapere quali device ha a disposizione, quindi la configurazione del sistem on chip va fatta prima che il kernel parta.&lt;br /&gt;
&amp;lt;br&amp;gt;Il vero file contenente le informazioni (in forma testuale) è il device tree, ma dato che queste informazioni devono essere usate in tempi rapidi al boot, questo file viene compilato e si ottiene il DTB.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Possiamo ottenere i tre file di cui abbiamo bisogno montando l'immagine ISO:&lt;br /&gt;
    mount -o ro finnix-armhf.iso /mnt&lt;br /&gt;
ed andando nella cartella /mnt/boot/armhf/ possiamo trovare i file copiarli e smontare l'immagine.&lt;br /&gt;
Possiamo far partire la macchina virtuale.&lt;br /&gt;
&lt;br /&gt;
===Paravirtualizzazione===&lt;br /&gt;
Il prefisso para significa simile, affine a.&lt;br /&gt;
&amp;lt;br&amp;gt;La paravirtualizzazione è un'ottimizzazione del processo di virtualizzazione perché non il processore non viene emulato.&lt;br /&gt;
&amp;lt;br&amp;gt;Il punto è che l'implementazione di una virtualizzazione completa talvolta non è efficiente.&lt;br /&gt;
E.g. Algoritmi di minimizzazione delle seek su dischi virtuali sono inutili.&lt;br /&gt;
&lt;br /&gt;
Il kernel del guest deve essere informato di stare girando su un device virtuale, questo viola i principi di Popek e Goldber.&lt;br /&gt;
&lt;br /&gt;
===Meglio emulare perfettamente i sistemi reali o fare device ottimizzati per il mondo virtuale?===&lt;br /&gt;
Dipende.&lt;br /&gt;
&amp;lt;br&amp;gt;'''La virtualizzazione si può realizzare su vari livelli ed in varie modalità'''&lt;br /&gt;
Uno dei modi è quello di catturare le system call ('''system call interposition''') o quello di catturare le chiamate ad una libreria.&lt;br /&gt;
&lt;br /&gt;
====Catturare le system call====&lt;br /&gt;
'''ptrace''' è una system call che si può usare per virtualizzare le system call.&lt;br /&gt;
&lt;br /&gt;
====Catturare le chiamate a libreria====&lt;br /&gt;
Funziona con le librerie dinamiche. Le librerie dinamiche sono linkate all'eseguibile solamente in fase di esecuzione.&lt;br /&gt;
Un eseguibile non contiene le librerie, ma solamente le dipendenze alle librerie.&lt;br /&gt;
Per vedere quali sono si può usare il comando ''ldd executablename''.&lt;br /&gt;
&lt;br /&gt;
Esempio:&lt;br /&gt;
&amp;lt;br&amp;gt;La system call open non è altro che una funzione che solleva una trap tramite il comando syscall.&lt;br /&gt;
Potremmo trovare un modo per sovrascrivere la open della libreria standard (libc) in modo che la nuova open sia chiamata al posto dell'altra.&lt;br /&gt;
&lt;br /&gt;
'''purelibc''' è una libreria che prende gran parte delle system call e le ridefinisce.&lt;br /&gt;
&lt;br /&gt;
===Autovirtualizzazione===&lt;br /&gt;
Il processo stesso virtualizza le sue chiamate.&lt;br /&gt;
L'hypervisor è una libreria.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Sicuro NO, utile SI&amp;lt;/u&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
In ViewOS questo meccanismo viene usato in varie occasioni.&lt;br /&gt;
Permette di utilizzare le librerie oltre il loro scopo originale; e.g. se abbiamo una libreria che agisce su dei file e siamo interessati esclusivamente alla logica possiamo fare in modo che le system call relative ai file siano virtualizzate&lt;br /&gt;
in modo tale da fornire i dati in altro modo.&lt;br /&gt;
&lt;br /&gt;
Libreria --&amp;gt; purelibc&lt;br /&gt;
purelibc libreria di autovirtualizzazione&lt;br /&gt;
&lt;br /&gt;
UserModeLinux e ViewOS virtualizzano entrambi tramite system call interposition.&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;u&amp;gt;User mode linux virtualizza tutte le chiamate, ViewOS no.&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Namespaces''': implementano la virtualizzazione parziale (come ViewOS) ma all'interno del kernel. Sono più efficienti ma complicano il kernel.&lt;br /&gt;
&lt;br /&gt;
====Xen====&lt;br /&gt;
L'idea su cui Xen si basa è quella di fondere insieme kernel ed hypervisor.&lt;br /&gt;
&amp;lt;br&amp;gt;Siccome scrivere un intero kernel sarebbe un compito troppo impegnativo, Xen si ispira all'architettura a microkernel.&lt;br /&gt;
Xen implementa uno strato, che si trova direttamente sull'hardware, che usa paravirtualizzazione e che contiene solo le funzioni necessarie a gestire le macchine virtuali.&lt;br /&gt;
&lt;br /&gt;
In Xen &amp;lt;u&amp;gt;&amp;quot;tutte le macchine sono uguali, ma una è più uguale delle altre&amp;quot;&amp;lt;/u&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Di per sè Xen non supporta direttamente l'hardware della macchina reale, infatti non contiene i device driver, ma sfrutta quelli della prima macchina virtuale (domain0).&lt;br /&gt;
Se non configurato diversamente tutti i device vengono gestiti dal domain0. Tutto ciò che arriva dall'hardware viene inoltrato al domain0. Domain0 vede quindi device virtuali che sono rappresentazioni esatte dei device fisici.&lt;br /&gt;
&lt;br /&gt;
KVM ha dimostrato di avere ormai le stesse prestazioni di Xen. Quindi potrebbe essere una buona idea quella di usare un Linux minimale con KVM al posto di Xen.&lt;br /&gt;
&lt;br /&gt;
== March 08 2018 ==&lt;br /&gt;
[https://liveunibo-my.sharepoint.com/:u:/g/personal/francesco_fornari2_studio_unibo_it/EQq0OH4TShpFpQB01x-TmAgB111c9tPOwkxV_BdP9swVJw?e=AbDxex Registrazione 08/03/18]&lt;br /&gt;
&lt;br /&gt;
'''ptrace''' è una system call che permette ad un processo di controllare un altro processo.&lt;br /&gt;
Inizialmente si usavano i segnali stop and continue.&lt;br /&gt;
Nelle prime versioni era proibito usare i segnali stop e continue se il processo era tracciato.&lt;br /&gt;
Nelle ultime versioni c'è un nuovo modo di collegarsi ad un processo: PTRACE_SEIZE.&lt;br /&gt;
&lt;br /&gt;
(VUos usa virtualizzazione parziale)&lt;br /&gt;
&lt;br /&gt;
'''3 tipologie di viste per un unico sistema'''&lt;br /&gt;
&lt;br /&gt;
===Nei panni degli utenti===&lt;br /&gt;
L'idea di VUos è di fornire ad un processo un ambiente diverso;&lt;br /&gt;
VUos usa il concetto di modulo (come nel kernel) ovvero abilita delle funzionalità;&lt;br /&gt;
abbiamo moduli e sottomoduli (usati per specifiche implementazioni delle funzionalità dei moduli):&lt;br /&gt;
http://wiki.v2.cs.unibo.it/wiki/index.php?title=Main_Page&lt;br /&gt;
&lt;br /&gt;
'''Moduli''':&lt;br /&gt;
* '''UM-Fuse''' (versione vecchia) --&amp;gt; '''VUfuse''' (versione nuova) modulo per la virtualizzare file system.&lt;br /&gt;
: Compatibile con Fuse; modulo del kernel di Linux con lo stesso scopo.&lt;br /&gt;
: Fuse si trova nel kernel, i sottomoduli no.&lt;br /&gt;
: Se si compilano gli stessi sorgenti per Fuse linkando la libreria di UM-Fuse lo stesso sorgente funziona con UM Fuse.&lt;br /&gt;
: (Tip: meglio non riscoprire l'acqua calda ed uniformare le interfacce ed usarlo)&lt;br /&gt;
: Sottomoduli:&lt;br /&gt;
:* &amp;lt;u&amp;gt;umfuseext2&amp;lt;/u&amp;gt; (fuseext2) (monta anche ext3 ed ext4)&lt;br /&gt;
:* &amp;lt;u&amp;gt;umfusefat&amp;lt;/u&amp;gt; (libfat)&lt;br /&gt;
:* &amp;lt;u&amp;gt;umfuseiso&amp;lt;/u&amp;gt;&lt;br /&gt;
:* &amp;lt;u&amp;gt;umfusessh&amp;lt;/u&amp;gt;&lt;br /&gt;
:* &amp;lt;u&amp;gt;umfusecrypt&amp;lt;/u&amp;gt;&lt;br /&gt;
* '''UM Net''' --&amp;gt; '''VUnet'''&lt;br /&gt;
: Consente di avere una visione virtualizzata della rete.&lt;br /&gt;
: Sottomoduli:&lt;br /&gt;
:* &amp;lt;u&amp;gt;umnetlwipv6&amp;lt;/u&amp;gt; (lwipv6)&lt;br /&gt;
* '''UM Dev'''&lt;br /&gt;
: Sottomoduli:&lt;br /&gt;
:* &amp;lt;u&amp;gt;umdevmbr&amp;lt;/u&amp;gt; - Master Boot Record&lt;br /&gt;
&lt;br /&gt;
Esempio UM Dev:&lt;br /&gt;
&lt;br /&gt;
Possiamo montare l'immagine di un disco con UM Dev e montare la prima partizione con umfuseext2 (se la partizione è ext2).&lt;br /&gt;
&amp;lt;br&amp;gt;Immagine di un disco = tabella partizioni (MBR o GPT) + partizioni (file system all'interno delle partizioni).&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;mount&amp;lt;/code&amp;gt; ed il file system sono i punti cardine dell'architettura Unix; Unix da nome alle cose tramite il file system.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Esempio fatto dal prof:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
 truncate -s 1G mydisk    # creiamo l'immagine del disco&lt;br /&gt;
 umview xterm		  # facciamo partire la macchina virtuale parziale su un terminale xterm&lt;br /&gt;
&lt;br /&gt;
#nel terminale xterm&lt;br /&gt;
&lt;br /&gt;
 um_add_service umdev umfuse    # aggiungiamo i moduli&lt;br /&gt;
&lt;br /&gt;
 ls /dev/hda&lt;br /&gt;
&lt;br /&gt;
 mount -t umdevmbr mydisk /dev/hda    # umdevmbr è il tipo di montaggio&lt;br /&gt;
&lt;br /&gt;
#Il disco montato sarà visibile solamente nel terminale della macchina virtuale (e nei suoi figli).&lt;br /&gt;
#ViewOS si accerta che esista un modulo che faccia match con la prima parte del nome (umdev) e dà la chiamata in gestione al modulo.&lt;br /&gt;
#A quel punto la libreria (umdevmbr.so) viene caricata in memoria.&lt;br /&gt;
&lt;br /&gt;
 locate umdevmbr.so&lt;br /&gt;
 ls -l /dev/hda    # verifichiamo il montaggio&lt;br /&gt;
&lt;br /&gt;
 /sbin/fdisk /dev/hda    # creaiamo la tabella delle partizioni come in un disco reale&lt;br /&gt;
&lt;br /&gt;
# Il file mydisk è l'immagine di un disco in formato raw.&lt;br /&gt;
# Se facessimo cat di mydisk e ridirezionassimo l'output in un disco da 1G, l'hard disk si partizionerebbe e conterrebbe esattamente il contenuto del file.&lt;br /&gt;
# in alternativa a cat si usa dd perchè è ottimizzato per file di grandi dimensioni (usa grandi cache)&lt;br /&gt;
&lt;br /&gt;
 ls /dev/hda1&lt;br /&gt;
&lt;br /&gt;
 /sbin/mkfs.ext2 /dev/hda1	# make file system ext 2&lt;br /&gt;
 /sbin/fsck.ext2 -f /dev/hda1	# file system check &lt;br /&gt;
&lt;br /&gt;
 ls /mnt&lt;br /&gt;
&lt;br /&gt;
 mount -o rw+ -t umfuseext2 /dev/hda1 /mnt    # montiamo il disco ('''nidifichiamo la virtualizzazione''')&lt;br /&gt;
&lt;br /&gt;
# ora tutte le chiamate verso /mnt saranno catturate e virtualizzate&lt;br /&gt;
&lt;br /&gt;
 ls /mnt    # dovrebbe comparire solo lost+found&lt;br /&gt;
&lt;br /&gt;
# echo &amp;quot;ciao&amp;quot; &amp;gt; /mnt/ciao&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Nidificazione della virtualizzazione====&lt;br /&gt;
Se creiamo un file il nostro processo fa una &amp;lt;code&amp;gt;open&amp;lt;/code&amp;gt; al pathname: la system call viene intercettata da ViewOS in quanto stiamo accedendo ad un path virtualizzato.&lt;br /&gt;
L'hypervisor si accorgerà che il file system è virtualizzato da &amp;lt;code&amp;gt;umfuseext2&amp;lt;/code&amp;gt;, che sa come fare la open sul file system virtuale (generando una &amp;lt;code&amp;gt;write&amp;lt;/code&amp;gt; ad un certo offset nell'immagine della partizione).&lt;br /&gt;
Anche la partizione però è virtualizzata: la chiamata dovrà essere intercettata dal modulo &amp;lt;code&amp;gt;umdevmbr&amp;lt;/code&amp;gt; (che virtualizza le partizioni); questa chiamata tuttavia è generata dall'hypervisor.&lt;br /&gt;
&amp;lt;br&amp;gt;Com'è possibile che l'hypervisor catturi la sua stessa chiamata e la virtualizzi nuovamente? --&amp;gt; '''purelibc'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;/etc/fstab&amp;lt;/code&amp;gt; contiene la tabella dei filesystem&lt;br /&gt;
&lt;br /&gt;
Un file system non deve essere mai montato da più macchine; vale anche per i file dei filesystem virtuali.&lt;br /&gt;
&amp;lt;br&amp;gt;Tramite i comandi standard siamo in grado, con i permessi di utente, di fare operazioni che potrebbero essere svolte solo da root.&lt;br /&gt;
&amp;lt;br&amp;gt;Queste operazioni si potrebbero fare anche senza virtualizzazione, ma servirebbero i permessi di amministratore e avremmo molti limiti.&lt;br /&gt;
&lt;br /&gt;
'''loop device''' dispositivo a blocchi asssociato dinamicamente ad un file e che serve per vedere il file come una memoria di massa.&lt;br /&gt;
&lt;br /&gt;
====ViewFS====&lt;br /&gt;
[http://wiki.v2.cs.unibo.it/wiki/index.php?title=ViewFS ViewFS] è un modulo che virtualizza la struttura dei file system.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
um_add_service viewfs&lt;br /&gt;
mkdir /tmp/newroot&lt;br /&gt;
viewsu&lt;br /&gt;
mount -t viewfs -o mincow,except=/tmp,vstat /tmp/newroot /&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;mincow&amp;lt;/code&amp;gt; ed &amp;lt;code&amp;gt;except&amp;lt;/code&amp;gt; sono opzioni di ViewFS&lt;br /&gt;
&lt;br /&gt;
=====COW=====&lt;br /&gt;
'''COW (Copy On Write)''': Si accede un file in sola lettura ed ogni volta che lo si modifica ne si fa una copia.&lt;br /&gt;
I risultati saranno visibili solamente a noi.&lt;br /&gt;
&amp;lt;br&amp;gt;'''mincow''': ogni volta il sistema proverà ad accedere in scrittura al file e se non ce la fa lo farà in modalità '''cow'''.&lt;br /&gt;
&lt;br /&gt;
Si possono installare pacchetti debian virtualmente usando metodo copy on write (possiamo testare l'installazione di nuovi pacchetti).&lt;br /&gt;
&lt;br /&gt;
=====qcow=====&lt;br /&gt;
Formato usato da qemu per le immagini dei dischi. Usa COW al livello dei blocchi di disco.&lt;br /&gt;
&lt;br /&gt;
Se si modifica il file originale del cow si possono attuare varie politiche.&lt;br /&gt;
Qemu non dà alcuna garanzia.&lt;br /&gt;
ViewOS non permette la modifica.&lt;br /&gt;
&lt;br /&gt;
umview è disponibile nei repository di debian o (aggiornato) su SourceForce.&lt;br /&gt;
&lt;br /&gt;
=====unreal=====&lt;br /&gt;
Modulo di test: fa vedere l'intero file system come se fosse in &amp;lt;code&amp;gt;/unreal&amp;lt;/code&amp;gt; ed anche dentro &amp;lt;code&amp;gt;/unreal/unreal&amp;lt;/code&amp;gt;.&lt;br /&gt;
Si possono fare vari esperimenti, e.g. andare dentro &amp;lt;code&amp;gt;/unreal&amp;lt;/code&amp;gt; e lanciare comandi come &amp;lt;code&amp;gt;make&amp;lt;/code&amp;gt;.&lt;br /&gt;
Se &amp;lt;code&amp;gt;make&amp;lt;/code&amp;gt; si comporta nello stesso modo la virtualizzazione sta funzionando.&lt;br /&gt;
&lt;br /&gt;
Tip: principio chiave del debugging - separare le responsabilità.&lt;br /&gt;
&lt;br /&gt;
'''umview --&amp;gt; umvu'''&lt;br /&gt;
&lt;br /&gt;
'''umbinfmt'''&lt;br /&gt;
&lt;br /&gt;
=====KMVIEW=====&lt;br /&gt;
Fratello di '''UMVIEW'''.&lt;br /&gt;
Molto veloce perché usava un modulo kernel sperimentale che però non entrerà a far parte nel kernel.&lt;br /&gt;
Permetteva, al livello del kernel, di distinguere i file descriptor reali da quelli virtuali.&lt;br /&gt;
La virtualizzazione costava solo 4%.&lt;br /&gt;
&lt;br /&gt;
====Berkeley socket====&lt;br /&gt;
L'interfaccia '''Berkeley socket''' deve essere aggiornata nei tempi in quanto possiede intrinsecamente l'idea di view globale (global view assuption).&lt;br /&gt;
&amp;lt;br&amp;gt;I parametri della chiamata socket sono tre: &lt;br /&gt;
* famiglia (domain, ipv4)&lt;br /&gt;
* servizio (type)&lt;br /&gt;
* protocollo&lt;br /&gt;
&lt;br /&gt;
Se vogliamo un socket AF_INET (ipv4), di tipo SOCK_STREAM, con protocollo di 0 (di default, TCP) non abbiamo modo di scegliere lo stack di rete.&lt;br /&gt;
&amp;lt;br&amp;gt;Se potessimo avere a disposizione d'uso diversi stack di protocolli di rete potremmo avere nuovi tipi di applicazioni ed avere soluzioni più semplici a problemi noti.&lt;br /&gt;
&lt;br /&gt;
In virtual square l'API dei Berkeley sockets è stata estesa con un API chiamata '''msockets''':&lt;br /&gt;
- permette l'utilizzo di più stack di rete allo stesso tempo.&lt;br /&gt;
- il file system viene usato per dare nome agli stack di rete (molto Unix consistent).&lt;br /&gt;
- è compatibile con il passato.&lt;br /&gt;
&lt;br /&gt;
Gli stack di rete appaiono quindi nel file system come file speciali.&lt;br /&gt;
Si può fare mount dello stack.&lt;br /&gt;
Vedere libro di Virtual square per maggiori informazioni.&lt;br /&gt;
&lt;br /&gt;
=====umattach=====&lt;br /&gt;
Si può virtualizzare qualche processo che sta già eseguendo.&lt;br /&gt;
Se la view di un processo cambia improvvisamente potrebbero generarsi delle incoerenze.&lt;br /&gt;
&lt;br /&gt;
===Nei panni degli sviluppatori===&lt;br /&gt;
&lt;br /&gt;
====purelibc====&lt;br /&gt;
[http://wiki.virtualsquare.org/wiki/index.php/PureLibc purelibc] è una libreria che a differenza di '''libc''' prevede l'esclusione delle systemcall in modo da lasciare la libertà di usare le systemcall che si preferisce.&lt;br /&gt;
&lt;br /&gt;
libc = libreria c + libreria di system call (la libc è una libreria c ibrida)&lt;br /&gt;
&lt;br /&gt;
Una vera libreria c quando avviene una printf deve svolgere i calcoli e chiamare la write.&lt;br /&gt;
Non possiamo usare la libc ridefinendo le system call perché quando la printf chiama la write essendo una libreria unica il linker ha già risolto la chiamata.&lt;br /&gt;
Per fare ciò abbiamo bisogno di una libreria pura, che non implementi le system call al suo interno.&lt;br /&gt;
&amp;lt;u&amp;gt;L'hypervisor di ViewOS usa purelibc&amp;lt;/u&amp;gt;.&lt;br /&gt;
Attualmente la purelibc è complessa ed usa il meccanismo del &amp;lt;u&amp;gt;dynamic linker preload&amp;lt;/u&amp;gt; per virtualizzare (vedere la documentazione di purelibc).&lt;br /&gt;
&lt;br /&gt;
La purelibc al momento è implementata come layer al di sopra della libc. Questo è scomodo.&lt;br /&gt;
Se qualche system call fosse aggiunta dovremmo aggiungerne un'altra anche in purelibc.&lt;br /&gt;
&lt;br /&gt;
'''execs --&amp;gt; progetto praticamente concluso'''&lt;br /&gt;
&lt;br /&gt;
====cado====&lt;br /&gt;
cado: sudo con le '''capability''' (privilegio).&lt;br /&gt;
&amp;lt;br&amp;gt;Le capability permettono di separare le prerogative di root e di poterle assegnare in maniera separata, possono essere assegnate a processi o a file.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;man capabilities&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Un processo può avere 4 classi di capability. Le possiamo vedere in &amp;lt;code&amp;gt;/proc/id_processo/status&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;cat /proc/$$/status&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=====Capabilities=====&lt;br /&gt;
* &amp;lt;u&amp;gt;Permitted&amp;lt;/u&amp;gt; - che possono essere attivate dal thread.&lt;br /&gt;
* &amp;lt;u&amp;gt;Inheritable&amp;lt;/u&amp;gt; - che possono essere ereditate.&lt;br /&gt;
* &amp;lt;u&amp;gt;Effective&amp;lt;/u&amp;gt; - attive. Sono sempre un sottoinsieme dei permitted.&lt;br /&gt;
* &amp;lt;u&amp;gt;Ambient&amp;lt;/u&amp;gt; - sono mantenute a patto che il file non sia privilegiato.&lt;br /&gt;
&lt;br /&gt;
'''Bound''' - maschera non modificabile che indica quali capabilities il sistema è in grado di gestire.&lt;br /&gt;
&lt;br /&gt;
=====Capabilities dei file=====&lt;br /&gt;
&lt;br /&gt;
'''Capabilities ambient''': sono mantenute a patto che il file non sia privilegiato.&lt;br /&gt;
Se si ha una capability ambient essa è considerata come permitted e come effective.&lt;br /&gt;
&lt;br /&gt;
Come cambiano le capabilities quando si chiama una exec?&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;/etc/sudoers&amp;lt;/code&amp;gt; --&amp;gt; file di configurazione di sudo (anche cado ha un file di configurazione)&lt;br /&gt;
&lt;br /&gt;
====namespace====&lt;br /&gt;
Si possono dare ai processi visioni diverse sulle risorse.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;man namespaces&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Rete, IPC, PID.&lt;br /&gt;
&amp;lt;br&amp;gt;I namespaces sono stati implementati male: funzionano ma sono molto pesanti da utilizzare e vengono usati dai processi senza che l'utente non ne abbia visibilità ( Chromium per creare dei sandbox usa i namespaces ).&lt;br /&gt;
&lt;br /&gt;
I namespace si possono creare in 3 modi diversi:&lt;br /&gt;
* &amp;lt;u&amp;gt;clone&amp;lt;/u&amp;gt;: crea un nuovo processo con namespace associato.&lt;br /&gt;
* &amp;lt;u&amp;gt;setns&amp;lt;/u&amp;gt;: permette ad un processo di unirsi ad un namespace esistente.&lt;br /&gt;
* &amp;lt;u&amp;gt;unshare&amp;lt;/u&amp;gt;: il processo chiamante si collega ad un namespace nuovo.&lt;br /&gt;
&lt;br /&gt;
===Nei panni degli sviluppatori core===&lt;br /&gt;
&lt;br /&gt;
== March 13 2018 ==&lt;br /&gt;
[https://etherpad.wikimedia.org/p/qKAqRNgtxt Etherpad 13/03/18]&lt;br /&gt;
&lt;br /&gt;
[https://liveunibo-my.sharepoint.com/:u:/g/personal/francesco_fornari2_studio_unibo_it/Ed7XFMhWD9tEjVhCAVij9PQB66auNxzCMUG53Xl9veDlkw?e=JHtQN1 Registrazione 13/03/18]&lt;br /&gt;
&lt;br /&gt;
Quando si trasmette una lista di interfacce in protocollo &amp;lt;code&amp;gt;netlink&amp;lt;/code&amp;gt; prevede il pacchetto &amp;quot;''done''&amp;quot; come sentinella finale. In alternativa si può usare &amp;lt;code&amp;gt;busybox ip addr&amp;lt;/code&amp;gt; in quanto &amp;lt;code&amp;gt;ip addr&amp;lt;/code&amp;gt; di busybox non fa nessun controllo sul pacchetto ''done''.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
#Facciamo partire una macchina virtuale in un terminale.&lt;br /&gt;
umview xterm&lt;br /&gt;
#Vediamo le vere interfacce di rete.&lt;br /&gt;
ip addr&lt;br /&gt;
#Carichiamo il supporto per le reti virtuali.&lt;br /&gt;
um_add_service umnet&lt;br /&gt;
&lt;br /&gt;
#vde vuole indirizzi simili agli url.&lt;br /&gt;
#???????? vedere meglio nella documentazione ???????????????&lt;br /&gt;
&lt;br /&gt;
mount -t umnetlwipv6 -o vde0=vxvde:// none /dev/net/mynet&lt;br /&gt;
#Osserviamo di nuovo le interfacce di rete.&lt;br /&gt;
ip link&lt;br /&gt;
&lt;br /&gt;
#Vediamo le interfacce precedenti in quanto la nuova rete non è montata come rete di default.&lt;br /&gt;
#Possiamo avere tanti stack diversi ognuno con le sue interfacce.&lt;br /&gt;
&lt;br /&gt;
#mstack --&amp;gt; multiple stack; comando di umview usare lo stack selezionato.&lt;br /&gt;
mstack /dev/net/mynet ip link&lt;br /&gt;
#Se volessi far partire un browser su quello stack dovrei fare&lt;br /&gt;
mstack /dev/net/mynet firefox&lt;br /&gt;
#Se volessi far partire una connessione ssh&lt;br /&gt;
mstack /dev/net/mynet ssh&lt;br /&gt;
#Se volessimo avviare un terminale che vive nella rete nuova potremmo fare&lt;br /&gt;
mstack /dev/net/mynet bash&lt;br /&gt;
&lt;br /&gt;
ip addr add 10.0.0.1/24 dev vd0&lt;br /&gt;
ip link set vd0 up&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se adesso su un'altra macchina della rete locale facessi le stesse operazioni con un indirizzo ip diverso, le macchine avrebbero la possibilità di mettersi in contatto.&lt;br /&gt;
&lt;br /&gt;
Per completezza dell'esempio realizziamo l'altro stack con vdens (namespace di vde).&lt;br /&gt;
&lt;br /&gt;
Parte dell'esempio fatto dal prof; qui viene usato in entrambi i terminali '''vdens''', mentre il prof a lezione ha usato per uno '''umnet''' e '''vdens''' per l'altro.&lt;br /&gt;
Sono necessari '''[https://github.com/rd235/vdens vdens]''' ,'''[https://github.com/rd235/vdeplug4 vdeplug4]''' ( e forse anche '''[https://github.com/rd235/vxvdex vxvdex]''').&lt;br /&gt;
&lt;br /&gt;
Per entrambe le sessioni del terminale setto una variabile d'ambiente in modo che mi cerchi la ''libvdeplug.so.4'' in ''/usr/local/lib''.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
 export LD_LIBRARY_PATH=/lib:/usr/lib:/usr/local/lib&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Terminale 1&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
 vdens vxvde://&lt;br /&gt;
 ip link set vde0 up&lt;br /&gt;
 ip addr add 10.0.0.1/24 dev vde0&lt;br /&gt;
 &lt;br /&gt;
 ping 10.0.0.2&lt;br /&gt;
&lt;br /&gt;
 nc 10.0.0.2 2222&lt;br /&gt;
&lt;br /&gt;
#scrivendo dei messaggi nel terminale 1 compariranno nel 2 e viceversa &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Terminale 2&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
 vdens vxvde://&lt;br /&gt;
 ip link set vde0 up&lt;br /&gt;
 ip addr add 10.0.0.1/24 dev vde0&lt;br /&gt;
&lt;br /&gt;
#ora nel terminale 1 posso eseguire ping 10.0.0.2&lt;br /&gt;
&lt;br /&gt;
 nc -l 2222&lt;br /&gt;
#ora nel terminale 1 posso eseguire  nc 10.0.0.2 2222&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Stack TCP/IP''': o implementato a livello utente come libreria o implementato nel kernel.&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;umview&amp;lt;/code&amp;gt; --&amp;gt; prima opzione.&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;vdens&amp;lt;/code&amp;gt; --&amp;gt; chiede al kernel di costruire un altro stack TCP/IP per questo utente (sfrutta i namespace).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;nc&amp;lt;/code&amp;gt; (alias &amp;lt;code&amp;gt;netcat&amp;lt;/code&amp;gt;) coltellino svizzero per esperimenti su rete.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
#Connessione TCP alla porta 22 di maddalena&lt;br /&gt;
nc mad.cs.unibo.it 22&lt;br /&gt;
#Connessione alla porta 80 &lt;br /&gt;
nc 130.136.1.110 80&lt;br /&gt;
nc permette di collegarsi tramite TCP e di scrivere HTTP manualmente&lt;br /&gt;
&lt;br /&gt;
#Faccio un server TCP in ascolto su porta 2222&lt;br /&gt;
nc -l 2222&lt;br /&gt;
#Mi connetto alla porta 2222 dell'indirizzo 10.0.0.2&lt;br /&gt;
nc 10.0.0.2 2222&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Un utente può creare tutti gli stack di rete che vuole ed averne vari a disposizione con configurazioni diverse.&lt;br /&gt;
&amp;lt;br&amp;gt;Esempio: possiamo lanciare un browser facendo in modo che il browser non sia logicamente dove siamo ma usi un ip di un'altra area geografica.&lt;br /&gt;
* Così facendo inganneremmo where si my ip&lt;br /&gt;
* Comodo per testare la neutralità della rete. Stessa pagina acceduta con ip di aree geografiche diverse appare nello stesso modo.&lt;br /&gt;
&lt;br /&gt;
Se volessimo implementare un VPN per sicurezza aziendale normalmente dovremmo spostare tutta la macchina dentro il VPN, con questo metodo possiamo avere un solo stack connesso al VPN.&lt;br /&gt;
&lt;br /&gt;
I supporti di rete, file system e device, portandoli fuori dal kernel in user mode ricordano il concetto di microkernel.&lt;br /&gt;
&amp;lt;br&amp;gt;ViewOS serve anche per poter fare una transizione dolce dai kernel monolitici ai microkernel; è come avere un microkernel configurabile a runtime.&lt;br /&gt;
* Possiamo decidere di tenere parti del kernel (moduli) in spazio utente tramite moduli di ViewOS. è meno efficiente ma più sicuro e si usa solo all'occorrenza.&lt;br /&gt;
* Se dovessimo gestire un tipo di file system appena inventato (di cui non abbiamo il supporto nel kernel) per inserire il supporto del kernel dovremmo ricompilare tutto; Se usiamo un modulo a livello utente no.&lt;br /&gt;
&lt;br /&gt;
ViewOS è una specifica; per ora è stato implementato tramite '''system call interposition (ptrace)''', ma può essere implementato in altri modi.&lt;br /&gt;
&lt;br /&gt;
Potremmo implementare il tutto attraverso i '''namespace''', nel kernel (e.g. vdens). Creare diversi visioni dell'ambiente.&lt;br /&gt;
&lt;br /&gt;
== March 15 2018 ==&lt;br /&gt;
&lt;br /&gt;
Lezione sospesa causa lauree.&lt;br /&gt;
&lt;br /&gt;
== March 20 2018 ==&lt;br /&gt;
[https://etherpad.wikimedia.org/p/A4ZfDg1rtY Etherpad 20/03/18]&lt;br /&gt;
&lt;br /&gt;
[https://liveunibo-my.sharepoint.com/:u:/g/personal/francesco_fornari2_studio_unibo_it/Ea2A7wOIwqRJvvLoF7ekvr8BdBWJmjjz_fBx1zB5rr__2w?e=jxfToF Registrazione 20/03/18]&lt;br /&gt;
&lt;br /&gt;
== March 22 2018 ==&lt;br /&gt;
[https://etherpad.wikimedia.org/p/ya2BWaXTbl Etherpad 22/03/18]&lt;br /&gt;
&lt;br /&gt;
[https://liveunibo-my.sharepoint.com/:u:/g/personal/francesco_fornari2_studio_unibo_it/EZ8AcVfOagpBnYHAN3EYcv0BpHlqcH0Lg-8l3sQb6_Drsg?e=7suh7a Registrazione 22/03/18]&lt;br /&gt;
&lt;br /&gt;
== March 27 2018 ==&lt;br /&gt;
[https://etherpad.wikimedia.org/p/GaJNvPo1wK Etherpad 27/03/18]&lt;br /&gt;
&lt;br /&gt;
[https://liveunibo-my.sharepoint.com/:u:/g/personal/francesco_fornari2_studio_unibo_it/EYZUi8icxIpIhMrV_ZvwspIB5kCqMzEbL8plvCzZD8-BIA?e=VhO56l Registrazione 27/03/18 pt1]&lt;br /&gt;
[https://liveunibo-my.sharepoint.com/:u:/g/personal/francesco_fornari2_studio_unibo_it/EWPHKBP4cqNEomwP7MQiodgBxbUQbwAYLA9f5gu14OFg-A?e=7sA6NE pt2]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Esempio su veth&lt;br /&gt;
&lt;br /&gt;
Terminale 1&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
 sudo bash&lt;br /&gt;
&lt;br /&gt;
 ip link add type veth&lt;br /&gt;
 ip link&lt;br /&gt;
&lt;br /&gt;
# solo per avere una panoramica del comando&lt;br /&gt;
 ip netns help &lt;br /&gt;
&lt;br /&gt;
 ip netns add renzonet&lt;br /&gt;
 ip netns list&lt;br /&gt;
&lt;br /&gt;
#trasferiamo veth1 nel namespace appena creato renzonet&lt;br /&gt;
 ip link set veth1 netns renzonet&lt;br /&gt;
 ip netns exec renzonet ip addr&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 ip addr add 10.1.1.1/24 dev veth0&lt;br /&gt;
 ip link set veth0 up&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Terminale 2&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 sudo bash&lt;br /&gt;
&lt;br /&gt;
 ip netns exec renzonet bash&lt;br /&gt;
 ip addr add 10.1.1.2/24 dev veth1&lt;br /&gt;
 ip link set veth1 up&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 ping 10.1.1.1 &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# per riportare le cose allo stato precedente&lt;br /&gt;
#il comando si prende la libertà di eliminare anche veth0 e veth1 create con 'ip link add type veth'&lt;br /&gt;
 ip netns delete renzonet&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== April 05 2018 ==&lt;br /&gt;
[https://etherpad.wikimedia.org/p/f9dnp4d724 Etherpad 05/04/18]&lt;br /&gt;
&lt;br /&gt;
[https://liveunibo-my.sharepoint.com/:u:/g/personal/francesco_fornari2_studio_unibo_it/EYo0VpOMc-lOttWR_EKsIesBVefwRpQ-h6lRCKjltgK5fw?e=M7dSqJ Registrazione 05/04/18]&lt;br /&gt;
&lt;br /&gt;
Esempio fatto alla fine riguardo la gestione dei file in umvu&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
 umvu xterm&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Terminale xterm 1&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
 #step 1&lt;br /&gt;
 xterm &amp;amp;&lt;br /&gt;
 &lt;br /&gt;
 vu_insmod mountreal&lt;br /&gt;
&lt;br /&gt;
 #step 3&lt;br /&gt;
 ps -ax | grep less #leggo il pid di less /unreal/etc/services&lt;br /&gt;
&lt;br /&gt;
 cd /proc/pid/fd # pid è quello letto poco prima&lt;br /&gt;
 ls -l | grep .vu&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Terminale xterm 2&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
 #step 2&lt;br /&gt;
 less /unreal/etc/services #less mostra il file e lo mantiene aperto&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== April 10 2018 ==&lt;br /&gt;
== April 12 2018 ==&lt;br /&gt;
== April 17 2018 ==&lt;br /&gt;
== April 19 2018 ==&lt;br /&gt;
== April 24 2018 ==&lt;br /&gt;
== April 27 2018 ==&lt;br /&gt;
== May 03 2018 ==&lt;br /&gt;
== May 08 2018 ==&lt;br /&gt;
== May 10 2018 ==&lt;br /&gt;
== May 15 2018 ==&lt;br /&gt;
== May 17 2018 ==&lt;br /&gt;
== May 22 2018 ==&lt;br /&gt;
== May 24 2018 ==&lt;/div&gt;</summary>
		<author><name>Leonardo</name></author>
	</entry>
	<entry>
		<id>https://vsd.v2.cs.unibo.it/wiki/index.php?title=2018_Spring_Term&amp;diff=83</id>
		<title>2018 Spring Term</title>
		<link rel="alternate" type="text/html" href="https://vsd.v2.cs.unibo.it/wiki/index.php?title=2018_Spring_Term&amp;diff=83"/>
		<updated>2018-03-27T16:46:22Z</updated>

		<summary type="html">&lt;p&gt;Leonardo: /* March 27 2018 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== February 27 2018 ==&lt;br /&gt;
&lt;br /&gt;
===Virtualità===&lt;br /&gt;
&lt;br /&gt;
Virtualizzare qualcosa significa fornire un oggetto che possa essere usato (stessa interfaccia) efficacemente al posto dell'altro.&lt;br /&gt;
Se si usa una scarpa per piantare un chiodo, la scarpa è un &amp;quot;martello virtuale&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
====Memoria virtuale====&lt;br /&gt;
*Interfaccia della memoria principale: load(indirizzo), store(indirizzo, oggetto).&lt;br /&gt;
*Semantica: se eseguo store(i, a) seguito da load(i), la seconda operazione ritornerà a.&lt;br /&gt;
La memoria secondaria può essere usata per implementare l'interfaccia di quella primaria.&lt;br /&gt;
Anche l'hardware di un calcolatore può essere visto come un'entità astratta che parla il linguaggio ISA del processore di cui fa uso.&lt;br /&gt;
Se virtualizziamo l'hardware tramite un programma che ne implementa la stessa interfaccia otteniamo una macchina virtuale.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Possibilità di virtualizzare il tempo.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Significato di '''virtualsquare'''&lt;br /&gt;
&lt;br /&gt;
Una piazza dove i vari tipi di virtualià coesistono, un laboratorio internazionale sulla virtualità.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Concetto di VIEW====&lt;br /&gt;
&lt;br /&gt;
I processi &amp;quot;vedono&amp;quot; l'ambiente di esecuzione. Se non stanno eseguendo istruzioni di calcolo, i processi si interfacciano (&amp;quot;vedono&amp;quot;) al sistema (accedono a memoria, fanno routing) usando system calls.&lt;br /&gt;
ogni processo può vedere un file diverso allo stesso path name&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;umview&amp;lt;/u&amp;gt; vecchia macchina parziale virtuale&lt;br /&gt;
&lt;br /&gt;
L''''Hypervisor''' agisce parzialmente come un debugger: intercetta le system calls ed intraprende azioni.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Virtual Distributed Ethernet (VDE)====&lt;br /&gt;
&lt;br /&gt;
VDE è una rete Ethernet virtuale che può essere distribuita su diverse macchine fisiche presenti in rete.&lt;br /&gt;
Usare concetti reali nello &amp;quot;Standard&amp;quot; ethernet e vitualizzarli. ad esmpio uno switch con il vitual switch, più avanti nelle versioni sono stati creati dei &amp;quot;tasselli&amp;quot; che si posso interfacciare con vari altri tasselli per formare una rete virtuale personalizzata&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Tip: &amp;quot;Trovate il nome giusto da dare a tutte le cose che pensate&amp;quot;&lt;br /&gt;
&lt;br /&gt;
PeDaNTe S.P.A. (Physical, Data link, Network, Transport, Session, Presentation, Application)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Internet of Threads====&lt;br /&gt;
&lt;br /&gt;
Dare un indirizzo IP non alla macchina, ma direttamente al processo, questo ti pemette di migrare i processi da una macchina ad un'altra senza che il client deve riconfigurare l'IP della chiamata a quel processo (IPV6 è praticamente obbligatorio per rendere Internet of Threads utillizzabile, perchè IPV4 ha troppi pochi indirizzi)&lt;br /&gt;
Se abbiamo due web servers virtuali sulla stessa macchina fisica vogliamo che abbiano comunque diversi indirizzi ip.&lt;br /&gt;
&lt;br /&gt;
== March 01 2018 ==&lt;br /&gt;
&lt;br /&gt;
===INFO===&lt;br /&gt;
Le comunicazioni e lo scambio di idee avverranno nel gruppo Telegram.&lt;br /&gt;
&lt;br /&gt;
Per iscriversi/scrivere nel wiki occorre il [http://so.v2.cs.unibo.it/wiki/index.php?title=Qui numero magico] usato già per il corso di Sistemi Operativi.&lt;br /&gt;
&lt;br /&gt;
Vecchio materiale [http://www.cs.unibo.it/~renzo/vsd/ Virtual System Design]&lt;br /&gt;
&lt;br /&gt;
Altre risorse su [https://github.com/rd235 GitHub]&lt;br /&gt;
&lt;br /&gt;
Nickname del docente&lt;br /&gt;
* rd235 (derivato dai documenti RFC es. [https://tools.ietf.org/html/rfc1166 RFC 1166])&lt;br /&gt;
* iz4dje&lt;br /&gt;
&lt;br /&gt;
===Tipi di virtualizzazione===&lt;br /&gt;
[https://www.finnix.org/ finnix] è un sistema operativo live da usare &amp;quot;quando si è nei guai&amp;quot;, non ha interfaccia grafica e permette di provare i sistemi virtuali; la versione 1.0 è quella che funziona bene.&lt;br /&gt;
&lt;br /&gt;
Il sistema operativo in cui viene eseguita la macchina virtuale, viene detto '''host''' (ospitante) mentre la macchina virtuale è chiamata '''guest''' (ospite).&lt;br /&gt;
&lt;br /&gt;
====Emulazione====&lt;br /&gt;
Scrivendo un emulatore di una macchina emulo i passi di esecuzione dell'hardware: convertire le istruzioni dal linguaggio del processore che vuole essere emulato ad istruzioni per la macchina host.&lt;br /&gt;
&lt;br /&gt;
'''QEMU''' è un esempio: traduce il codice macchina guest in codice macchina host (traduzione dinamica). QEMU contiene i sorgenti con le istruzioni del vari assembler (sottoforma di funzioni) che vengono messi in un vettore; fa uso di cache come fanno i browser: il codice non viene tradotto di continuo ma viene eseguito quello &amp;quot;in cache&amp;quot; e questo lo fa risultare 15/20 volte più veloce.&lt;br /&gt;
&lt;br /&gt;
('''NOTA:''' rimane in sospeso '''slirp''', lo vedremo nel dettaglio in futuro)&lt;br /&gt;
&lt;br /&gt;
'''Busybox''' è un piccolo eseguibile che combina diverse applicazioni standard Unix, in pratica le utility Unix non sono altro che un alias di busybox; si può scaricare e compilare i binari di busybox per ''mips'' (arm), se attivo il servizio ''binfmt-support'' il sistema utilizzerà QEMU per eseguire i binari mips, mentre disattivando il servizio sarà possibile utilizzare '''KVM'''.&lt;br /&gt;
&lt;br /&gt;
=====Esempi di emulazione=====&lt;br /&gt;
''qemu-system-''* (wildcard) è il comando per lanciare un'architettura:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
qemu-system-x86_64 -cdrom finnix-110.iso -m 512M&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
dove ''-m 512M'' è la quantità di ram che gli rendiamo disponibile.&lt;br /&gt;
&lt;br /&gt;
Con QEMU possiamo eseguire ''finnix-armhf-111.iso'' su macchina x86_64 seguendo le [https://www.finnix.org/ARM istruzioni], per avere successo bisogna montare l'immagine iso ed estrarre il contenuto (''initrd.xz'', ''linux'' e ''vexpress-v2p-ca9.dtb'') della directory ''/boot/armhf/'' nella cartella da cui si lancia QEMU.&lt;br /&gt;
&lt;br /&gt;
====Virtualizzazione parziale====&lt;br /&gt;
&lt;br /&gt;
'''KVM''', acronimo di Kernel-based Virtual Machine (utilizza VT per Intel e AMD-V per AMD), ha un comportamento a &amp;quot;trigger&amp;quot; il processore si comporta come la routine normale, soltanto quando vengono lanciate determinate call viene cambiata la routine da quella nativa a quella apposita per simulare altri processori. Questo permette di avere macchine virtuali molto più veloci, visto che girano direttamente sul processore escluse le varie eccezione rende una correlazione praticamente 1 a 1.&lt;br /&gt;
&lt;br /&gt;
Si può abilitare la modalità KVM in QEMU usando l'opzione ''-enable-kvm'' che ovviamente richiede che i moduli siano stati caricati.&lt;br /&gt;
&lt;br /&gt;
====Virtualizzazione totale====&lt;br /&gt;
&lt;br /&gt;
'''VirtualBox''' è un esempio di virtualizzazione totale.&lt;br /&gt;
&lt;br /&gt;
'''User-Mode Linux''' è una macchina virtuale i cui sorgenti sono presenti nel kernel linux; usa lo stesso supporto del comando '''strace''' (utile per vedere le system call di un comando); User-Mode Linux è molto vicino a '''umview''' (che appunto sta per '''User-Mode View'''); in quanto a velocità sta in mezzo tra qemu e kvm.&lt;br /&gt;
&lt;br /&gt;
=====Differenze=====&lt;br /&gt;
&lt;br /&gt;
QEMU virtualizzazione a livello di processo ('''PVM'''), KVM a livello di sistema ('''SVM'''), VirtualBox a livello di system call ('''SCVM'''). Vedere [http://www.cs.unibo.it/~renzo/so/lucidi/so-03-struttura-os-1p.pdf#page=36 pag. 36] e a seguire.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
qemu-system-* é formato dal processore di traduzioni dinamiche qemu_(arm, mips...) e dalle periferiche.&lt;br /&gt;
&lt;br /&gt;
kvm invece non fa uso di qemu ma al posto suo usa l'accellerazione del processore (oltre alle periferiche).&lt;br /&gt;
&lt;br /&gt;
qemu funziona come processo utente e non ha bisogno di permessi eccezionali;&lt;br /&gt;
kvm invece risulta vincolato al processore (egrep '^flags.*(vmx|svm)' /proc/cpuinfo) e occorre anche il modulo kernel (lsmod | grep kvm).&lt;br /&gt;
&lt;br /&gt;
VirtualBox non può convivere con KVM.&lt;br /&gt;
&lt;br /&gt;
===Macchine virtuali in rete===&lt;br /&gt;
&lt;br /&gt;
È possibile creare una propria macchina virtuale online usando le credenziali unibo [https://okeanos.grnet.gr/home/ okeanos grnet]&lt;br /&gt;
&lt;br /&gt;
Tip: '''molly-guard''' protects machines from accidental shutdowns/reboots (via ssh); è un software che se si tenta un reboot/poweroff chiede di digitare il nome della macchina, in questo modo si evita di spegnere una macchina virtuale non voluta tra le varie finestre aperte.&lt;br /&gt;
&lt;br /&gt;
== March 06 2018 ==&lt;br /&gt;
&lt;br /&gt;
[https://liveunibo-my.sharepoint.com/:u:/g/personal/francesco_fornari2_studio_unibo_it/EcBK9t59dgVEjB6Y-Lx2tAEBaQ2THtSBZZk9W7p9j5cVSQ?e=tHE25e Registrazione 06/03/2018]&lt;br /&gt;
&lt;br /&gt;
===I requisiti di virtualizzazione===&lt;br /&gt;
&lt;br /&gt;
[https://en.wikipedia.org/wiki/Popek_and_Goldberg_virtualization_requirements I requisiti di virtualizzazione di Popek e Goldberg] sono delle condizioni sufficienti per un'architettura per supportare la virtualizzazione (in modo efficiente):&lt;br /&gt;
&lt;br /&gt;
* '''Equivalenza / Fedeltà''' - Un programma virtualizzato dovrebbe esibire un comportamento essenzialmente identico a quello dimostrato quando viene eseguito su una macchina equivalente direttamente.&lt;br /&gt;
&lt;br /&gt;
* '''Controllo delle risorse / Sicurezza''' - L'hypervisor deve avere il completo controllo delle risorse virtualizzate.&lt;br /&gt;
&lt;br /&gt;
* '''Efficienza / Performance'''&lt;br /&gt;
&lt;br /&gt;
Davoli: &amp;quot;Il livello di sicurezza richiesto dipende dall'applicazione&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Popek e Goldberg descrivono anche le caratteristiche che l'ISA della macchina ospite deve possedere per essere in grado di far girare un hypervisor che goda dei tre requisiti precedenti.&lt;br /&gt;
&lt;br /&gt;
===Teoremi di virtualizzazione===&lt;br /&gt;
&lt;br /&gt;
Le istruzioni di un'ISA sono classificate in tre gruppi:&lt;br /&gt;
# '''Istruzioni privilegiate''' - le istruzioni che generano una trap se il processore è in '''user mode''' e non generano una trap se il processore è in '''kernel mode''' (e.g. divisione per zero, system call, accesso ad indirizzo di memoria non mappato).&lt;br /&gt;
# '''Istruzioni control sensitive''' - le istruzioni che cercano di cambiare la configurazione delle risorse del sistema (e.g. assegnare memoria, acquisire una risorsa).&lt;br /&gt;
# '''Istruzioni behavior sensitive''' - istruzioni che hanno comportamenti diversi a seconda della configurazione delle risorse (e.g. istruzioni che dipendono dal valore del registro di rilocazione o dalla modalità di esecuzione del processore).&lt;br /&gt;
&lt;br /&gt;
====Teorema relativo alle istruzioni privilegiate====&lt;br /&gt;
Si può creare una VM effettiva se e solo se le istruzioni privilegiate sono un sovrainsieme dell'unione delle istruzioni degli altri due tipi; in altre parole tutte le istruzioni &amp;quot;sensitive&amp;quot; generano una trap se eseguite in user mode.&lt;br /&gt;
&amp;lt;br&amp;gt;Le istruzioni '''sensitive''' sono quelle che possono influenzare il corretto funzionamento dell'hypervisor. Queste istruzioni devono essere tutte privilegiate.&lt;br /&gt;
&amp;lt;br&amp;gt;Le istruzioni '''control sensitive''' devono essere privilegiate perché il processo virtualizzato non deve essere in grado di allocare nuove risorse a sè stesso.&lt;br /&gt;
&amp;lt;br&amp;gt;Le istruzioni '''behavior sensitive''' devono essere privilegiate perché il processo virtualizzato deve vedere ...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
(IBM Introduce le maccine virtuali per introdurre sistemi operativi multitasking su macchine monotask)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;Negli anni 90 si producono processori senza considerare il teorema di Popek e Goldberg. L'ISA di questi processori non soddisfaceva le condizioni del teorema.&lt;br /&gt;
Vengono aggiunte istruzioni di virtualizzazione (da usare in ambienti virtuali) che non sono altro che le corrispettive istruzioni privilegiate delle istruzioni sensitive non privilegiate.&lt;br /&gt;
&lt;br /&gt;
(''Robert P. Goldberg: Architectural Principles for Virtual Computer Systems'')&lt;br /&gt;
&lt;br /&gt;
È difficile fare virtualizzazione tramite l'emulazione (problemi di efficienza).&lt;br /&gt;
&lt;br /&gt;
L''''emulazione''' consiste nell'emulare ogni singola funzione del sistema operativo e lo traduce per il livello sottostante.&lt;br /&gt;
&amp;lt;br&amp;gt;La '''simulazione''' consiste nel convertire il codice assembler per un certo processore in codice macchina del processore di base.&lt;br /&gt;
&amp;lt;br&amp;gt;Simulatore: apparenza (Simulatore di volo)&lt;br /&gt;
&amp;lt;br&amp;gt;Emulatore: funzione effettiva e veritiera al 100% ma per questa molto più lenta (Ali di cera del racconto greco)&lt;br /&gt;
&lt;br /&gt;
Qemu può funzionare in due modalità:&lt;br /&gt;
* Macchina virtuale: virtualità al livello di sistema (qemu-system-*).&lt;br /&gt;
* Virtualizzare solo il processore: tutte le system call sono gestite dal sistema operativo reale (qemu-*).&lt;br /&gt;
&lt;br /&gt;
Esperimento: Prendere busybox per architettura arm ed eseguirlo anche se siamo su un intel&lt;br /&gt;
&amp;lt;br&amp;gt;Busybox: eseguibile che fa da contenitore per molti comandi. Permette di risparmiare RAM e disco.&lt;br /&gt;
&amp;lt;br&amp;gt;Sistemi embedded: spesso fatti con kernel + busybox + applicazione per cui è nato il sistema.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[https://www.finnix.org/ARM Finnix arm]&lt;br /&gt;
Per far partire Finnix su Arm occorre prendere dall'immagine del file system dei file che servono all'esterno.&lt;br /&gt;
Per far partire un sistema occorre sicuramente il kernel e poi in molti casi (non tutti) il file system.&lt;br /&gt;
Il kernel viene caricato dal boot loader.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
qemu-system-arm -display none -machine vexpress-a9 -m 256 \&lt;br /&gt;
-kernel linux -initrd initrd.xz -dtb vexpress-v2p-ca9.dtb \&lt;br /&gt;
-append &amp;quot;console=ttyAMA0,115200&amp;quot; -serial stdio \&lt;br /&gt;
-drive file=finnix-armhf.iso,id=cd0,format=raw \&lt;br /&gt;
-device virtio-blk-device,drive=cd0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
kernel linux --&amp;gt; cerca nella directory corrente un file &amp;quot;linux&amp;quot; contenente il kernel&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''initrd''' è un file di configurazione che contiene i moduli kernel usato per l'inizializzazione.&lt;br /&gt;
&amp;lt;br&amp;gt;Perché nasce initrd?&lt;br /&gt;
&amp;lt;br&amp;gt;Il kernel quando fa boot ha bisogno dei driver per tutti i device che servono per caricare il kernel.&lt;br /&gt;
Se vogliamo progettare un kernel che possa fare boot da vari dischi inserire tutti i device driver di questi dischi all'interno del kernel non è una scelta saggia.&lt;br /&gt;
Possiamo studiare un modo per caricare solo i &amp;quot;moduli&amp;quot; che ci servono --&amp;gt; initrd&lt;br /&gt;
&lt;br /&gt;
Quando il kernel è partito possiamo caricare i moduli che ci servono.&lt;br /&gt;
initrd ha al suo interno un file system (banale, di sola lettura, ad allocazione contigua) che contiene un'altra copia dei moduli kernel (.ko).&lt;br /&gt;
&amp;lt;br&amp;gt;In questo modo si ha un piccolo spreco di memoria: i moduli compaiono sia in initrd che in /sys/. Ad oggi anche nei sistemi embedded si preferisce accettare questo piccolo spreco di memoria flash.&lt;br /&gt;
&lt;br /&gt;
'''DTB (Device Tree Binary)'''&lt;br /&gt;
Descrive la configurazione del '''sistem on chip''' alla partenza.&lt;br /&gt;
&amp;lt;br&amp;gt;'''sistem on chip''': integratore contenente processore ed altre cose. Lo stesso integrato può essere configurato per fare un sacco di cose diverse. Si possono scegliere le interfacce dei device da attivare.&lt;br /&gt;
&amp;lt;br&amp;gt;Quando il kernel parte, il kernel deve sapere quali device ha a disposizione, quindi la configurazione del sistem on chip va fatta prima che il kernel parta.&lt;br /&gt;
&amp;lt;br&amp;gt;Il vero file contenente le informazioni (in forma testuale) è il device tree, ma dato che queste informazioni devono essere usate in tempi rapidi al boot, questo file viene compilato e si ottiene il DTB.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Possiamo ottenere i tre file di cui abbiamo bisogno montando l'immagine ISO:&lt;br /&gt;
    mount -o ro finnix-armhf.iso /mnt&lt;br /&gt;
ed andando nella cartella /mnt/boot/armhf/ possiamo trovare i file copiarli e smontare l'immagine.&lt;br /&gt;
Possiamo far partire la macchina virtuale.&lt;br /&gt;
&lt;br /&gt;
===Paravirtualizzazione===&lt;br /&gt;
Il prefisso para significa simile, affine a.&lt;br /&gt;
&amp;lt;br&amp;gt;La paravirtualizzazione è un'ottimizzazione del processo di virtualizzazione perché non il processore non viene emulato.&lt;br /&gt;
&amp;lt;br&amp;gt;Il punto è che l'implementazione di una virtualizzazione completa talvolta non è efficiente.&lt;br /&gt;
E.g. Algoritmi di minimizzazione delle seek su dischi virtuali sono inutili.&lt;br /&gt;
&lt;br /&gt;
Il kernel del guest deve essere informato di stare girando su un device virtuale, questo viola i principi di Popek e Goldber.&lt;br /&gt;
&lt;br /&gt;
===Meglio emulare perfettamente i sistemi reali o fare device ottimizzati per il mondo virtuale?===&lt;br /&gt;
Dipende.&lt;br /&gt;
&amp;lt;br&amp;gt;'''La virtualizzazione si può realizzare su vari livelli ed in varie modalità'''&lt;br /&gt;
Uno dei modi è quello di catturare le system call ('''system call interposition''') o quello di catturare le chiamate ad una libreria.&lt;br /&gt;
&lt;br /&gt;
====Catturare le system call====&lt;br /&gt;
'''ptrace''' è una system call che si può usare per virtualizzare le system call.&lt;br /&gt;
&lt;br /&gt;
====Catturare le chiamate a libreria====&lt;br /&gt;
Funziona con le librerie dinamiche. Le librerie dinamiche sono linkate all'eseguibile solamente in fase di esecuzione.&lt;br /&gt;
Un eseguibile non contiene le librerie, ma solamente le dipendenze alle librerie.&lt;br /&gt;
Per vedere quali sono si può usare il comando ''ldd executablename''.&lt;br /&gt;
&lt;br /&gt;
Esempio:&lt;br /&gt;
&amp;lt;br&amp;gt;La system call open non è altro che una funzione che solleva una trap tramite il comando syscall.&lt;br /&gt;
Potremmo trovare un modo per sovrascrivere la open della libreria standard (libc) in modo che la nuova open sia chiamata al posto dell'altra.&lt;br /&gt;
&lt;br /&gt;
'''purelibc''' è una libreria che prende gran parte delle system call e le ridefinisce.&lt;br /&gt;
&lt;br /&gt;
===Autovirtualizzazione===&lt;br /&gt;
Il processo stesso virtualizza le sue chiamate.&lt;br /&gt;
L'hypervisor è una libreria.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Sicuro NO, utile SI&amp;lt;/u&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
In ViewOS questo meccanismo viene usato in varie occasioni.&lt;br /&gt;
Permette di utilizzare le librerie oltre il loro scopo originale; e.g. se abbiamo una libreria che agisce su dei file e siamo interessati esclusivamente alla logica possiamo fare in modo che le system call relative ai file siano virtualizzate&lt;br /&gt;
in modo tale da fornire i dati in altro modo.&lt;br /&gt;
&lt;br /&gt;
Libreria --&amp;gt; purelibc&lt;br /&gt;
purelibc libreria di autovirtualizzazione&lt;br /&gt;
&lt;br /&gt;
UserModeLinux e ViewOS virtualizzano entrambi tramite system call interposition.&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;u&amp;gt;User mode linux virtualizza tutte le chiamate, ViewOS no.&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Namespaces''': implementano la virtualizzazione parziale (come ViewOS) ma all'interno del kernel. Sono più efficienti ma complicano il kernel.&lt;br /&gt;
&lt;br /&gt;
====Xen====&lt;br /&gt;
L'idea su cui Xen si basa è quella di fondere insieme kernel ed hypervisor.&lt;br /&gt;
&amp;lt;br&amp;gt;Siccome scrivere un intero kernel sarebbe un compito troppo impegnativo, Xen si ispira all'architettura a microkernel.&lt;br /&gt;
Xen implementa uno strato, che si trova direttamente sull'hardware, che usa paravirtualizzazione e che contiene solo le funzioni necessarie a gestire le macchine virtuali.&lt;br /&gt;
&lt;br /&gt;
In Xen &amp;lt;u&amp;gt;&amp;quot;tutte le macchine sono uguali, ma una è più uguale delle altre&amp;quot;&amp;lt;/u&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Di per sè Xen non supporta direttamente l'hardware della macchina reale, infatti non contiene i device driver, ma sfrutta quelli della prima macchina virtuale (domain0).&lt;br /&gt;
Se non configurato diversamente tutti i device vengono gestiti dal domain0. Tutto ciò che arriva dall'hardware viene inoltrato al domain0. Domain0 vede quindi device virtuali che sono rappresentazioni esatte dei device fisici.&lt;br /&gt;
&lt;br /&gt;
KVM ha dimostrato di avere ormai le stesse prestazioni di Xen. Quindi potrebbe essere una buona idea quella di usare un Linux minimale con KVM al posto di Xen.&lt;br /&gt;
&lt;br /&gt;
== March 08 2018 ==&lt;br /&gt;
[https://liveunibo-my.sharepoint.com/:u:/g/personal/francesco_fornari2_studio_unibo_it/EQq0OH4TShpFpQB01x-TmAgB111c9tPOwkxV_BdP9swVJw?e=AbDxex Registrazione 08/03/18]&lt;br /&gt;
&lt;br /&gt;
'''ptrace''' è una system call che permette ad un processo di controllare un altro processo.&lt;br /&gt;
Inizialmente si usavano i segnali stop and continue.&lt;br /&gt;
Nelle prime versioni era proibito usare i segnali stop e continue se il processo era tracciato.&lt;br /&gt;
Nelle ultime versioni c'è un nuovo modo di collegarsi ad un processo: PTRACE_SEIZE.&lt;br /&gt;
&lt;br /&gt;
(VUos usa virtualizzazione parziale)&lt;br /&gt;
&lt;br /&gt;
'''3 tipologie di viste per un unico sistema'''&lt;br /&gt;
&lt;br /&gt;
===Nei panni degli utenti===&lt;br /&gt;
L'idea di VUos è di fornire ad un processo un ambiente diverso;&lt;br /&gt;
VUos usa il concetto di modulo (come nel kernel) ovvero abilita delle funzionalità;&lt;br /&gt;
abbiamo moduli e sottomoduli (usati per specifiche implementazioni delle funzionalità dei moduli):&lt;br /&gt;
http://wiki.v2.cs.unibo.it/wiki/index.php?title=Main_Page&lt;br /&gt;
&lt;br /&gt;
'''Moduli''':&lt;br /&gt;
* '''UM-Fuse''' (versione vecchia) --&amp;gt; '''VUfuse''' (versione nuova) modulo per la virtualizzare file system.&lt;br /&gt;
: Compatibile con Fuse; modulo del kernel di Linux con lo stesso scopo.&lt;br /&gt;
: Fuse si trova nel kernel, i sottomoduli no.&lt;br /&gt;
: Se si compilano gli stessi sorgenti per Fuse linkando la libreria di UM-Fuse lo stesso sorgente funziona con UM Fuse.&lt;br /&gt;
: (Tip: meglio non riscoprire l'acqua calda ed uniformare le interfacce ed usarlo)&lt;br /&gt;
: Sottomoduli:&lt;br /&gt;
:* &amp;lt;u&amp;gt;umfuseext2&amp;lt;/u&amp;gt; (fuseext2) (monta anche ext3 ed ext4)&lt;br /&gt;
:* &amp;lt;u&amp;gt;umfusefat&amp;lt;/u&amp;gt; (libfat)&lt;br /&gt;
:* &amp;lt;u&amp;gt;umfuseiso&amp;lt;/u&amp;gt;&lt;br /&gt;
:* &amp;lt;u&amp;gt;umfusessh&amp;lt;/u&amp;gt;&lt;br /&gt;
:* &amp;lt;u&amp;gt;umfusecrypt&amp;lt;/u&amp;gt;&lt;br /&gt;
* '''UM Net''' --&amp;gt; '''VUnet'''&lt;br /&gt;
: Consente di avere una visione virtualizzata della rete.&lt;br /&gt;
: Sottomoduli:&lt;br /&gt;
:* &amp;lt;u&amp;gt;umnetlwipv6&amp;lt;/u&amp;gt; (lwipv6)&lt;br /&gt;
* '''UM Dev'''&lt;br /&gt;
: Sottomoduli:&lt;br /&gt;
:* &amp;lt;u&amp;gt;umdevmbr&amp;lt;/u&amp;gt; - Master Boot Record&lt;br /&gt;
&lt;br /&gt;
Esempio UM Dev:&lt;br /&gt;
&lt;br /&gt;
Possiamo montare l'immagine di un disco con UM Dev e montare la prima partizione con umfuseext2 (se la partizione è ext2).&lt;br /&gt;
&amp;lt;br&amp;gt;Immagine di un disco = tabella partizioni (MBR o GPT) + partizioni (file system all'interno delle partizioni).&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;mount&amp;lt;/code&amp;gt; ed il file system sono i punti cardine dell'architettura Unix; Unix da nome alle cose tramite il file system.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Esempio fatto dal prof:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
 truncate -s 1G mydisk    # creiamo l'immagine del disco&lt;br /&gt;
 umview xterm		  # facciamo partire la macchina virtuale parziale su un terminale xterm&lt;br /&gt;
&lt;br /&gt;
#nel terminale xterm&lt;br /&gt;
&lt;br /&gt;
 um_add_service umdev umfuse    # aggiungiamo i moduli&lt;br /&gt;
&lt;br /&gt;
 ls /dev/hda&lt;br /&gt;
&lt;br /&gt;
 mount -t umdevmbr mydisk /dev/hda    # umdevmbr è il tipo di montaggio&lt;br /&gt;
&lt;br /&gt;
#Il disco montato sarà visibile solamente nel terminale della macchina virtuale (e nei suoi figli).&lt;br /&gt;
#ViewOS si accerta che esista un modulo che faccia match con la prima parte del nome (umdev) e dà la chiamata in gestione al modulo.&lt;br /&gt;
#A quel punto la libreria (umdevmbr.so) viene caricata in memoria.&lt;br /&gt;
&lt;br /&gt;
 locate umdevmbr.so&lt;br /&gt;
 ls -l /dev/hda    # verifichiamo il montaggio&lt;br /&gt;
&lt;br /&gt;
 /sbin/fdisk /dev/hda    # creaiamo la tabella delle partizioni come in un disco reale&lt;br /&gt;
&lt;br /&gt;
# Il file mydisk è l'immagine di un disco in formato raw.&lt;br /&gt;
# Se facessimo cat di mydisk e ridirezionassimo l'output in un disco da 1G, l'hard disk si partizionerebbe e conterrebbe esattamente il contenuto del file.&lt;br /&gt;
# in alternativa a cat si usa dd perchè è ottimizzato per file di grandi dimensioni (usa grandi cache)&lt;br /&gt;
&lt;br /&gt;
 ls /dev/hda1&lt;br /&gt;
&lt;br /&gt;
 /sbin/mkfs.ext2 /dev/hda1	# make file system ext 2&lt;br /&gt;
 /sbin/fsck.ext2 -f /dev/hda1	# file system check &lt;br /&gt;
&lt;br /&gt;
 ls /mnt&lt;br /&gt;
&lt;br /&gt;
 mount -o rw+ -t umfuseext2 /dev/hda1 /mnt    # montiamo il disco ('''nidifichiamo la virtualizzazione''')&lt;br /&gt;
&lt;br /&gt;
# ora tutte le chiamate verso /mnt saranno catturate e virtualizzate&lt;br /&gt;
&lt;br /&gt;
 ls /mnt    # dovrebbe comparire solo lost+found&lt;br /&gt;
&lt;br /&gt;
# echo &amp;quot;ciao&amp;quot; &amp;gt; /mnt/ciao&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Nidificazione della virtualizzazione====&lt;br /&gt;
Se creiamo un file il nostro processo fa una &amp;lt;code&amp;gt;open&amp;lt;/code&amp;gt; al pathname: la system call viene intercettata da ViewOS in quanto stiamo accedendo ad un path virtualizzato.&lt;br /&gt;
L'hypervisor si accorgerà che il file system è virtualizzato da &amp;lt;code&amp;gt;umfuseext2&amp;lt;/code&amp;gt;, che sa come fare la open sul file system virtuale (generando una &amp;lt;code&amp;gt;write&amp;lt;/code&amp;gt; ad un certo offset nell'immagine della partizione).&lt;br /&gt;
Anche la partizione però è virtualizzata: la chiamata dovrà essere intercettata dal modulo &amp;lt;code&amp;gt;umdevmbr&amp;lt;/code&amp;gt; (che virtualizza le partizioni); questa chiamata tuttavia è generata dall'hypervisor.&lt;br /&gt;
&amp;lt;br&amp;gt;Com'è possibile che l'hypervisor catturi la sua stessa chiamata e la virtualizzi nuovamente? --&amp;gt; '''purelibc'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;/etc/fstab&amp;lt;/code&amp;gt; contiene la tabella dei filesystem&lt;br /&gt;
&lt;br /&gt;
Un file system non deve essere mai montato da più macchine; vale anche per i file dei filesystem virtuali.&lt;br /&gt;
&amp;lt;br&amp;gt;Tramite i comandi standard siamo in grado, con i permessi di utente, di fare operazioni che potrebbero essere svolte solo da root.&lt;br /&gt;
&amp;lt;br&amp;gt;Queste operazioni si potrebbero fare anche senza virtualizzazione, ma servirebbero i permessi di amministratore e avremmo molti limiti.&lt;br /&gt;
&lt;br /&gt;
'''loop device''' dispositivo a blocchi asssociato dinamicamente ad un file e che serve per vedere il file come una memoria di massa.&lt;br /&gt;
&lt;br /&gt;
====ViewFS====&lt;br /&gt;
[http://wiki.v2.cs.unibo.it/wiki/index.php?title=ViewFS ViewFS] è un modulo che virtualizza la struttura dei file system.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
um_add_service viewfs&lt;br /&gt;
mkdir /tmp/newroot&lt;br /&gt;
viewsu&lt;br /&gt;
mount -t viewfs -o mincow,except=/tmp,vstat /tmp/newroot /&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;mincow&amp;lt;/code&amp;gt; ed &amp;lt;code&amp;gt;except&amp;lt;/code&amp;gt; sono opzioni di ViewFS&lt;br /&gt;
&lt;br /&gt;
=====COW=====&lt;br /&gt;
'''COW (Copy On Write)''': Si accede un file in sola lettura ed ogni volta che lo si modifica ne si fa una copia.&lt;br /&gt;
I risultati saranno visibili solamente a noi.&lt;br /&gt;
&amp;lt;br&amp;gt;'''mincow''': ogni volta il sistema proverà ad accedere in scrittura al file e se non ce la fa lo farà in modalità '''cow'''.&lt;br /&gt;
&lt;br /&gt;
Si possono installare pacchetti debian virtualmente usando metodo copy on write (possiamo testare l'installazione di nuovi pacchetti).&lt;br /&gt;
&lt;br /&gt;
=====qcow=====&lt;br /&gt;
Formato usato da qemu per le immagini dei dischi. Usa COW al livello dei blocchi di disco.&lt;br /&gt;
&lt;br /&gt;
Se si modifica il file originale del cow si possono attuare varie politiche.&lt;br /&gt;
Qemu non dà alcuna garanzia.&lt;br /&gt;
ViewOS non permette la modifica.&lt;br /&gt;
&lt;br /&gt;
umview è disponibile nei repository di debian o (aggiornato) su SourceForce.&lt;br /&gt;
&lt;br /&gt;
=====unreal=====&lt;br /&gt;
Modulo di test: fa vedere l'intero file system come se fosse in &amp;lt;code&amp;gt;/unreal&amp;lt;/code&amp;gt; ed anche dentro &amp;lt;code&amp;gt;/unreal/unreal&amp;lt;/code&amp;gt;.&lt;br /&gt;
Si possono fare vari esperimenti, e.g. andare dentro &amp;lt;code&amp;gt;/unreal&amp;lt;/code&amp;gt; e lanciare comandi come &amp;lt;code&amp;gt;make&amp;lt;/code&amp;gt;.&lt;br /&gt;
Se &amp;lt;code&amp;gt;make&amp;lt;/code&amp;gt; si comporta nello stesso modo la virtualizzazione sta funzionando.&lt;br /&gt;
&lt;br /&gt;
Tip: principio chiave del debugging - separare le responsabilità.&lt;br /&gt;
&lt;br /&gt;
'''umview --&amp;gt; umvu'''&lt;br /&gt;
&lt;br /&gt;
'''umbinfmt'''&lt;br /&gt;
&lt;br /&gt;
=====KMVIEW=====&lt;br /&gt;
Fratello di '''UMVIEW'''.&lt;br /&gt;
Molto veloce perché usava un modulo kernel sperimentale che però non entrerà a far parte nel kernel.&lt;br /&gt;
Permetteva, al livello del kernel, di distinguere i file descriptor reali da quelli virtuali.&lt;br /&gt;
La virtualizzazione costava solo 4%.&lt;br /&gt;
&lt;br /&gt;
====Berkeley socket====&lt;br /&gt;
L'interfaccia '''Berkeley socket''' deve essere aggiornata nei tempi in quanto possiede intrinsecamente l'idea di view globale (global view assuption).&lt;br /&gt;
&amp;lt;br&amp;gt;I parametri della chiamata socket sono tre: &lt;br /&gt;
* famiglia (domain, ipv4)&lt;br /&gt;
* servizio (type)&lt;br /&gt;
* protocollo&lt;br /&gt;
&lt;br /&gt;
Se vogliamo un socket AF_INET (ipv4), di tipo SOCK_STREAM, con protocollo di 0 (di default, TCP) non abbiamo modo di scegliere lo stack di rete.&lt;br /&gt;
&amp;lt;br&amp;gt;Se potessimo avere a disposizione d'uso diversi stack di protocolli di rete potremmo avere nuovi tipi di applicazioni ed avere soluzioni più semplici a problemi noti.&lt;br /&gt;
&lt;br /&gt;
In virtual square l'API dei Berkeley sockets è stata estesa con un API chiamata '''msockets''':&lt;br /&gt;
- permette l'utilizzo di più stack di rete allo stesso tempo.&lt;br /&gt;
- il file system viene usato per dare nome agli stack di rete (molto Unix consistent).&lt;br /&gt;
- è compatibile con il passato.&lt;br /&gt;
&lt;br /&gt;
Gli stack di rete appaiono quindi nel file system come file speciali.&lt;br /&gt;
Si può fare mount dello stack.&lt;br /&gt;
Vedere libro di Virtual square per maggiori informazioni.&lt;br /&gt;
&lt;br /&gt;
=====umattach=====&lt;br /&gt;
Si può virtualizzare qualche processo che sta già eseguendo.&lt;br /&gt;
Se la view di un processo cambia improvvisamente potrebbero generarsi delle incoerenze.&lt;br /&gt;
&lt;br /&gt;
===Nei panni degli sviluppatori===&lt;br /&gt;
&lt;br /&gt;
====purelibc====&lt;br /&gt;
[http://wiki.virtualsquare.org/wiki/index.php/PureLibc purelibc] è una libreria che a differenza di '''libc''' prevede l'esclusione delle systemcall in modo da lasciare la libertà di usare le systemcall che si preferisce.&lt;br /&gt;
&lt;br /&gt;
libc = libreria c + libreria di system call (la libc è una libreria c ibrida)&lt;br /&gt;
&lt;br /&gt;
Una vera libreria c quando avviene una printf deve svolgere i calcoli e chiamare la write.&lt;br /&gt;
Non possiamo usare la libc ridefinendo le system call perché quando la printf chiama la write essendo una libreria unica il linker ha già risolto la chiamata.&lt;br /&gt;
Per fare ciò abbiamo bisogno di una libreria pura, che non implementi le system call al suo interno.&lt;br /&gt;
&amp;lt;u&amp;gt;L'hypervisor di ViewOS usa purelibc&amp;lt;/u&amp;gt;.&lt;br /&gt;
Attualmente la purelibc è complessa ed usa il meccanismo del &amp;lt;u&amp;gt;dynamic linker preload&amp;lt;/u&amp;gt; per virtualizzare (vedere la documentazione di purelibc).&lt;br /&gt;
&lt;br /&gt;
La purelibc al momento è implementata come layer al di sopra della libc. Questo è scomodo.&lt;br /&gt;
Se qualche system call fosse aggiunta dovremmo aggiungerne un'altra anche in purelibc.&lt;br /&gt;
&lt;br /&gt;
'''execs --&amp;gt; progetto praticamente concluso'''&lt;br /&gt;
&lt;br /&gt;
====cado====&lt;br /&gt;
cado: sudo con le '''capability''' (privilegio).&lt;br /&gt;
&amp;lt;br&amp;gt;Le capability permettono di separare le prerogative di root e di poterle assegnare in maniera separata, possono essere assegnate a processi o a file.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;man capabilities&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Un processo può avere 4 classi di capability. Le possiamo vedere in &amp;lt;code&amp;gt;/proc/id_processo/status&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;cat /proc/$$/status&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=====Capabilities=====&lt;br /&gt;
* &amp;lt;u&amp;gt;Permitted&amp;lt;/u&amp;gt; - che possono essere attivate dal thread.&lt;br /&gt;
* &amp;lt;u&amp;gt;Inheritable&amp;lt;/u&amp;gt; - che possono essere ereditate.&lt;br /&gt;
* &amp;lt;u&amp;gt;Effective&amp;lt;/u&amp;gt; - attive. Sono sempre un sottoinsieme dei permitted.&lt;br /&gt;
* &amp;lt;u&amp;gt;Ambient&amp;lt;/u&amp;gt; - sono mantenute a patto che il file non sia privilegiato.&lt;br /&gt;
&lt;br /&gt;
'''Bound''' - maschera non modificabile che indica quali capabilities il sistema è in grado di gestire.&lt;br /&gt;
&lt;br /&gt;
=====Capabilities dei file=====&lt;br /&gt;
&lt;br /&gt;
'''Capabilities ambient''': sono mantenute a patto che il file non sia privilegiato.&lt;br /&gt;
Se si ha una capability ambient essa è considerata come permitted e come effective.&lt;br /&gt;
&lt;br /&gt;
Come cambiano le capabilities quando si chiama una exec?&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;/etc/sudoers&amp;lt;/code&amp;gt; --&amp;gt; file di configurazione di sudo (anche cado ha un file di configurazione)&lt;br /&gt;
&lt;br /&gt;
====namespace====&lt;br /&gt;
Si possono dare ai processi visioni diverse sulle risorse.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;man namespaces&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Rete, IPC, PID.&lt;br /&gt;
&amp;lt;br&amp;gt;I namespaces sono stati implementati male: funzionano ma sono molto pesanti da utilizzare e vengono usati dai processi senza che l'utente non ne abbia visibilità ( Chromium per creare dei sandbox usa i namespaces ).&lt;br /&gt;
&lt;br /&gt;
I namespace si possono creare in 3 modi diversi:&lt;br /&gt;
* &amp;lt;u&amp;gt;clone&amp;lt;/u&amp;gt;: crea un nuovo processo con namespace associato.&lt;br /&gt;
* &amp;lt;u&amp;gt;setns&amp;lt;/u&amp;gt;: permette ad un processo di unirsi ad un namespace esistente.&lt;br /&gt;
* &amp;lt;u&amp;gt;unshare&amp;lt;/u&amp;gt;: il processo chiamante si collega ad un namespace nuovo.&lt;br /&gt;
&lt;br /&gt;
===Nei panni degli sviluppatori core===&lt;br /&gt;
&lt;br /&gt;
== March 13 2018 ==&lt;br /&gt;
[https://etherpad.wikimedia.org/p/qKAqRNgtxt Etherpad 13/03/18]&lt;br /&gt;
&lt;br /&gt;
[https://liveunibo-my.sharepoint.com/:u:/g/personal/francesco_fornari2_studio_unibo_it/Ed7XFMhWD9tEjVhCAVij9PQB66auNxzCMUG53Xl9veDlkw?e=JHtQN1 Registrazione 13/03/18]&lt;br /&gt;
&lt;br /&gt;
Quando si trasmette una lista di interfacce in protocollo &amp;lt;code&amp;gt;netlink&amp;lt;/code&amp;gt; prevede il pacchetto &amp;quot;''done''&amp;quot; come sentinella finale. In alternativa si può usare &amp;lt;code&amp;gt;busybox ip addr&amp;lt;/code&amp;gt; in quanto &amp;lt;code&amp;gt;ip addr&amp;lt;/code&amp;gt; di busybox non fa nessun controllo sul pacchetto ''done''.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
#Facciamo partire una macchina virtuale in un terminale.&lt;br /&gt;
umview xterm&lt;br /&gt;
#Vediamo le vere interfacce di rete.&lt;br /&gt;
ip addr&lt;br /&gt;
#Carichiamo il supporto per le reti virtuali.&lt;br /&gt;
um_add_service umnet&lt;br /&gt;
&lt;br /&gt;
#vde vuole indirizzi simili agli url.&lt;br /&gt;
#???????? vedere meglio nella documentazione ???????????????&lt;br /&gt;
&lt;br /&gt;
mount -t umnetlwipv6 -o vde0=vxvde:// none /dev/net/mynet&lt;br /&gt;
#Osserviamo di nuovo le interfacce di rete.&lt;br /&gt;
ip link&lt;br /&gt;
&lt;br /&gt;
#Vediamo le interfacce precedenti in quanto la nuova rete non è montata come rete di default.&lt;br /&gt;
#Possiamo avere tanti stack diversi ognuno con le sue interfacce.&lt;br /&gt;
&lt;br /&gt;
#mstack --&amp;gt; multiple stack; comando di umview usare lo stack selezionato.&lt;br /&gt;
mstack /dev/net/mynet ip link&lt;br /&gt;
#Se volessi far partire un browser su quello stack dovrei fare&lt;br /&gt;
mstack /dev/net/mynet firefox&lt;br /&gt;
#Se volessi far partire una connessione ssh&lt;br /&gt;
mstack /dev/net/mynet ssh&lt;br /&gt;
#Se volessimo avviare un terminale che vive nella rete nuova potremmo fare&lt;br /&gt;
mstack /dev/net/mynet bash&lt;br /&gt;
&lt;br /&gt;
ip addr add 10.0.0.1/24 dev vd0&lt;br /&gt;
ip link set vd0 up&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se adesso su un'altra macchina della rete locale facessi le stesse operazioni con un indirizzo ip diverso, le macchine avrebbero la possibilità di mettersi in contatto.&lt;br /&gt;
&lt;br /&gt;
Per completezza dell'esempio realizziamo l'altro stack con vdens (namespace di vde).&lt;br /&gt;
&lt;br /&gt;
Parte dell'esempio fatto dal prof; qui viene usato in entrambi i terminali '''vdens''', mentre il prof a lezione ha usato per uno '''umnet''' e '''vdens''' per l'altro.&lt;br /&gt;
Sono necessari '''[https://github.com/rd235/vdens vdens]''' ,'''[https://github.com/rd235/vdeplug4 vdeplug4]''' ( e forse anche '''[https://github.com/rd235/vxvdex vxvdex]''').&lt;br /&gt;
&lt;br /&gt;
Per entrambe le sessioni del terminale setto una variabile d'ambiente in modo che mi cerchi la ''libvdeplug.so.4'' in ''/usr/local/lib''.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
 export LD_LIBRARY_PATH=/lib:/usr/lib:/usr/local/lib&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Terminale 1&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
 vdens vxvde://&lt;br /&gt;
 ip link set vde0 up&lt;br /&gt;
 ip addr add 10.0.0.1/24 dev vde0&lt;br /&gt;
 &lt;br /&gt;
 ping 10.0.0.2&lt;br /&gt;
&lt;br /&gt;
 nc 10.0.0.2 2222&lt;br /&gt;
&lt;br /&gt;
#scrivendo dei messaggi nel terminale 1 compariranno nel 2 e viceversa &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Terminale 2&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
 vdens vxvde://&lt;br /&gt;
 ip link set vde0 up&lt;br /&gt;
 ip addr add 10.0.0.1/24 dev vde0&lt;br /&gt;
&lt;br /&gt;
#ora nel terminale 1 posso eseguire ping 10.0.0.2&lt;br /&gt;
&lt;br /&gt;
 nc -l 2222&lt;br /&gt;
#ora nel terminale 1 posso eseguire  nc 10.0.0.2 2222&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Stack TCP/IP''': o implementato a livello utente come libreria o implementato nel kernel.&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;umview&amp;lt;/code&amp;gt; --&amp;gt; prima opzione.&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;vdens&amp;lt;/code&amp;gt; --&amp;gt; chiede al kernel di costruire un altro stack TCP/IP per questo utente (sfrutta i namespace).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;nc&amp;lt;/code&amp;gt; (alias &amp;lt;code&amp;gt;netcat&amp;lt;/code&amp;gt;) coltellino svizzero per esperimenti su rete.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
#Connessione TCP alla porta 22 di maddalena&lt;br /&gt;
nc mad.cs.unibo.it 22&lt;br /&gt;
#Connessione alla porta 80 &lt;br /&gt;
nc 130.136.1.110 80&lt;br /&gt;
nc permette di collegarsi tramite TCP e di scrivere HTTP manualmente&lt;br /&gt;
&lt;br /&gt;
#Faccio un server TCP in ascolto su porta 2222&lt;br /&gt;
nc -l 2222&lt;br /&gt;
#Mi connetto alla porta 2222 dell'indirizzo 10.0.0.2&lt;br /&gt;
nc 10.0.0.2 2222&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Un utente può creare tutti gli stack di rete che vuole ed averne vari a disposizione con configurazioni diverse.&lt;br /&gt;
&amp;lt;br&amp;gt;Esempio: possiamo lanciare un browser facendo in modo che il browser non sia logicamente dove siamo ma usi un ip di un'altra area geografica.&lt;br /&gt;
* Così facendo inganneremmo where si my ip&lt;br /&gt;
* Comodo per testare la neutralità della rete. Stessa pagina acceduta con ip di aree geografiche diverse appare nello stesso modo.&lt;br /&gt;
&lt;br /&gt;
Se volessimo implementare un VPN per sicurezza aziendale normalmente dovremmo spostare tutta la macchina dentro il VPN, con questo metodo possiamo avere un solo stack connesso al VPN.&lt;br /&gt;
&lt;br /&gt;
I supporti di rete, file system e device, portandoli fuori dal kernel in user mode ricordano il concetto di microkernel.&lt;br /&gt;
&amp;lt;br&amp;gt;ViewOS serve anche per poter fare una transizione dolce dai kernel monolitici ai microkernel; è come avere un microkernel configurabile a runtime.&lt;br /&gt;
* Possiamo decidere di tenere parti del kernel (moduli) in spazio utente tramite moduli di ViewOS. è meno efficiente ma più sicuro e si usa solo all'occorrenza.&lt;br /&gt;
* Se dovessimo gestire un tipo di file system appena inventato (di cui non abbiamo il supporto nel kernel) per inserire il supporto del kernel dovremmo ricompilare tutto; Se usiamo un modulo a livello utente no.&lt;br /&gt;
&lt;br /&gt;
ViewOS è una specifica; per ora è stato implementato tramite '''system call interposition (ptrace)''', ma può essere implementato in altri modi.&lt;br /&gt;
&lt;br /&gt;
Potremmo implementare il tutto attraverso i '''namespace''', nel kernel (e.g. vdens). Creare diversi visioni dell'ambiente.&lt;br /&gt;
&lt;br /&gt;
== March 15 2018 ==&lt;br /&gt;
&lt;br /&gt;
Lezione sospesa causa lauree.&lt;br /&gt;
&lt;br /&gt;
== March 20 2018 ==&lt;br /&gt;
[https://etherpad.wikimedia.org/p/A4ZfDg1rtY Etherpad 20/03/18]&lt;br /&gt;
&lt;br /&gt;
[https://liveunibo-my.sharepoint.com/:u:/g/personal/francesco_fornari2_studio_unibo_it/Ea2A7wOIwqRJvvLoF7ekvr8BdBWJmjjz_fBx1zB5rr__2w?e=jxfToF Registrazione 20/03/18]&lt;br /&gt;
&lt;br /&gt;
== March 22 2018 ==&lt;br /&gt;
[https://etherpad.wikimedia.org/p/ya2BWaXTbl Etherpad 22/03/18]&lt;br /&gt;
&lt;br /&gt;
[https://liveunibo-my.sharepoint.com/:u:/g/personal/francesco_fornari2_studio_unibo_it/EZ8AcVfOagpBnYHAN3EYcv0BpHlqcH0Lg-8l3sQb6_Drsg?e=7suh7a Registrazione 22/03/18]&lt;br /&gt;
&lt;br /&gt;
== March 27 2018 ==&lt;br /&gt;
[https://etherpad.wikimedia.org/p/GaJNvPo1wK Etherpad 27/03/18]&lt;br /&gt;
&lt;br /&gt;
[https://liveunibo-my.sharepoint.com/:u:/g/personal/francesco_fornari2_studio_unibo_it/EYZUi8icxIpIhMrV_ZvwspIB5kCqMzEbL8plvCzZD8-BIA?e=VhO56l Registrazione 27/03/18 pt1]&lt;br /&gt;
[https://liveunibo-my.sharepoint.com/:u:/g/personal/francesco_fornari2_studio_unibo_it/EWPHKBP4cqNEomwP7MQiodgBxbUQbwAYLA9f5gu14OFg-A?e=7sA6NE pt2]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Esempio su veth&lt;br /&gt;
&lt;br /&gt;
Terminale 1&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
 sudo bash&lt;br /&gt;
&lt;br /&gt;
 ip link add type veth&lt;br /&gt;
 ip link&lt;br /&gt;
&lt;br /&gt;
# solo per avere una panoramica del comando&lt;br /&gt;
 ip netns help &lt;br /&gt;
&lt;br /&gt;
 ip netns add renzonet&lt;br /&gt;
 ip netns list&lt;br /&gt;
&lt;br /&gt;
#trasferiamo veth1 nel namespace appena creato renzonet&lt;br /&gt;
 ip link set veth1 netns renzonet&lt;br /&gt;
 ip netns exec renzonet ip addr&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 ip addr add 10.1.1.1/24 dev veth0&lt;br /&gt;
 ip link set veth0 up&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Terminale 2&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 sudo bash&lt;br /&gt;
&lt;br /&gt;
 ip netns exec renzonet bash&lt;br /&gt;
 ip addr add 10.1.1.2/24 dev veth1&lt;br /&gt;
 ip link set veth1 up&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 ping 10.1.1.1 &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# per riportare le cose allo stato precedente&lt;br /&gt;
#il comando si prende la libertà di eliminare anche veth0 e veth1 create con 'ip link add type veth'&lt;br /&gt;
 ip netns delete renzonet&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== April 05 2018 ==&lt;br /&gt;
== April 10 2018 ==&lt;br /&gt;
== April 12 2018 ==&lt;br /&gt;
== April 17 2018 ==&lt;br /&gt;
== April 19 2018 ==&lt;br /&gt;
== April 24 2018 ==&lt;br /&gt;
== April 27 2018 ==&lt;br /&gt;
== May 03 2018 ==&lt;br /&gt;
== May 08 2018 ==&lt;br /&gt;
== May 10 2018 ==&lt;br /&gt;
== May 15 2018 ==&lt;br /&gt;
== May 17 2018 ==&lt;br /&gt;
== May 22 2018 ==&lt;br /&gt;
== May 24 2018 ==&lt;/div&gt;</summary>
		<author><name>Leonardo</name></author>
	</entry>
	<entry>
		<id>https://vsd.v2.cs.unibo.it/wiki/index.php?title=2018_Spring_Term&amp;diff=82</id>
		<title>2018 Spring Term</title>
		<link rel="alternate" type="text/html" href="https://vsd.v2.cs.unibo.it/wiki/index.php?title=2018_Spring_Term&amp;diff=82"/>
		<updated>2018-03-27T16:45:28Z</updated>

		<summary type="html">&lt;p&gt;Leonardo: /* March 27 2018 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== February 27 2018 ==&lt;br /&gt;
&lt;br /&gt;
===Virtualità===&lt;br /&gt;
&lt;br /&gt;
Virtualizzare qualcosa significa fornire un oggetto che possa essere usato (stessa interfaccia) efficacemente al posto dell'altro.&lt;br /&gt;
Se si usa una scarpa per piantare un chiodo, la scarpa è un &amp;quot;martello virtuale&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
====Memoria virtuale====&lt;br /&gt;
*Interfaccia della memoria principale: load(indirizzo), store(indirizzo, oggetto).&lt;br /&gt;
*Semantica: se eseguo store(i, a) seguito da load(i), la seconda operazione ritornerà a.&lt;br /&gt;
La memoria secondaria può essere usata per implementare l'interfaccia di quella primaria.&lt;br /&gt;
Anche l'hardware di un calcolatore può essere visto come un'entità astratta che parla il linguaggio ISA del processore di cui fa uso.&lt;br /&gt;
Se virtualizziamo l'hardware tramite un programma che ne implementa la stessa interfaccia otteniamo una macchina virtuale.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Possibilità di virtualizzare il tempo.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Significato di '''virtualsquare'''&lt;br /&gt;
&lt;br /&gt;
Una piazza dove i vari tipi di virtualià coesistono, un laboratorio internazionale sulla virtualità.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Concetto di VIEW====&lt;br /&gt;
&lt;br /&gt;
I processi &amp;quot;vedono&amp;quot; l'ambiente di esecuzione. Se non stanno eseguendo istruzioni di calcolo, i processi si interfacciano (&amp;quot;vedono&amp;quot;) al sistema (accedono a memoria, fanno routing) usando system calls.&lt;br /&gt;
ogni processo può vedere un file diverso allo stesso path name&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;umview&amp;lt;/u&amp;gt; vecchia macchina parziale virtuale&lt;br /&gt;
&lt;br /&gt;
L''''Hypervisor''' agisce parzialmente come un debugger: intercetta le system calls ed intraprende azioni.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Virtual Distributed Ethernet (VDE)====&lt;br /&gt;
&lt;br /&gt;
VDE è una rete Ethernet virtuale che può essere distribuita su diverse macchine fisiche presenti in rete.&lt;br /&gt;
Usare concetti reali nello &amp;quot;Standard&amp;quot; ethernet e vitualizzarli. ad esmpio uno switch con il vitual switch, più avanti nelle versioni sono stati creati dei &amp;quot;tasselli&amp;quot; che si posso interfacciare con vari altri tasselli per formare una rete virtuale personalizzata&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Tip: &amp;quot;Trovate il nome giusto da dare a tutte le cose che pensate&amp;quot;&lt;br /&gt;
&lt;br /&gt;
PeDaNTe S.P.A. (Physical, Data link, Network, Transport, Session, Presentation, Application)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Internet of Threads====&lt;br /&gt;
&lt;br /&gt;
Dare un indirizzo IP non alla macchina, ma direttamente al processo, questo ti pemette di migrare i processi da una macchina ad un'altra senza che il client deve riconfigurare l'IP della chiamata a quel processo (IPV6 è praticamente obbligatorio per rendere Internet of Threads utillizzabile, perchè IPV4 ha troppi pochi indirizzi)&lt;br /&gt;
Se abbiamo due web servers virtuali sulla stessa macchina fisica vogliamo che abbiano comunque diversi indirizzi ip.&lt;br /&gt;
&lt;br /&gt;
== March 01 2018 ==&lt;br /&gt;
&lt;br /&gt;
===INFO===&lt;br /&gt;
Le comunicazioni e lo scambio di idee avverranno nel gruppo Telegram.&lt;br /&gt;
&lt;br /&gt;
Per iscriversi/scrivere nel wiki occorre il [http://so.v2.cs.unibo.it/wiki/index.php?title=Qui numero magico] usato già per il corso di Sistemi Operativi.&lt;br /&gt;
&lt;br /&gt;
Vecchio materiale [http://www.cs.unibo.it/~renzo/vsd/ Virtual System Design]&lt;br /&gt;
&lt;br /&gt;
Altre risorse su [https://github.com/rd235 GitHub]&lt;br /&gt;
&lt;br /&gt;
Nickname del docente&lt;br /&gt;
* rd235 (derivato dai documenti RFC es. [https://tools.ietf.org/html/rfc1166 RFC 1166])&lt;br /&gt;
* iz4dje&lt;br /&gt;
&lt;br /&gt;
===Tipi di virtualizzazione===&lt;br /&gt;
[https://www.finnix.org/ finnix] è un sistema operativo live da usare &amp;quot;quando si è nei guai&amp;quot;, non ha interfaccia grafica e permette di provare i sistemi virtuali; la versione 1.0 è quella che funziona bene.&lt;br /&gt;
&lt;br /&gt;
Il sistema operativo in cui viene eseguita la macchina virtuale, viene detto '''host''' (ospitante) mentre la macchina virtuale è chiamata '''guest''' (ospite).&lt;br /&gt;
&lt;br /&gt;
====Emulazione====&lt;br /&gt;
Scrivendo un emulatore di una macchina emulo i passi di esecuzione dell'hardware: convertire le istruzioni dal linguaggio del processore che vuole essere emulato ad istruzioni per la macchina host.&lt;br /&gt;
&lt;br /&gt;
'''QEMU''' è un esempio: traduce il codice macchina guest in codice macchina host (traduzione dinamica). QEMU contiene i sorgenti con le istruzioni del vari assembler (sottoforma di funzioni) che vengono messi in un vettore; fa uso di cache come fanno i browser: il codice non viene tradotto di continuo ma viene eseguito quello &amp;quot;in cache&amp;quot; e questo lo fa risultare 15/20 volte più veloce.&lt;br /&gt;
&lt;br /&gt;
('''NOTA:''' rimane in sospeso '''slirp''', lo vedremo nel dettaglio in futuro)&lt;br /&gt;
&lt;br /&gt;
'''Busybox''' è un piccolo eseguibile che combina diverse applicazioni standard Unix, in pratica le utility Unix non sono altro che un alias di busybox; si può scaricare e compilare i binari di busybox per ''mips'' (arm), se attivo il servizio ''binfmt-support'' il sistema utilizzerà QEMU per eseguire i binari mips, mentre disattivando il servizio sarà possibile utilizzare '''KVM'''.&lt;br /&gt;
&lt;br /&gt;
=====Esempi di emulazione=====&lt;br /&gt;
''qemu-system-''* (wildcard) è il comando per lanciare un'architettura:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
qemu-system-x86_64 -cdrom finnix-110.iso -m 512M&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
dove ''-m 512M'' è la quantità di ram che gli rendiamo disponibile.&lt;br /&gt;
&lt;br /&gt;
Con QEMU possiamo eseguire ''finnix-armhf-111.iso'' su macchina x86_64 seguendo le [https://www.finnix.org/ARM istruzioni], per avere successo bisogna montare l'immagine iso ed estrarre il contenuto (''initrd.xz'', ''linux'' e ''vexpress-v2p-ca9.dtb'') della directory ''/boot/armhf/'' nella cartella da cui si lancia QEMU.&lt;br /&gt;
&lt;br /&gt;
====Virtualizzazione parziale====&lt;br /&gt;
&lt;br /&gt;
'''KVM''', acronimo di Kernel-based Virtual Machine (utilizza VT per Intel e AMD-V per AMD), ha un comportamento a &amp;quot;trigger&amp;quot; il processore si comporta come la routine normale, soltanto quando vengono lanciate determinate call viene cambiata la routine da quella nativa a quella apposita per simulare altri processori. Questo permette di avere macchine virtuali molto più veloci, visto che girano direttamente sul processore escluse le varie eccezione rende una correlazione praticamente 1 a 1.&lt;br /&gt;
&lt;br /&gt;
Si può abilitare la modalità KVM in QEMU usando l'opzione ''-enable-kvm'' che ovviamente richiede che i moduli siano stati caricati.&lt;br /&gt;
&lt;br /&gt;
====Virtualizzazione totale====&lt;br /&gt;
&lt;br /&gt;
'''VirtualBox''' è un esempio di virtualizzazione totale.&lt;br /&gt;
&lt;br /&gt;
'''User-Mode Linux''' è una macchina virtuale i cui sorgenti sono presenti nel kernel linux; usa lo stesso supporto del comando '''strace''' (utile per vedere le system call di un comando); User-Mode Linux è molto vicino a '''umview''' (che appunto sta per '''User-Mode View'''); in quanto a velocità sta in mezzo tra qemu e kvm.&lt;br /&gt;
&lt;br /&gt;
=====Differenze=====&lt;br /&gt;
&lt;br /&gt;
QEMU virtualizzazione a livello di processo ('''PVM'''), KVM a livello di sistema ('''SVM'''), VirtualBox a livello di system call ('''SCVM'''). Vedere [http://www.cs.unibo.it/~renzo/so/lucidi/so-03-struttura-os-1p.pdf#page=36 pag. 36] e a seguire.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
qemu-system-* é formato dal processore di traduzioni dinamiche qemu_(arm, mips...) e dalle periferiche.&lt;br /&gt;
&lt;br /&gt;
kvm invece non fa uso di qemu ma al posto suo usa l'accellerazione del processore (oltre alle periferiche).&lt;br /&gt;
&lt;br /&gt;
qemu funziona come processo utente e non ha bisogno di permessi eccezionali;&lt;br /&gt;
kvm invece risulta vincolato al processore (egrep '^flags.*(vmx|svm)' /proc/cpuinfo) e occorre anche il modulo kernel (lsmod | grep kvm).&lt;br /&gt;
&lt;br /&gt;
VirtualBox non può convivere con KVM.&lt;br /&gt;
&lt;br /&gt;
===Macchine virtuali in rete===&lt;br /&gt;
&lt;br /&gt;
È possibile creare una propria macchina virtuale online usando le credenziali unibo [https://okeanos.grnet.gr/home/ okeanos grnet]&lt;br /&gt;
&lt;br /&gt;
Tip: '''molly-guard''' protects machines from accidental shutdowns/reboots (via ssh); è un software che se si tenta un reboot/poweroff chiede di digitare il nome della macchina, in questo modo si evita di spegnere una macchina virtuale non voluta tra le varie finestre aperte.&lt;br /&gt;
&lt;br /&gt;
== March 06 2018 ==&lt;br /&gt;
&lt;br /&gt;
[https://liveunibo-my.sharepoint.com/:u:/g/personal/francesco_fornari2_studio_unibo_it/EcBK9t59dgVEjB6Y-Lx2tAEBaQ2THtSBZZk9W7p9j5cVSQ?e=tHE25e Registrazione 06/03/2018]&lt;br /&gt;
&lt;br /&gt;
===I requisiti di virtualizzazione===&lt;br /&gt;
&lt;br /&gt;
[https://en.wikipedia.org/wiki/Popek_and_Goldberg_virtualization_requirements I requisiti di virtualizzazione di Popek e Goldberg] sono delle condizioni sufficienti per un'architettura per supportare la virtualizzazione (in modo efficiente):&lt;br /&gt;
&lt;br /&gt;
* '''Equivalenza / Fedeltà''' - Un programma virtualizzato dovrebbe esibire un comportamento essenzialmente identico a quello dimostrato quando viene eseguito su una macchina equivalente direttamente.&lt;br /&gt;
&lt;br /&gt;
* '''Controllo delle risorse / Sicurezza''' - L'hypervisor deve avere il completo controllo delle risorse virtualizzate.&lt;br /&gt;
&lt;br /&gt;
* '''Efficienza / Performance'''&lt;br /&gt;
&lt;br /&gt;
Davoli: &amp;quot;Il livello di sicurezza richiesto dipende dall'applicazione&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Popek e Goldberg descrivono anche le caratteristiche che l'ISA della macchina ospite deve possedere per essere in grado di far girare un hypervisor che goda dei tre requisiti precedenti.&lt;br /&gt;
&lt;br /&gt;
===Teoremi di virtualizzazione===&lt;br /&gt;
&lt;br /&gt;
Le istruzioni di un'ISA sono classificate in tre gruppi:&lt;br /&gt;
# '''Istruzioni privilegiate''' - le istruzioni che generano una trap se il processore è in '''user mode''' e non generano una trap se il processore è in '''kernel mode''' (e.g. divisione per zero, system call, accesso ad indirizzo di memoria non mappato).&lt;br /&gt;
# '''Istruzioni control sensitive''' - le istruzioni che cercano di cambiare la configurazione delle risorse del sistema (e.g. assegnare memoria, acquisire una risorsa).&lt;br /&gt;
# '''Istruzioni behavior sensitive''' - istruzioni che hanno comportamenti diversi a seconda della configurazione delle risorse (e.g. istruzioni che dipendono dal valore del registro di rilocazione o dalla modalità di esecuzione del processore).&lt;br /&gt;
&lt;br /&gt;
====Teorema relativo alle istruzioni privilegiate====&lt;br /&gt;
Si può creare una VM effettiva se e solo se le istruzioni privilegiate sono un sovrainsieme dell'unione delle istruzioni degli altri due tipi; in altre parole tutte le istruzioni &amp;quot;sensitive&amp;quot; generano una trap se eseguite in user mode.&lt;br /&gt;
&amp;lt;br&amp;gt;Le istruzioni '''sensitive''' sono quelle che possono influenzare il corretto funzionamento dell'hypervisor. Queste istruzioni devono essere tutte privilegiate.&lt;br /&gt;
&amp;lt;br&amp;gt;Le istruzioni '''control sensitive''' devono essere privilegiate perché il processo virtualizzato non deve essere in grado di allocare nuove risorse a sè stesso.&lt;br /&gt;
&amp;lt;br&amp;gt;Le istruzioni '''behavior sensitive''' devono essere privilegiate perché il processo virtualizzato deve vedere ...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
(IBM Introduce le maccine virtuali per introdurre sistemi operativi multitasking su macchine monotask)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;Negli anni 90 si producono processori senza considerare il teorema di Popek e Goldberg. L'ISA di questi processori non soddisfaceva le condizioni del teorema.&lt;br /&gt;
Vengono aggiunte istruzioni di virtualizzazione (da usare in ambienti virtuali) che non sono altro che le corrispettive istruzioni privilegiate delle istruzioni sensitive non privilegiate.&lt;br /&gt;
&lt;br /&gt;
(''Robert P. Goldberg: Architectural Principles for Virtual Computer Systems'')&lt;br /&gt;
&lt;br /&gt;
È difficile fare virtualizzazione tramite l'emulazione (problemi di efficienza).&lt;br /&gt;
&lt;br /&gt;
L''''emulazione''' consiste nell'emulare ogni singola funzione del sistema operativo e lo traduce per il livello sottostante.&lt;br /&gt;
&amp;lt;br&amp;gt;La '''simulazione''' consiste nel convertire il codice assembler per un certo processore in codice macchina del processore di base.&lt;br /&gt;
&amp;lt;br&amp;gt;Simulatore: apparenza (Simulatore di volo)&lt;br /&gt;
&amp;lt;br&amp;gt;Emulatore: funzione effettiva e veritiera al 100% ma per questa molto più lenta (Ali di cera del racconto greco)&lt;br /&gt;
&lt;br /&gt;
Qemu può funzionare in due modalità:&lt;br /&gt;
* Macchina virtuale: virtualità al livello di sistema (qemu-system-*).&lt;br /&gt;
* Virtualizzare solo il processore: tutte le system call sono gestite dal sistema operativo reale (qemu-*).&lt;br /&gt;
&lt;br /&gt;
Esperimento: Prendere busybox per architettura arm ed eseguirlo anche se siamo su un intel&lt;br /&gt;
&amp;lt;br&amp;gt;Busybox: eseguibile che fa da contenitore per molti comandi. Permette di risparmiare RAM e disco.&lt;br /&gt;
&amp;lt;br&amp;gt;Sistemi embedded: spesso fatti con kernel + busybox + applicazione per cui è nato il sistema.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[https://www.finnix.org/ARM Finnix arm]&lt;br /&gt;
Per far partire Finnix su Arm occorre prendere dall'immagine del file system dei file che servono all'esterno.&lt;br /&gt;
Per far partire un sistema occorre sicuramente il kernel e poi in molti casi (non tutti) il file system.&lt;br /&gt;
Il kernel viene caricato dal boot loader.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
qemu-system-arm -display none -machine vexpress-a9 -m 256 \&lt;br /&gt;
-kernel linux -initrd initrd.xz -dtb vexpress-v2p-ca9.dtb \&lt;br /&gt;
-append &amp;quot;console=ttyAMA0,115200&amp;quot; -serial stdio \&lt;br /&gt;
-drive file=finnix-armhf.iso,id=cd0,format=raw \&lt;br /&gt;
-device virtio-blk-device,drive=cd0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
kernel linux --&amp;gt; cerca nella directory corrente un file &amp;quot;linux&amp;quot; contenente il kernel&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''initrd''' è un file di configurazione che contiene i moduli kernel usato per l'inizializzazione.&lt;br /&gt;
&amp;lt;br&amp;gt;Perché nasce initrd?&lt;br /&gt;
&amp;lt;br&amp;gt;Il kernel quando fa boot ha bisogno dei driver per tutti i device che servono per caricare il kernel.&lt;br /&gt;
Se vogliamo progettare un kernel che possa fare boot da vari dischi inserire tutti i device driver di questi dischi all'interno del kernel non è una scelta saggia.&lt;br /&gt;
Possiamo studiare un modo per caricare solo i &amp;quot;moduli&amp;quot; che ci servono --&amp;gt; initrd&lt;br /&gt;
&lt;br /&gt;
Quando il kernel è partito possiamo caricare i moduli che ci servono.&lt;br /&gt;
initrd ha al suo interno un file system (banale, di sola lettura, ad allocazione contigua) che contiene un'altra copia dei moduli kernel (.ko).&lt;br /&gt;
&amp;lt;br&amp;gt;In questo modo si ha un piccolo spreco di memoria: i moduli compaiono sia in initrd che in /sys/. Ad oggi anche nei sistemi embedded si preferisce accettare questo piccolo spreco di memoria flash.&lt;br /&gt;
&lt;br /&gt;
'''DTB (Device Tree Binary)'''&lt;br /&gt;
Descrive la configurazione del '''sistem on chip''' alla partenza.&lt;br /&gt;
&amp;lt;br&amp;gt;'''sistem on chip''': integratore contenente processore ed altre cose. Lo stesso integrato può essere configurato per fare un sacco di cose diverse. Si possono scegliere le interfacce dei device da attivare.&lt;br /&gt;
&amp;lt;br&amp;gt;Quando il kernel parte, il kernel deve sapere quali device ha a disposizione, quindi la configurazione del sistem on chip va fatta prima che il kernel parta.&lt;br /&gt;
&amp;lt;br&amp;gt;Il vero file contenente le informazioni (in forma testuale) è il device tree, ma dato che queste informazioni devono essere usate in tempi rapidi al boot, questo file viene compilato e si ottiene il DTB.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Possiamo ottenere i tre file di cui abbiamo bisogno montando l'immagine ISO:&lt;br /&gt;
    mount -o ro finnix-armhf.iso /mnt&lt;br /&gt;
ed andando nella cartella /mnt/boot/armhf/ possiamo trovare i file copiarli e smontare l'immagine.&lt;br /&gt;
Possiamo far partire la macchina virtuale.&lt;br /&gt;
&lt;br /&gt;
===Paravirtualizzazione===&lt;br /&gt;
Il prefisso para significa simile, affine a.&lt;br /&gt;
&amp;lt;br&amp;gt;La paravirtualizzazione è un'ottimizzazione del processo di virtualizzazione perché non il processore non viene emulato.&lt;br /&gt;
&amp;lt;br&amp;gt;Il punto è che l'implementazione di una virtualizzazione completa talvolta non è efficiente.&lt;br /&gt;
E.g. Algoritmi di minimizzazione delle seek su dischi virtuali sono inutili.&lt;br /&gt;
&lt;br /&gt;
Il kernel del guest deve essere informato di stare girando su un device virtuale, questo viola i principi di Popek e Goldber.&lt;br /&gt;
&lt;br /&gt;
===Meglio emulare perfettamente i sistemi reali o fare device ottimizzati per il mondo virtuale?===&lt;br /&gt;
Dipende.&lt;br /&gt;
&amp;lt;br&amp;gt;'''La virtualizzazione si può realizzare su vari livelli ed in varie modalità'''&lt;br /&gt;
Uno dei modi è quello di catturare le system call ('''system call interposition''') o quello di catturare le chiamate ad una libreria.&lt;br /&gt;
&lt;br /&gt;
====Catturare le system call====&lt;br /&gt;
'''ptrace''' è una system call che si può usare per virtualizzare le system call.&lt;br /&gt;
&lt;br /&gt;
====Catturare le chiamate a libreria====&lt;br /&gt;
Funziona con le librerie dinamiche. Le librerie dinamiche sono linkate all'eseguibile solamente in fase di esecuzione.&lt;br /&gt;
Un eseguibile non contiene le librerie, ma solamente le dipendenze alle librerie.&lt;br /&gt;
Per vedere quali sono si può usare il comando ''ldd executablename''.&lt;br /&gt;
&lt;br /&gt;
Esempio:&lt;br /&gt;
&amp;lt;br&amp;gt;La system call open non è altro che una funzione che solleva una trap tramite il comando syscall.&lt;br /&gt;
Potremmo trovare un modo per sovrascrivere la open della libreria standard (libc) in modo che la nuova open sia chiamata al posto dell'altra.&lt;br /&gt;
&lt;br /&gt;
'''purelibc''' è una libreria che prende gran parte delle system call e le ridefinisce.&lt;br /&gt;
&lt;br /&gt;
===Autovirtualizzazione===&lt;br /&gt;
Il processo stesso virtualizza le sue chiamate.&lt;br /&gt;
L'hypervisor è una libreria.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Sicuro NO, utile SI&amp;lt;/u&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
In ViewOS questo meccanismo viene usato in varie occasioni.&lt;br /&gt;
Permette di utilizzare le librerie oltre il loro scopo originale; e.g. se abbiamo una libreria che agisce su dei file e siamo interessati esclusivamente alla logica possiamo fare in modo che le system call relative ai file siano virtualizzate&lt;br /&gt;
in modo tale da fornire i dati in altro modo.&lt;br /&gt;
&lt;br /&gt;
Libreria --&amp;gt; purelibc&lt;br /&gt;
purelibc libreria di autovirtualizzazione&lt;br /&gt;
&lt;br /&gt;
UserModeLinux e ViewOS virtualizzano entrambi tramite system call interposition.&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;u&amp;gt;User mode linux virtualizza tutte le chiamate, ViewOS no.&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Namespaces''': implementano la virtualizzazione parziale (come ViewOS) ma all'interno del kernel. Sono più efficienti ma complicano il kernel.&lt;br /&gt;
&lt;br /&gt;
====Xen====&lt;br /&gt;
L'idea su cui Xen si basa è quella di fondere insieme kernel ed hypervisor.&lt;br /&gt;
&amp;lt;br&amp;gt;Siccome scrivere un intero kernel sarebbe un compito troppo impegnativo, Xen si ispira all'architettura a microkernel.&lt;br /&gt;
Xen implementa uno strato, che si trova direttamente sull'hardware, che usa paravirtualizzazione e che contiene solo le funzioni necessarie a gestire le macchine virtuali.&lt;br /&gt;
&lt;br /&gt;
In Xen &amp;lt;u&amp;gt;&amp;quot;tutte le macchine sono uguali, ma una è più uguale delle altre&amp;quot;&amp;lt;/u&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Di per sè Xen non supporta direttamente l'hardware della macchina reale, infatti non contiene i device driver, ma sfrutta quelli della prima macchina virtuale (domain0).&lt;br /&gt;
Se non configurato diversamente tutti i device vengono gestiti dal domain0. Tutto ciò che arriva dall'hardware viene inoltrato al domain0. Domain0 vede quindi device virtuali che sono rappresentazioni esatte dei device fisici.&lt;br /&gt;
&lt;br /&gt;
KVM ha dimostrato di avere ormai le stesse prestazioni di Xen. Quindi potrebbe essere una buona idea quella di usare un Linux minimale con KVM al posto di Xen.&lt;br /&gt;
&lt;br /&gt;
== March 08 2018 ==&lt;br /&gt;
[https://liveunibo-my.sharepoint.com/:u:/g/personal/francesco_fornari2_studio_unibo_it/EQq0OH4TShpFpQB01x-TmAgB111c9tPOwkxV_BdP9swVJw?e=AbDxex Registrazione 08/03/18]&lt;br /&gt;
&lt;br /&gt;
'''ptrace''' è una system call che permette ad un processo di controllare un altro processo.&lt;br /&gt;
Inizialmente si usavano i segnali stop and continue.&lt;br /&gt;
Nelle prime versioni era proibito usare i segnali stop e continue se il processo era tracciato.&lt;br /&gt;
Nelle ultime versioni c'è un nuovo modo di collegarsi ad un processo: PTRACE_SEIZE.&lt;br /&gt;
&lt;br /&gt;
(VUos usa virtualizzazione parziale)&lt;br /&gt;
&lt;br /&gt;
'''3 tipologie di viste per un unico sistema'''&lt;br /&gt;
&lt;br /&gt;
===Nei panni degli utenti===&lt;br /&gt;
L'idea di VUos è di fornire ad un processo un ambiente diverso;&lt;br /&gt;
VUos usa il concetto di modulo (come nel kernel) ovvero abilita delle funzionalità;&lt;br /&gt;
abbiamo moduli e sottomoduli (usati per specifiche implementazioni delle funzionalità dei moduli):&lt;br /&gt;
http://wiki.v2.cs.unibo.it/wiki/index.php?title=Main_Page&lt;br /&gt;
&lt;br /&gt;
'''Moduli''':&lt;br /&gt;
* '''UM-Fuse''' (versione vecchia) --&amp;gt; '''VUfuse''' (versione nuova) modulo per la virtualizzare file system.&lt;br /&gt;
: Compatibile con Fuse; modulo del kernel di Linux con lo stesso scopo.&lt;br /&gt;
: Fuse si trova nel kernel, i sottomoduli no.&lt;br /&gt;
: Se si compilano gli stessi sorgenti per Fuse linkando la libreria di UM-Fuse lo stesso sorgente funziona con UM Fuse.&lt;br /&gt;
: (Tip: meglio non riscoprire l'acqua calda ed uniformare le interfacce ed usarlo)&lt;br /&gt;
: Sottomoduli:&lt;br /&gt;
:* &amp;lt;u&amp;gt;umfuseext2&amp;lt;/u&amp;gt; (fuseext2) (monta anche ext3 ed ext4)&lt;br /&gt;
:* &amp;lt;u&amp;gt;umfusefat&amp;lt;/u&amp;gt; (libfat)&lt;br /&gt;
:* &amp;lt;u&amp;gt;umfuseiso&amp;lt;/u&amp;gt;&lt;br /&gt;
:* &amp;lt;u&amp;gt;umfusessh&amp;lt;/u&amp;gt;&lt;br /&gt;
:* &amp;lt;u&amp;gt;umfusecrypt&amp;lt;/u&amp;gt;&lt;br /&gt;
* '''UM Net''' --&amp;gt; '''VUnet'''&lt;br /&gt;
: Consente di avere una visione virtualizzata della rete.&lt;br /&gt;
: Sottomoduli:&lt;br /&gt;
:* &amp;lt;u&amp;gt;umnetlwipv6&amp;lt;/u&amp;gt; (lwipv6)&lt;br /&gt;
* '''UM Dev'''&lt;br /&gt;
: Sottomoduli:&lt;br /&gt;
:* &amp;lt;u&amp;gt;umdevmbr&amp;lt;/u&amp;gt; - Master Boot Record&lt;br /&gt;
&lt;br /&gt;
Esempio UM Dev:&lt;br /&gt;
&lt;br /&gt;
Possiamo montare l'immagine di un disco con UM Dev e montare la prima partizione con umfuseext2 (se la partizione è ext2).&lt;br /&gt;
&amp;lt;br&amp;gt;Immagine di un disco = tabella partizioni (MBR o GPT) + partizioni (file system all'interno delle partizioni).&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;mount&amp;lt;/code&amp;gt; ed il file system sono i punti cardine dell'architettura Unix; Unix da nome alle cose tramite il file system.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Esempio fatto dal prof:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
 truncate -s 1G mydisk    # creiamo l'immagine del disco&lt;br /&gt;
 umview xterm		  # facciamo partire la macchina virtuale parziale su un terminale xterm&lt;br /&gt;
&lt;br /&gt;
#nel terminale xterm&lt;br /&gt;
&lt;br /&gt;
 um_add_service umdev umfuse    # aggiungiamo i moduli&lt;br /&gt;
&lt;br /&gt;
 ls /dev/hda&lt;br /&gt;
&lt;br /&gt;
 mount -t umdevmbr mydisk /dev/hda    # umdevmbr è il tipo di montaggio&lt;br /&gt;
&lt;br /&gt;
#Il disco montato sarà visibile solamente nel terminale della macchina virtuale (e nei suoi figli).&lt;br /&gt;
#ViewOS si accerta che esista un modulo che faccia match con la prima parte del nome (umdev) e dà la chiamata in gestione al modulo.&lt;br /&gt;
#A quel punto la libreria (umdevmbr.so) viene caricata in memoria.&lt;br /&gt;
&lt;br /&gt;
 locate umdevmbr.so&lt;br /&gt;
 ls -l /dev/hda    # verifichiamo il montaggio&lt;br /&gt;
&lt;br /&gt;
 /sbin/fdisk /dev/hda    # creaiamo la tabella delle partizioni come in un disco reale&lt;br /&gt;
&lt;br /&gt;
# Il file mydisk è l'immagine di un disco in formato raw.&lt;br /&gt;
# Se facessimo cat di mydisk e ridirezionassimo l'output in un disco da 1G, l'hard disk si partizionerebbe e conterrebbe esattamente il contenuto del file.&lt;br /&gt;
# in alternativa a cat si usa dd perchè è ottimizzato per file di grandi dimensioni (usa grandi cache)&lt;br /&gt;
&lt;br /&gt;
 ls /dev/hda1&lt;br /&gt;
&lt;br /&gt;
 /sbin/mkfs.ext2 /dev/hda1	# make file system ext 2&lt;br /&gt;
 /sbin/fsck.ext2 -f /dev/hda1	# file system check &lt;br /&gt;
&lt;br /&gt;
 ls /mnt&lt;br /&gt;
&lt;br /&gt;
 mount -o rw+ -t umfuseext2 /dev/hda1 /mnt    # montiamo il disco ('''nidifichiamo la virtualizzazione''')&lt;br /&gt;
&lt;br /&gt;
# ora tutte le chiamate verso /mnt saranno catturate e virtualizzate&lt;br /&gt;
&lt;br /&gt;
 ls /mnt    # dovrebbe comparire solo lost+found&lt;br /&gt;
&lt;br /&gt;
# echo &amp;quot;ciao&amp;quot; &amp;gt; /mnt/ciao&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Nidificazione della virtualizzazione====&lt;br /&gt;
Se creiamo un file il nostro processo fa una &amp;lt;code&amp;gt;open&amp;lt;/code&amp;gt; al pathname: la system call viene intercettata da ViewOS in quanto stiamo accedendo ad un path virtualizzato.&lt;br /&gt;
L'hypervisor si accorgerà che il file system è virtualizzato da &amp;lt;code&amp;gt;umfuseext2&amp;lt;/code&amp;gt;, che sa come fare la open sul file system virtuale (generando una &amp;lt;code&amp;gt;write&amp;lt;/code&amp;gt; ad un certo offset nell'immagine della partizione).&lt;br /&gt;
Anche la partizione però è virtualizzata: la chiamata dovrà essere intercettata dal modulo &amp;lt;code&amp;gt;umdevmbr&amp;lt;/code&amp;gt; (che virtualizza le partizioni); questa chiamata tuttavia è generata dall'hypervisor.&lt;br /&gt;
&amp;lt;br&amp;gt;Com'è possibile che l'hypervisor catturi la sua stessa chiamata e la virtualizzi nuovamente? --&amp;gt; '''purelibc'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;/etc/fstab&amp;lt;/code&amp;gt; contiene la tabella dei filesystem&lt;br /&gt;
&lt;br /&gt;
Un file system non deve essere mai montato da più macchine; vale anche per i file dei filesystem virtuali.&lt;br /&gt;
&amp;lt;br&amp;gt;Tramite i comandi standard siamo in grado, con i permessi di utente, di fare operazioni che potrebbero essere svolte solo da root.&lt;br /&gt;
&amp;lt;br&amp;gt;Queste operazioni si potrebbero fare anche senza virtualizzazione, ma servirebbero i permessi di amministratore e avremmo molti limiti.&lt;br /&gt;
&lt;br /&gt;
'''loop device''' dispositivo a blocchi asssociato dinamicamente ad un file e che serve per vedere il file come una memoria di massa.&lt;br /&gt;
&lt;br /&gt;
====ViewFS====&lt;br /&gt;
[http://wiki.v2.cs.unibo.it/wiki/index.php?title=ViewFS ViewFS] è un modulo che virtualizza la struttura dei file system.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
um_add_service viewfs&lt;br /&gt;
mkdir /tmp/newroot&lt;br /&gt;
viewsu&lt;br /&gt;
mount -t viewfs -o mincow,except=/tmp,vstat /tmp/newroot /&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;mincow&amp;lt;/code&amp;gt; ed &amp;lt;code&amp;gt;except&amp;lt;/code&amp;gt; sono opzioni di ViewFS&lt;br /&gt;
&lt;br /&gt;
=====COW=====&lt;br /&gt;
'''COW (Copy On Write)''': Si accede un file in sola lettura ed ogni volta che lo si modifica ne si fa una copia.&lt;br /&gt;
I risultati saranno visibili solamente a noi.&lt;br /&gt;
&amp;lt;br&amp;gt;'''mincow''': ogni volta il sistema proverà ad accedere in scrittura al file e se non ce la fa lo farà in modalità '''cow'''.&lt;br /&gt;
&lt;br /&gt;
Si possono installare pacchetti debian virtualmente usando metodo copy on write (possiamo testare l'installazione di nuovi pacchetti).&lt;br /&gt;
&lt;br /&gt;
=====qcow=====&lt;br /&gt;
Formato usato da qemu per le immagini dei dischi. Usa COW al livello dei blocchi di disco.&lt;br /&gt;
&lt;br /&gt;
Se si modifica il file originale del cow si possono attuare varie politiche.&lt;br /&gt;
Qemu non dà alcuna garanzia.&lt;br /&gt;
ViewOS non permette la modifica.&lt;br /&gt;
&lt;br /&gt;
umview è disponibile nei repository di debian o (aggiornato) su SourceForce.&lt;br /&gt;
&lt;br /&gt;
=====unreal=====&lt;br /&gt;
Modulo di test: fa vedere l'intero file system come se fosse in &amp;lt;code&amp;gt;/unreal&amp;lt;/code&amp;gt; ed anche dentro &amp;lt;code&amp;gt;/unreal/unreal&amp;lt;/code&amp;gt;.&lt;br /&gt;
Si possono fare vari esperimenti, e.g. andare dentro &amp;lt;code&amp;gt;/unreal&amp;lt;/code&amp;gt; e lanciare comandi come &amp;lt;code&amp;gt;make&amp;lt;/code&amp;gt;.&lt;br /&gt;
Se &amp;lt;code&amp;gt;make&amp;lt;/code&amp;gt; si comporta nello stesso modo la virtualizzazione sta funzionando.&lt;br /&gt;
&lt;br /&gt;
Tip: principio chiave del debugging - separare le responsabilità.&lt;br /&gt;
&lt;br /&gt;
'''umview --&amp;gt; umvu'''&lt;br /&gt;
&lt;br /&gt;
'''umbinfmt'''&lt;br /&gt;
&lt;br /&gt;
=====KMVIEW=====&lt;br /&gt;
Fratello di '''UMVIEW'''.&lt;br /&gt;
Molto veloce perché usava un modulo kernel sperimentale che però non entrerà a far parte nel kernel.&lt;br /&gt;
Permetteva, al livello del kernel, di distinguere i file descriptor reali da quelli virtuali.&lt;br /&gt;
La virtualizzazione costava solo 4%.&lt;br /&gt;
&lt;br /&gt;
====Berkeley socket====&lt;br /&gt;
L'interfaccia '''Berkeley socket''' deve essere aggiornata nei tempi in quanto possiede intrinsecamente l'idea di view globale (global view assuption).&lt;br /&gt;
&amp;lt;br&amp;gt;I parametri della chiamata socket sono tre: &lt;br /&gt;
* famiglia (domain, ipv4)&lt;br /&gt;
* servizio (type)&lt;br /&gt;
* protocollo&lt;br /&gt;
&lt;br /&gt;
Se vogliamo un socket AF_INET (ipv4), di tipo SOCK_STREAM, con protocollo di 0 (di default, TCP) non abbiamo modo di scegliere lo stack di rete.&lt;br /&gt;
&amp;lt;br&amp;gt;Se potessimo avere a disposizione d'uso diversi stack di protocolli di rete potremmo avere nuovi tipi di applicazioni ed avere soluzioni più semplici a problemi noti.&lt;br /&gt;
&lt;br /&gt;
In virtual square l'API dei Berkeley sockets è stata estesa con un API chiamata '''msockets''':&lt;br /&gt;
- permette l'utilizzo di più stack di rete allo stesso tempo.&lt;br /&gt;
- il file system viene usato per dare nome agli stack di rete (molto Unix consistent).&lt;br /&gt;
- è compatibile con il passato.&lt;br /&gt;
&lt;br /&gt;
Gli stack di rete appaiono quindi nel file system come file speciali.&lt;br /&gt;
Si può fare mount dello stack.&lt;br /&gt;
Vedere libro di Virtual square per maggiori informazioni.&lt;br /&gt;
&lt;br /&gt;
=====umattach=====&lt;br /&gt;
Si può virtualizzare qualche processo che sta già eseguendo.&lt;br /&gt;
Se la view di un processo cambia improvvisamente potrebbero generarsi delle incoerenze.&lt;br /&gt;
&lt;br /&gt;
===Nei panni degli sviluppatori===&lt;br /&gt;
&lt;br /&gt;
====purelibc====&lt;br /&gt;
[http://wiki.virtualsquare.org/wiki/index.php/PureLibc purelibc] è una libreria che a differenza di '''libc''' prevede l'esclusione delle systemcall in modo da lasciare la libertà di usare le systemcall che si preferisce.&lt;br /&gt;
&lt;br /&gt;
libc = libreria c + libreria di system call (la libc è una libreria c ibrida)&lt;br /&gt;
&lt;br /&gt;
Una vera libreria c quando avviene una printf deve svolgere i calcoli e chiamare la write.&lt;br /&gt;
Non possiamo usare la libc ridefinendo le system call perché quando la printf chiama la write essendo una libreria unica il linker ha già risolto la chiamata.&lt;br /&gt;
Per fare ciò abbiamo bisogno di una libreria pura, che non implementi le system call al suo interno.&lt;br /&gt;
&amp;lt;u&amp;gt;L'hypervisor di ViewOS usa purelibc&amp;lt;/u&amp;gt;.&lt;br /&gt;
Attualmente la purelibc è complessa ed usa il meccanismo del &amp;lt;u&amp;gt;dynamic linker preload&amp;lt;/u&amp;gt; per virtualizzare (vedere la documentazione di purelibc).&lt;br /&gt;
&lt;br /&gt;
La purelibc al momento è implementata come layer al di sopra della libc. Questo è scomodo.&lt;br /&gt;
Se qualche system call fosse aggiunta dovremmo aggiungerne un'altra anche in purelibc.&lt;br /&gt;
&lt;br /&gt;
'''execs --&amp;gt; progetto praticamente concluso'''&lt;br /&gt;
&lt;br /&gt;
====cado====&lt;br /&gt;
cado: sudo con le '''capability''' (privilegio).&lt;br /&gt;
&amp;lt;br&amp;gt;Le capability permettono di separare le prerogative di root e di poterle assegnare in maniera separata, possono essere assegnate a processi o a file.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;man capabilities&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Un processo può avere 4 classi di capability. Le possiamo vedere in &amp;lt;code&amp;gt;/proc/id_processo/status&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;cat /proc/$$/status&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=====Capabilities=====&lt;br /&gt;
* &amp;lt;u&amp;gt;Permitted&amp;lt;/u&amp;gt; - che possono essere attivate dal thread.&lt;br /&gt;
* &amp;lt;u&amp;gt;Inheritable&amp;lt;/u&amp;gt; - che possono essere ereditate.&lt;br /&gt;
* &amp;lt;u&amp;gt;Effective&amp;lt;/u&amp;gt; - attive. Sono sempre un sottoinsieme dei permitted.&lt;br /&gt;
* &amp;lt;u&amp;gt;Ambient&amp;lt;/u&amp;gt; - sono mantenute a patto che il file non sia privilegiato.&lt;br /&gt;
&lt;br /&gt;
'''Bound''' - maschera non modificabile che indica quali capabilities il sistema è in grado di gestire.&lt;br /&gt;
&lt;br /&gt;
=====Capabilities dei file=====&lt;br /&gt;
&lt;br /&gt;
'''Capabilities ambient''': sono mantenute a patto che il file non sia privilegiato.&lt;br /&gt;
Se si ha una capability ambient essa è considerata come permitted e come effective.&lt;br /&gt;
&lt;br /&gt;
Come cambiano le capabilities quando si chiama una exec?&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;/etc/sudoers&amp;lt;/code&amp;gt; --&amp;gt; file di configurazione di sudo (anche cado ha un file di configurazione)&lt;br /&gt;
&lt;br /&gt;
====namespace====&lt;br /&gt;
Si possono dare ai processi visioni diverse sulle risorse.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;man namespaces&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Rete, IPC, PID.&lt;br /&gt;
&amp;lt;br&amp;gt;I namespaces sono stati implementati male: funzionano ma sono molto pesanti da utilizzare e vengono usati dai processi senza che l'utente non ne abbia visibilità ( Chromium per creare dei sandbox usa i namespaces ).&lt;br /&gt;
&lt;br /&gt;
I namespace si possono creare in 3 modi diversi:&lt;br /&gt;
* &amp;lt;u&amp;gt;clone&amp;lt;/u&amp;gt;: crea un nuovo processo con namespace associato.&lt;br /&gt;
* &amp;lt;u&amp;gt;setns&amp;lt;/u&amp;gt;: permette ad un processo di unirsi ad un namespace esistente.&lt;br /&gt;
* &amp;lt;u&amp;gt;unshare&amp;lt;/u&amp;gt;: il processo chiamante si collega ad un namespace nuovo.&lt;br /&gt;
&lt;br /&gt;
===Nei panni degli sviluppatori core===&lt;br /&gt;
&lt;br /&gt;
== March 13 2018 ==&lt;br /&gt;
[https://etherpad.wikimedia.org/p/qKAqRNgtxt Etherpad 13/03/18]&lt;br /&gt;
&lt;br /&gt;
[https://liveunibo-my.sharepoint.com/:u:/g/personal/francesco_fornari2_studio_unibo_it/Ed7XFMhWD9tEjVhCAVij9PQB66auNxzCMUG53Xl9veDlkw?e=JHtQN1 Registrazione 13/03/18]&lt;br /&gt;
&lt;br /&gt;
Quando si trasmette una lista di interfacce in protocollo &amp;lt;code&amp;gt;netlink&amp;lt;/code&amp;gt; prevede il pacchetto &amp;quot;''done''&amp;quot; come sentinella finale. In alternativa si può usare &amp;lt;code&amp;gt;busybox ip addr&amp;lt;/code&amp;gt; in quanto &amp;lt;code&amp;gt;ip addr&amp;lt;/code&amp;gt; di busybox non fa nessun controllo sul pacchetto ''done''.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
#Facciamo partire una macchina virtuale in un terminale.&lt;br /&gt;
umview xterm&lt;br /&gt;
#Vediamo le vere interfacce di rete.&lt;br /&gt;
ip addr&lt;br /&gt;
#Carichiamo il supporto per le reti virtuali.&lt;br /&gt;
um_add_service umnet&lt;br /&gt;
&lt;br /&gt;
#vde vuole indirizzi simili agli url.&lt;br /&gt;
#???????? vedere meglio nella documentazione ???????????????&lt;br /&gt;
&lt;br /&gt;
mount -t umnetlwipv6 -o vde0=vxvde:// none /dev/net/mynet&lt;br /&gt;
#Osserviamo di nuovo le interfacce di rete.&lt;br /&gt;
ip link&lt;br /&gt;
&lt;br /&gt;
#Vediamo le interfacce precedenti in quanto la nuova rete non è montata come rete di default.&lt;br /&gt;
#Possiamo avere tanti stack diversi ognuno con le sue interfacce.&lt;br /&gt;
&lt;br /&gt;
#mstack --&amp;gt; multiple stack; comando di umview usare lo stack selezionato.&lt;br /&gt;
mstack /dev/net/mynet ip link&lt;br /&gt;
#Se volessi far partire un browser su quello stack dovrei fare&lt;br /&gt;
mstack /dev/net/mynet firefox&lt;br /&gt;
#Se volessi far partire una connessione ssh&lt;br /&gt;
mstack /dev/net/mynet ssh&lt;br /&gt;
#Se volessimo avviare un terminale che vive nella rete nuova potremmo fare&lt;br /&gt;
mstack /dev/net/mynet bash&lt;br /&gt;
&lt;br /&gt;
ip addr add 10.0.0.1/24 dev vd0&lt;br /&gt;
ip link set vd0 up&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se adesso su un'altra macchina della rete locale facessi le stesse operazioni con un indirizzo ip diverso, le macchine avrebbero la possibilità di mettersi in contatto.&lt;br /&gt;
&lt;br /&gt;
Per completezza dell'esempio realizziamo l'altro stack con vdens (namespace di vde).&lt;br /&gt;
&lt;br /&gt;
Parte dell'esempio fatto dal prof; qui viene usato in entrambi i terminali '''vdens''', mentre il prof a lezione ha usato per uno '''umnet''' e '''vdens''' per l'altro.&lt;br /&gt;
Sono necessari '''[https://github.com/rd235/vdens vdens]''' ,'''[https://github.com/rd235/vdeplug4 vdeplug4]''' ( e forse anche '''[https://github.com/rd235/vxvdex vxvdex]''').&lt;br /&gt;
&lt;br /&gt;
Per entrambe le sessioni del terminale setto una variabile d'ambiente in modo che mi cerchi la ''libvdeplug.so.4'' in ''/usr/local/lib''.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
 export LD_LIBRARY_PATH=/lib:/usr/lib:/usr/local/lib&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Terminale 1&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
 vdens vxvde://&lt;br /&gt;
 ip link set vde0 up&lt;br /&gt;
 ip addr add 10.0.0.1/24 dev vde0&lt;br /&gt;
 &lt;br /&gt;
 ping 10.0.0.2&lt;br /&gt;
&lt;br /&gt;
 nc 10.0.0.2 2222&lt;br /&gt;
&lt;br /&gt;
#scrivendo dei messaggi nel terminale 1 compariranno nel 2 e viceversa &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Terminale 2&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
 vdens vxvde://&lt;br /&gt;
 ip link set vde0 up&lt;br /&gt;
 ip addr add 10.0.0.1/24 dev vde0&lt;br /&gt;
&lt;br /&gt;
#ora nel terminale 1 posso eseguire ping 10.0.0.2&lt;br /&gt;
&lt;br /&gt;
 nc -l 2222&lt;br /&gt;
#ora nel terminale 1 posso eseguire  nc 10.0.0.2 2222&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Stack TCP/IP''': o implementato a livello utente come libreria o implementato nel kernel.&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;umview&amp;lt;/code&amp;gt; --&amp;gt; prima opzione.&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;vdens&amp;lt;/code&amp;gt; --&amp;gt; chiede al kernel di costruire un altro stack TCP/IP per questo utente (sfrutta i namespace).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;nc&amp;lt;/code&amp;gt; (alias &amp;lt;code&amp;gt;netcat&amp;lt;/code&amp;gt;) coltellino svizzero per esperimenti su rete.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
#Connessione TCP alla porta 22 di maddalena&lt;br /&gt;
nc mad.cs.unibo.it 22&lt;br /&gt;
#Connessione alla porta 80 &lt;br /&gt;
nc 130.136.1.110 80&lt;br /&gt;
nc permette di collegarsi tramite TCP e di scrivere HTTP manualmente&lt;br /&gt;
&lt;br /&gt;
#Faccio un server TCP in ascolto su porta 2222&lt;br /&gt;
nc -l 2222&lt;br /&gt;
#Mi connetto alla porta 2222 dell'indirizzo 10.0.0.2&lt;br /&gt;
nc 10.0.0.2 2222&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Un utente può creare tutti gli stack di rete che vuole ed averne vari a disposizione con configurazioni diverse.&lt;br /&gt;
&amp;lt;br&amp;gt;Esempio: possiamo lanciare un browser facendo in modo che il browser non sia logicamente dove siamo ma usi un ip di un'altra area geografica.&lt;br /&gt;
* Così facendo inganneremmo where si my ip&lt;br /&gt;
* Comodo per testare la neutralità della rete. Stessa pagina acceduta con ip di aree geografiche diverse appare nello stesso modo.&lt;br /&gt;
&lt;br /&gt;
Se volessimo implementare un VPN per sicurezza aziendale normalmente dovremmo spostare tutta la macchina dentro il VPN, con questo metodo possiamo avere un solo stack connesso al VPN.&lt;br /&gt;
&lt;br /&gt;
I supporti di rete, file system e device, portandoli fuori dal kernel in user mode ricordano il concetto di microkernel.&lt;br /&gt;
&amp;lt;br&amp;gt;ViewOS serve anche per poter fare una transizione dolce dai kernel monolitici ai microkernel; è come avere un microkernel configurabile a runtime.&lt;br /&gt;
* Possiamo decidere di tenere parti del kernel (moduli) in spazio utente tramite moduli di ViewOS. è meno efficiente ma più sicuro e si usa solo all'occorrenza.&lt;br /&gt;
* Se dovessimo gestire un tipo di file system appena inventato (di cui non abbiamo il supporto nel kernel) per inserire il supporto del kernel dovremmo ricompilare tutto; Se usiamo un modulo a livello utente no.&lt;br /&gt;
&lt;br /&gt;
ViewOS è una specifica; per ora è stato implementato tramite '''system call interposition (ptrace)''', ma può essere implementato in altri modi.&lt;br /&gt;
&lt;br /&gt;
Potremmo implementare il tutto attraverso i '''namespace''', nel kernel (e.g. vdens). Creare diversi visioni dell'ambiente.&lt;br /&gt;
&lt;br /&gt;
== March 15 2018 ==&lt;br /&gt;
&lt;br /&gt;
Lezione sospesa causa lauree.&lt;br /&gt;
&lt;br /&gt;
== March 20 2018 ==&lt;br /&gt;
[https://etherpad.wikimedia.org/p/A4ZfDg1rtY Etherpad 20/03/18]&lt;br /&gt;
&lt;br /&gt;
[https://liveunibo-my.sharepoint.com/:u:/g/personal/francesco_fornari2_studio_unibo_it/Ea2A7wOIwqRJvvLoF7ekvr8BdBWJmjjz_fBx1zB5rr__2w?e=jxfToF Registrazione 20/03/18]&lt;br /&gt;
&lt;br /&gt;
== March 22 2018 ==&lt;br /&gt;
[https://etherpad.wikimedia.org/p/ya2BWaXTbl Etherpad 22/03/18]&lt;br /&gt;
&lt;br /&gt;
[https://liveunibo-my.sharepoint.com/:u:/g/personal/francesco_fornari2_studio_unibo_it/EZ8AcVfOagpBnYHAN3EYcv0BpHlqcH0Lg-8l3sQb6_Drsg?e=7suh7a Registrazione 22/03/18]&lt;br /&gt;
&lt;br /&gt;
== March 27 2018 ==&lt;br /&gt;
[https://etherpad.wikimedia.org/p/GaJNvPo1wK Etherpad 27/03/18]&lt;br /&gt;
&lt;br /&gt;
[https://liveunibo-my.sharepoint.com/:u:/g/personal/francesco_fornari2_studio_unibo_it/EYZUi8icxIpIhMrV_ZvwspIB5kCqMzEbL8plvCzZD8-BIA?e=VhO56l Registrazione 27/03/18 pt1]&lt;br /&gt;
[https://liveunibo-my.sharepoint.com/:u:/g/personal/francesco_fornari2_studio_unibo_it/EWPHKBP4cqNEomwP7MQiodgBxbUQbwAYLA9f5gu14OFg-A?e=7sA6NE pt2]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Esempio su veth&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#terminale 1&lt;br /&gt;
 sudo bash&lt;br /&gt;
&lt;br /&gt;
 ip link add type veth&lt;br /&gt;
 ip link&lt;br /&gt;
&lt;br /&gt;
# solo per avere una panoramica del comando&lt;br /&gt;
 ip netns help &lt;br /&gt;
&lt;br /&gt;
 ip netns add renzonet&lt;br /&gt;
 ip netns list&lt;br /&gt;
&lt;br /&gt;
#trasferiamo veth1 nel namespace appena creato renzonet&lt;br /&gt;
 ip link set veth1 netns renzonet&lt;br /&gt;
 ip netns exec renzonet ip addr&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 ip addr add 10.1.1.1/24 dev veth0&lt;br /&gt;
 ip link set veth0 up&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#terminale 2&lt;br /&gt;
 sudo bash&lt;br /&gt;
&lt;br /&gt;
 ip netns exec renzonet bash&lt;br /&gt;
 ip addr add 10.1.1.2/24 dev veth1&lt;br /&gt;
 ip link set veth1 up&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 ping 10.1.1.1 &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# per riportare le cose allo stato precedente&lt;br /&gt;
#il comando si prende la libertà di eliminare anche veth0 e veth1 create con 'ip link add type veth'&lt;br /&gt;
 ip netns delete renzonet&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== April 05 2018 ==&lt;br /&gt;
== April 10 2018 ==&lt;br /&gt;
== April 12 2018 ==&lt;br /&gt;
== April 17 2018 ==&lt;br /&gt;
== April 19 2018 ==&lt;br /&gt;
== April 24 2018 ==&lt;br /&gt;
== April 27 2018 ==&lt;br /&gt;
== May 03 2018 ==&lt;br /&gt;
== May 08 2018 ==&lt;br /&gt;
== May 10 2018 ==&lt;br /&gt;
== May 15 2018 ==&lt;br /&gt;
== May 17 2018 ==&lt;br /&gt;
== May 22 2018 ==&lt;br /&gt;
== May 24 2018 ==&lt;/div&gt;</summary>
		<author><name>Leonardo</name></author>
	</entry>
	<entry>
		<id>https://vsd.v2.cs.unibo.it/wiki/index.php?title=2018_Spring_Term&amp;diff=58</id>
		<title>2018 Spring Term</title>
		<link rel="alternate" type="text/html" href="https://vsd.v2.cs.unibo.it/wiki/index.php?title=2018_Spring_Term&amp;diff=58"/>
		<updated>2018-03-13T15:36:18Z</updated>

		<summary type="html">&lt;p&gt;Leonardo: /* March 13 2018 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== February 27 2018 ==&lt;br /&gt;
&lt;br /&gt;
===Virtualità===&lt;br /&gt;
&lt;br /&gt;
Virtualizzare qualcosa significa fornire un oggetto che possa essere usato (stessa interfaccia) efficacemente al posto dell'altro.&lt;br /&gt;
Se si usa una scarpa per piantare un chiodo, la scarpa è un &amp;quot;martello virtuale&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
====Memoria virtuale====&lt;br /&gt;
*Interfaccia della memoria principale: load(indirizzo), store(indirizzo, oggetto).&lt;br /&gt;
*Semantica: se eseguo store(i, a) seguito da load(i), la seconda operazione ritornerà a.&lt;br /&gt;
La memoria secondaria può essere usata per implementare l'interfaccia di quella primaria.&lt;br /&gt;
Anche l'hardware di un calcolatore può essere visto come un'entità astratta che parla il linguaggio ISA del processore di cui fa uso.&lt;br /&gt;
Se virtualizziamo l'hardware tramite un programma che ne implementa la stessa interfaccia otteniamo una macchina virtuale.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Possibilità di virtualizzare il tempo.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Significato di '''virtualsquare'''&lt;br /&gt;
&lt;br /&gt;
Una piazza dove i vari tipi di virtualià coesistono, un laboratorio internazionale sulla virtualità.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Concetto di VIEW====&lt;br /&gt;
&lt;br /&gt;
I processi &amp;quot;vedono&amp;quot; l'ambiente di esecuzione. Se non stanno eseguendo istruzioni di calcolo, i processi si interfacciano (&amp;quot;vedono&amp;quot;) al sistema (accedono a memoria, fanno routing) usando system calls.&lt;br /&gt;
ogni processo può vedere un file diverso allo stesso path name&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;umview&amp;lt;/u&amp;gt; vecchia macchina parziale virtuale&lt;br /&gt;
&lt;br /&gt;
L''''Hypervisor''' agisce parzialmente come un debugger: intercetta le system calls ed intraprende azioni.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Virtual Distributed Ethernet (VDE)====&lt;br /&gt;
&lt;br /&gt;
VDE è una rete Ethernet virtuale che può essere distribuita su diverse macchine fisiche presenti in rete.&lt;br /&gt;
Usare concetti reali nello &amp;quot;Standard&amp;quot; ethernet e vitualizzarli. ad esmpio uno switch con il vitual switch, più avanti nelle versioni sono stati creati dei &amp;quot;tasselli&amp;quot; che si posso interfacciare con vari altri tasselli per formare una rete virtuale personalizzata&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Tip: &amp;quot;Trovate il nome giusto da dare a tutte le cose che pensate&amp;quot;&lt;br /&gt;
&lt;br /&gt;
PeDaNTe S.P.A. (Physical, Data link, Network, Transport, Session, Presentation, Application)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Internet of Threads====&lt;br /&gt;
&lt;br /&gt;
Dare un indirizzo IP non alla macchina, ma direttamente al processo, questo ti pemette di migrare i processi da una macchina ad un'altra senza che il client deve riconfigurare l'IP della chiamata a quel processo (IPV6 è praticamente obbligatorio per rendere Internet of Threads utillizzabile, perchè IPV4 ha troppi pochi indirizzi)&lt;br /&gt;
Se abbiamo due web servers virtuali sulla stessa macchina fisica vogliamo che abbiano comunque diversi indirizzi ip.&lt;br /&gt;
&lt;br /&gt;
== March 01 2018 ==&lt;br /&gt;
&lt;br /&gt;
===INFO===&lt;br /&gt;
Le comunicazioni e lo scambio di idee avverranno nel gruppo Telegram.&lt;br /&gt;
&lt;br /&gt;
Per iscriversi/scrivere nel wiki occorre il [http://so.v2.cs.unibo.it/wiki/index.php?title=Qui numero magico] usato già per il corso di Sistemi Operativi.&lt;br /&gt;
&lt;br /&gt;
Vecchio materiale [http://www.cs.unibo.it/~renzo/vsd/ Virtual System Design]&lt;br /&gt;
&lt;br /&gt;
Altre risorse su [https://github.com/rd235 GitHub]&lt;br /&gt;
&lt;br /&gt;
Nickname del docente&lt;br /&gt;
* rd235 (derivato dai documenti RFC es. [https://tools.ietf.org/html/rfc1166 RFC 1166])&lt;br /&gt;
* iz4dje&lt;br /&gt;
&lt;br /&gt;
===Tipi di virtualizzazione===&lt;br /&gt;
[https://www.finnix.org/ finnix] è un sistema operativo live da usare &amp;quot;quando si è nei guai&amp;quot;, non ha interfaccia grafica e permette di provare i sistemi virtuali; la versione 1.0 è quella che funziona bene.&lt;br /&gt;
&lt;br /&gt;
Il sistema operativo in cui viene eseguita la macchina virtuale, viene detto '''host''' (ospitante) mentre la macchina virtuale è chiamata '''guest''' (ospite).&lt;br /&gt;
&lt;br /&gt;
====Emulazione====&lt;br /&gt;
Scrivendo un emulatore di una macchina emulo i passi di esecuzione dell'hardware: convertire le istruzioni dal linguaggio del processore che vuole essere emulato ad istruzioni per la macchina host.&lt;br /&gt;
&lt;br /&gt;
'''QEMU''' è un esempio: traduce il codice macchina guest in codice macchina host (traduzione dinamica). QEMU contiene i sorgenti con le istruzioni del vari assembler (sottoforma di funzioni) che vengono messi in un vettore; fa uso di cache come fanno i browser: il codice non viene tradotto di continuo ma viene eseguito quello &amp;quot;in cache&amp;quot; e questo lo fa risultare 15/20 volte più veloce.&lt;br /&gt;
&lt;br /&gt;
('''NOTA:''' rimane in sospeso '''slirp''', lo vedremo nel dettaglio in futuro)&lt;br /&gt;
&lt;br /&gt;
'''Busybox''' è un piccolo eseguibile che combina diverse applicazioni standard Unix, in pratica le utility Unix non sono altro che un alias di busybox; si può scaricare e compilare i binari di busybox per ''mips'' (arm), se attivo il servizio ''binfmt-support'' il sistema utilizzerà QEMU per eseguire i binari mips, mentre disattivando il servizio sarà possibile utilizzare '''KVM'''.&lt;br /&gt;
&lt;br /&gt;
=====Esempi di emulazione=====&lt;br /&gt;
''qemu-system-''* (wildcard) è il comando per lanciare un'architettura:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
qemu-system-x86_64 -cdrom finnix-110.iso -m 512M&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
dove ''-m 512M'' è la quantità di ram che gli rendiamo disponibile.&lt;br /&gt;
&lt;br /&gt;
Con QEMU possiamo eseguire ''finnix-armhf-111.iso'' su macchina x86_64 seguendo le [https://www.finnix.org/ARM istruzioni], per avere successo bisogna montare l'immagine iso ed estrarre il contenuto (''initrd.xz'', ''linux'' e ''vexpress-v2p-ca9.dtb'') della directory ''/boot/armhf/'' nella cartella da cui si lancia QEMU.&lt;br /&gt;
&lt;br /&gt;
====Virtualizzazione parziale====&lt;br /&gt;
&lt;br /&gt;
'''KVM''', acronimo di Kernel-based Virtual Machine (utilizza VT per Intel e AMD-V per AMD), ha un comportamento a &amp;quot;trigger&amp;quot; il processore si comporta come la routine normale, soltanto quando vengono lanciate determinate call viene cambiata la routine da quella nativa a quella apposita per simulare altri processori. Questo permette di avere macchine virtuali molto più veloci, visto che girano direttamente sul processore escluse le varie eccezione rende una correlazione praticamente 1 a 1.&lt;br /&gt;
&lt;br /&gt;
Si può abilitare la modalità KVM in QEMU usando l'opzione ''-enable-kvm'' che ovviamente richiede che i moduli siano stati caricati.&lt;br /&gt;
&lt;br /&gt;
====Virtualizzazione totale====&lt;br /&gt;
&lt;br /&gt;
'''VirtualBox''' è un esempio di virtualizzazione totale.&lt;br /&gt;
&lt;br /&gt;
'''User-Mode Linux''' è una macchina virtuale i cui sorgenti sono presenti nel kernel linux; usa lo stesso supporto del comando '''strace''' (utile per vedere le system call di un comando); User-Mode Linux è molto vicino a '''umview''' (che appunto sta per '''User-Mode View'''); in quanto a velocità sta in mezzo tra qemu e kvm.&lt;br /&gt;
&lt;br /&gt;
=====Differenze=====&lt;br /&gt;
&lt;br /&gt;
QEMU virtualizzazione a livello di processo ('''PVM'''), KVM a livello di sistema ('''SVM'''), VirtualBox a livello di system call ('''SCVM'''). Vedere [http://www.cs.unibo.it/~renzo/so/lucidi/so-03-struttura-os-1p.pdf#page=36 pag. 36] e a seguire.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
qemu-system-* é formato dal processore di traduzioni dinamiche qemu_(arm, mips...) e dalle periferiche.&lt;br /&gt;
&lt;br /&gt;
kvm invece non fa uso di qemu ma al posto suo usa l'accellerazione del processore (oltre alle periferiche).&lt;br /&gt;
&lt;br /&gt;
qemu funziona come processo utente e non ha bisogno di permessi eccezionali;&lt;br /&gt;
kvm invece risulta vincolato al processore (egrep '^flags.*(vmx|svm)' /proc/cpuinfo) e occorre anche il modulo kernel (lsmod | grep kvm).&lt;br /&gt;
&lt;br /&gt;
VirtualBox non può convivere con KVM.&lt;br /&gt;
&lt;br /&gt;
===Macchine virtuali in rete===&lt;br /&gt;
&lt;br /&gt;
È possibile creare una propria macchina virtuale online usando le credenziali unibo [https://okeanos.grnet.gr/home/ okeanos grnet]&lt;br /&gt;
&lt;br /&gt;
Tip: '''molly-guard''' protects machines from accidental shutdowns/reboots (via ssh); è un software che se si tenta un reboot/poweroff chiede di digitare il nome della macchina, in questo modo si evita di spegnere una macchina virtuale non voluta tra le varie finestre aperte.&lt;br /&gt;
&lt;br /&gt;
== March 06 2018 ==&lt;br /&gt;
[https://etherpad.wikimedia.org/p/avNnD5LhXk Eterpad 06/03/2018]&lt;br /&gt;
&lt;br /&gt;
[https://liveunibo-my.sharepoint.com/:u:/g/personal/francesco_fornari2_studio_unibo_it/EcBK9t59dgVEjB6Y-Lx2tAEBaQ2THtSBZZk9W7p9j5cVSQ?e=tHE25e Registrazione 06/03/2018]&lt;br /&gt;
&lt;br /&gt;
Popek e Goldberg [https://en.wikipedia.org/wiki/Popek_and_Goldberg_virtualization_requirements wiki]&lt;br /&gt;
I requisiti di virtualizzazione di Popek e Goldberg sono delle condizioni sufficienti per un'architettura per supportare la virtualizzazione (in modo efficiente).&lt;br /&gt;
&lt;br /&gt;
Requisiti:&lt;br /&gt;
&lt;br /&gt;
'''Equivalenza / Fedeltà''' - Un programma virtualizzato dovrebbe esibire un comportamento essenzialmente identico a quello dimostrato quando viene eseguito su una macchina equivalente direttamente.&lt;br /&gt;
&lt;br /&gt;
'''Controllo delle risorse / Sicurezza''' - L'hypervisor deve avere il completo controllo delle risorse virtualizzate.&lt;br /&gt;
&lt;br /&gt;
'''Efficienza / Performance'''&lt;br /&gt;
&lt;br /&gt;
Davoli: &amp;quot;Il livello di sicurezza richiesto dipende dall'applicazione&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Popek e Goldberg descrivono anche le caratteristiche che l'ISA della macchina ospite deve possedere per essere in grado di far girare un hypervisor che goda dei tre requisiti precedenti.&lt;br /&gt;
Teoremi di virtualizzazione&lt;br /&gt;
&lt;br /&gt;
Le istruzioni di un'ISA sono classificate in tre gruppi:&lt;br /&gt;
Istruzioni privilegiate - le istruzioni che generano una trap se il processore è in user mode e non generano una trap se il processore è in kernel mode (e.g. divisione per zero, system call, accesso ad indirizzo di memoria non mappato).&lt;br /&gt;
Istruzioni control sensitive - le istruzioni che cercano di cambiare la configurazione delle risorse del sistema (e.g. assegnare memoria, acquisire una risorsa).&lt;br /&gt;
Istruzioni behavior sensitive - istruzioni che hanno comportamenti diversi a seconda della configurazione delle risorse (e.g. istruzioni che dipendono dal valore del registro di rilocazione o dalla modalità di esecuzione del processore).&lt;br /&gt;
&lt;br /&gt;
Teorema relativo alle istruzioni privilegiate&lt;br /&gt;
Si può creare una VM effettiva se e solo se le istruzioni privilegiate sono un sovrainsieme dell'unione delle istruzioni degli altri due tipi.&lt;br /&gt;
In altre parole tutte le istruzioni &amp;quot;sensitive&amp;quot; generano una trap se eseguite in user mode.&lt;br /&gt;
Le istruzioni sensitive sono quelle che possono influenzare il corretto funzionamento dell'hypervisor. Queste istruzioni devono essere tutte privilegiate.&lt;br /&gt;
Le istruzioni control sensitive devono essere privilegiate perché il processo virtualizzato non deve essere in grado di allocare nuove risorse a sè stesso.&lt;br /&gt;
Le istruzioni behavior sensitive devono essere privilegiate perché il processo virtualizzato deve vedere ...&lt;br /&gt;
&lt;br /&gt;
IBM Introduce le maccine virtuali per introdurre sistemi operativi multitasking su macchine monotask&lt;br /&gt;
&lt;br /&gt;
Negli anni 90 si producono processori senza considerare il teorema di Popek e Goldberg. L'ISA di questi processori non soddisfava le condizioni del teorema.&lt;br /&gt;
Vengono aggiunte istruzioni di virtualizzazione (da usare in ambienti virtuali) che non sono altro che le corrispettive istruzioni privilegiate delle istruzioni sensitive non privilegiate.&lt;br /&gt;
&lt;br /&gt;
Libro Robert P. Goldberg: Architectural Principles for Virtual Computer Systems.&lt;br /&gt;
&lt;br /&gt;
È difficile fare virtualizzazione tramite l'emulazione (problemi di efficienza).&lt;br /&gt;
&lt;br /&gt;
L'emulazione consiste nell'emulare ogni singola funzione del sistema operativo e lo traduce per il livello sottostante&lt;br /&gt;
La simulazioneconsiste nel convertire il codice macchina assembler per un certo processore in codice macchina del processore di base&lt;br /&gt;
Simulatore: apparenza (Simulatore di volo)&lt;br /&gt;
Emulatore: funzione effettiva e veritiera al 100% ma per questa molto più lenta (Ali di cera del racconto greco)&lt;br /&gt;
&lt;br /&gt;
Qemu può funzionare in due modalità:&lt;br /&gt;
Macchina virtuale: virtualità al livello di sistema (qemu-system-*).&lt;br /&gt;
Virtualizzare solo il processore: tutte le system call sono gestite dal sistema operativo reale (qemu-*).&lt;br /&gt;
&lt;br /&gt;
Esperimento: Prendere busybox per architettura arm ed eseguirlo anche se siamo su un intel&lt;br /&gt;
Busybox: eseguibile che fa da contenitore per molti comandi. Permette di risparmiare RAM e disco.&lt;br /&gt;
Sistemi embedded: spesso fatti con kernel + busybox + applicazione per cui è nato il sistema.&lt;br /&gt;
&lt;br /&gt;
Finnix su arm:&lt;br /&gt;
https://www.finnix.org/ARM&lt;br /&gt;
Per far partire Finnix su Arm occorre prendere dall'immagine del file system dei file che servono all'esterno.&lt;br /&gt;
Per far partire un sistema occorre sicuramente il kernel e poi in molti casi (non tutti) il file system.&lt;br /&gt;
Il kernel viene caricato dal boot loader.&lt;br /&gt;
&lt;br /&gt;
qemu-system-arm -display none -machine vexpress-a9 -m 256 \&lt;br /&gt;
-kernel linux -initrd initrd.xz -dtb vexpress-v2p-ca9.dtb \&lt;br /&gt;
-append &amp;quot;console=ttyAMA0,115200&amp;quot; -serial stdio \&lt;br /&gt;
-drive file=finnix-armhf.iso,id=cd0,format=raw \&lt;br /&gt;
-device virtio-blk-device,drive=cd0&lt;br /&gt;
&lt;br /&gt;
kernel linux --&amp;gt; cerca nella directory corrente un file &amp;quot;linux&amp;quot; contenente il kernel&lt;br /&gt;
&lt;br /&gt;
initrd è un file di configurazione che contiene i moduli kernel usato per l'inizializzazione.&lt;br /&gt;
Perché nasce initrd?&lt;br /&gt;
Il kernel quando fa boot ha bisogno dei driver per tutti i device che servono per caricare il kernel.&lt;br /&gt;
Se vogliamo progettare un kernel che possa fare boot da vari dischi inserire tutti i device driver di questi dischi all'interno del kernel non è una scelta saggia.&lt;br /&gt;
Possiamo studiare un modo per caricare solo i &amp;quot;moduli&amp;quot; che ci servono --&amp;gt; initrd&lt;br /&gt;
&lt;br /&gt;
Quando il kernel è partito possiamo caricare i moduli che ci servono.&lt;br /&gt;
initrd ha al suo interno un file system (banale, di sola lettura, ad allocazione contigua) che contiene un'altra copia dei moduli kernel (.ko).&lt;br /&gt;
In questo modo si ha un piccolo spreco di memoria: i moduli compaiono sia in initrd che in /sys/. Ad oggi anche nei sistemi embedded si preferisce accettare questo piccolo spreco di memoria flash.&lt;br /&gt;
&lt;br /&gt;
DTB (Device Tree Binary)&lt;br /&gt;
Descrive la configurazione del sistem on chip alla partenza.&lt;br /&gt;
sistem on chip: integratore contenente processore ed altre cose. Lo stesso integrato può essere configurato per fare un sacco di cose diverse. Si possono scegliere le interfacce dei device da attivare.&lt;br /&gt;
Quando il kernel parte, il kernel deve sapere quali device ha a disposizione, quindi la configurazione del sistem on chip va fatta prima che il kernel parta.&lt;br /&gt;
Il vero file contenente le informazioni (in forma testuale) è il device tree, ma dato che queste informazioni devono essere usate in tempi rapidi al boot, questo file viene compilato e si ottiene il dtb.&lt;br /&gt;
&lt;br /&gt;
Possiamo ottenere i tre file di cui abbiamo bisogno montando l'immagine ISO:&lt;br /&gt;
    mount -o ro finnix-armhf.iso /mnt&lt;br /&gt;
ed andando nella cartella /mnt/boot/armhf/ possiamo trovare i file copiarli e smontare l'immagine.&lt;br /&gt;
Possiamo far partire la macchina virtuale.&lt;br /&gt;
&lt;br /&gt;
Paravirtualizzazione&lt;br /&gt;
Il prefisso para significa simile, affine a.&lt;br /&gt;
La paravirtualizzazione è un'ottimizzazione del processo di virtualizzazione (Non so come scriverlo).&lt;br /&gt;
Il punto è che l'implementazione di una virtualizzazione completa talvolta non è efficiente.&lt;br /&gt;
E.g. Algoritmi di minimizzazione delle seek su dischi virtuali sono inutili.&lt;br /&gt;
&lt;br /&gt;
Il kernel del guest deve essere informato di stare girando su un device virtuale.&lt;br /&gt;
Viola i principi di Popek e Goldber.&lt;br /&gt;
&lt;br /&gt;
Meglio emulare perfettamente i sistemi reali o fare device ottimizzati per il mondo virtuale? Dipende.&lt;br /&gt;
&lt;br /&gt;
La virtualizzazione si può realizzare su vari livelli ed in varie modalità&lt;br /&gt;
&lt;br /&gt;
Uno dei modi è quello di catturare le system call (system call interposition) o quello di catturare le chiamate ad una libreria.&lt;br /&gt;
&lt;br /&gt;
Catturare le system call&lt;br /&gt;
ptrace&lt;br /&gt;
ptrace è una system call che si può usare per virtualizzare le system call.&lt;br /&gt;
&lt;br /&gt;
Catturare le chiamate a libreria&lt;br /&gt;
Funziona con le librerie dinamiche. Le librerie dinamiche sono linkate all'eseguibile solamente in fase di esecuzione.&lt;br /&gt;
Un eseguibile non contiene le librerie, ma solamente le dipendenze alle librerie.&lt;br /&gt;
Per vedere quali sono si può usare il comando ldd path_eseguibile.&lt;br /&gt;
&lt;br /&gt;
Esempio&lt;br /&gt;
la system call open non è altro che una funzione che solleva una trap tramite il comando syscall.&lt;br /&gt;
Potremmo trovare un modo per sovrascrivere la open della libreria standard (libc) in modo che la nuova open sia chiamata al posto dell'altra.&lt;br /&gt;
&lt;br /&gt;
purelibc è una libreria che prende gran parte delle system call e le ridefinisce.&lt;br /&gt;
&lt;br /&gt;
Autovirtualizzazione&lt;br /&gt;
Il processo stesso virtualizza le sue chiamate.&lt;br /&gt;
L'hypervisor è una libreria.&lt;br /&gt;
Sicuro NO, utile SI.&lt;br /&gt;
In ViewOS questo meccanismo viene usato in varie occasioni.&lt;br /&gt;
Permette di utilizzale le librerie oltre il loro scopo originale; e.g. se abbiamo una libreria che agisce su dei file e siamo interessati esclusivamente alla logica possiamo fare in modo che le system call relative ai file siano virtualizzate&lt;br /&gt;
in modo tale da fornire i dati in altro modo.&lt;br /&gt;
&lt;br /&gt;
Libreria --&amp;gt; purelibc&lt;br /&gt;
purelibc libreria di autovirtualizzazione&lt;br /&gt;
&lt;br /&gt;
UserModeLinux e ViewOS usano virtualizzano entrambe tramite system call interposition.&lt;br /&gt;
User mode linux virtualizza tutte le chiamate, ViewOS no.&lt;br /&gt;
&lt;br /&gt;
Namespaces: implementano la virtualizzazione parziale (come ViewOS) ma all'interno del kernel. Sono più efficienti ma complicano il kernel.&lt;br /&gt;
&lt;br /&gt;
Xen&lt;br /&gt;
L'idea su cui Xen si basa è quella di fondere insieme kernel ed hypervisor.&lt;br /&gt;
Siccome scrivere un intero kernel sarebbe un compito troppo impegnativo, Xen si ispira all'architettura a microkernel.&lt;br /&gt;
Xen implementa uno strato, che si trova direttamente sull'hardware, che usa paravirtualizzazione e che contiene solo le funzioni necessarie a gestire le macchine virtuali.&lt;br /&gt;
In Xen &amp;quot;tutte le macchine sono uguali, ma una è più uguale delle altre&amp;quot;.&lt;br /&gt;
Di per sè Xen non supporta direttamente l'hardware della macchina reale, infatti non contiene i device driver, ma sfrutta quelli della prima macchina virtuale (domain0).&lt;br /&gt;
Se non configurato diversamente tutti i device vengono gestiti dal domain0. Tutto ciò che arriva dall'hardware viene inoltrato al domain0. Domain0 vede quindi device virtuali che sono rappresentazioni esatte dei device fisici.&lt;br /&gt;
&lt;br /&gt;
KVM ha dimostrato di avere ormai le stesse prestazioni di Xen. Quindi potrebbe essere una buona idea quella di usare un Linux minimale con KVM al posto di Xen.&lt;br /&gt;
&lt;br /&gt;
== March 08 2018 ==&lt;br /&gt;
[https://etherpad.wikimedia.org/p/DZIAaEWQHp Etherpad 08/03/18]&lt;br /&gt;
&lt;br /&gt;
[https://liveunibo-my.sharepoint.com/:u:/g/personal/francesco_fornari2_studio_unibo_it/EQq0OH4TShpFpQB01x-TmAgB111c9tPOwkxV_BdP9swVJw?e=AbDxex Registrazione 08/03/18]&lt;br /&gt;
&lt;br /&gt;
Esempio fatto dal prof:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
 truncate -s 1G mydisk&lt;br /&gt;
 umview xterm		&lt;br /&gt;
&lt;br /&gt;
#nel terminale xterm&lt;br /&gt;
&lt;br /&gt;
 um_add_service umdev&lt;br /&gt;
 um_add_service umfuse&lt;br /&gt;
&lt;br /&gt;
 ls /dev/hda&lt;br /&gt;
&lt;br /&gt;
 mount -t umdevmbr mydisk /dev/hda&lt;br /&gt;
 ls /dev/hda&lt;br /&gt;
&lt;br /&gt;
 fdisk /dev/hda&lt;br /&gt;
&lt;br /&gt;
# basta creare una partizione primaria con i valori di default&lt;br /&gt;
&lt;br /&gt;
 ls /dev/hda1&lt;br /&gt;
&lt;br /&gt;
 /sbin/mkfs.ext2 /dev/hda1		# make file system ext 2&lt;br /&gt;
 /sbin/fsck.ext2 -f /dev/hda1	# file system check &lt;br /&gt;
&lt;br /&gt;
 ls /mnt&lt;br /&gt;
&lt;br /&gt;
 mount -o rw+ -t umfuseext2 /dev/hda1 /mnt&lt;br /&gt;
 ls /mnt&lt;br /&gt;
&lt;br /&gt;
# echo &amp;quot;ciao&amp;quot; &amp;gt; /mnt/ciao&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== March 13 2018 ==&lt;br /&gt;
[https://etherpad.wikimedia.org/p/qKAqRNgtxt Etherpad 13/03/18]&lt;br /&gt;
&lt;br /&gt;
[https://liveunibo-my.sharepoint.com/:u:/g/personal/francesco_fornari2_studio_unibo_it/Ed7XFMhWD9tEjVhCAVij9PQB66auNxzCMUG53Xl9veDlkw?e=JHtQN1 Registrazione 13/03/18]&lt;br /&gt;
&lt;br /&gt;
Parte dell'esempio fatto dal prof. Qua viene usato in entrambi i terminali '''vdens''', mentre il prof a lezione ha usato per uno umnet e vdens per l'altro.&lt;br /&gt;
Sono necessari '''[https://github.com/rd235/vdens vdens]''' ,'''[https://github.com/rd235/vdeplug4 vdeplug4]''' ( e forse anche '''[https://github.com/rd235/vxvdex vxvdex]''').&lt;br /&gt;
&lt;br /&gt;
Per entrambe le sessioni del terminale setto una variabile d'ambiente in modo che mi cerchi la ''libvdeplug.so.4'' in ''/usr/local/lib''.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
 export LD_LIBRARY_PATH=/lib:/usr/lib:/usr/local/lib&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Terminale 1&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
 vdens vxvde://&lt;br /&gt;
 ip link set vde0 up&lt;br /&gt;
 ip addr add 10.0.0.1/24 dev vde0&lt;br /&gt;
 &lt;br /&gt;
 ping 10.0.0.2&lt;br /&gt;
&lt;br /&gt;
 nc 10.0.0.2 2222&lt;br /&gt;
&lt;br /&gt;
#scrivendo dei messaggi nel terminale 1 compariranno nel 2 e viceversa &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Terminale 2&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
 vdens vxvde://&lt;br /&gt;
 ip link set vde0 up&lt;br /&gt;
 ip addr add 10.0.0.1/24 dev vde0&lt;br /&gt;
&lt;br /&gt;
#ora nel terminale 1 posso eseguire ping 10.0.0.2&lt;br /&gt;
&lt;br /&gt;
 nc -l 2222&lt;br /&gt;
#ora nel terminale 1 posso eseguire  nc 10.0.0.2 2222&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== March 15 2018 ==&lt;br /&gt;
&lt;br /&gt;
Lezione sospesa causa lauree.&lt;br /&gt;
&lt;br /&gt;
== March 20 2018 ==&lt;br /&gt;
== March 22 2018 ==&lt;br /&gt;
== March 27 2018 ==&lt;br /&gt;
== April 05 2018 ==&lt;br /&gt;
== April 10 2018 ==&lt;br /&gt;
== April 12 2018 ==&lt;br /&gt;
== April 17 2018 ==&lt;br /&gt;
== April 19 2018 ==&lt;br /&gt;
== April 24 2018 ==&lt;br /&gt;
== April 27 2018 ==&lt;br /&gt;
== May 03 2018 ==&lt;br /&gt;
== May 08 2018 ==&lt;br /&gt;
== May 10 2018 ==&lt;br /&gt;
== May 15 2018 ==&lt;br /&gt;
== May 17 2018 ==&lt;br /&gt;
== May 22 2018 ==&lt;br /&gt;
== May 24 2018 ==&lt;/div&gt;</summary>
		<author><name>Leonardo</name></author>
	</entry>
	<entry>
		<id>https://vsd.v2.cs.unibo.it/wiki/index.php?title=2018_Spring_Term&amp;diff=56</id>
		<title>2018 Spring Term</title>
		<link rel="alternate" type="text/html" href="https://vsd.v2.cs.unibo.it/wiki/index.php?title=2018_Spring_Term&amp;diff=56"/>
		<updated>2018-03-13T14:32:57Z</updated>

		<summary type="html">&lt;p&gt;Leonardo: /* March 15 2018 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== February 27 2018 ==&lt;br /&gt;
&lt;br /&gt;
===Virtualità===&lt;br /&gt;
&lt;br /&gt;
Virtualizzare qualcosa significa fornire un oggetto che possa essere usato (stessa interfaccia) efficacemente al posto dell'altro.&lt;br /&gt;
Se si usa una scarpa per piantare un chiodo, la scarpa è un &amp;quot;martello virtuale&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
====Memoria virtuale====&lt;br /&gt;
*Interfaccia della memoria principale: load(indirizzo), store(indirizzo, oggetto).&lt;br /&gt;
*Semantica: se eseguo store(i, a) seguito da load(i), la seconda operazione ritornerà a.&lt;br /&gt;
La memoria secondaria può essere usata per implementare l'interfaccia di quella primaria.&lt;br /&gt;
Anche l'hardware di un calcolatore può essere visto come un'entità astratta che parla il linguaggio ISA del processore di cui fa uso.&lt;br /&gt;
Se virtualizziamo l'hardware tramite un programma che ne implementa la stessa interfaccia otteniamo una macchina virtuale.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Possibilità di virtualizzare il tempo.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Significato di '''virtualsquare'''&lt;br /&gt;
&lt;br /&gt;
Una piazza dove i vari tipi di virtualià coesistono, un laboratorio internazionale sulla virtualità.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Concetto di VIEW====&lt;br /&gt;
&lt;br /&gt;
I processi &amp;quot;vedono&amp;quot; l'ambiente di esecuzione. Se non stanno eseguendo istruzioni di calcolo, i processi si interfacciano (&amp;quot;vedono&amp;quot;) al sistema (accedono a memoria, fanno routing) usando system calls.&lt;br /&gt;
ogni processo può vedere un file diverso allo stesso path name&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;umview&amp;lt;/u&amp;gt; vecchia macchina parziale virtuale&lt;br /&gt;
&lt;br /&gt;
L''''Hypervisor''' agisce parzialmente come un debugger: intercetta le system calls ed intraprende azioni.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Virtual Distributed Ethernet (VDE)====&lt;br /&gt;
&lt;br /&gt;
VDE è una rete Ethernet virtuale che può essere distribuita su diverse macchine fisiche presenti in rete.&lt;br /&gt;
Usare concetti reali nello &amp;quot;Standard&amp;quot; ethernet e vitualizzarli. ad esmpio uno switch con il vitual switch, più avanti nelle versioni sono stati creati dei &amp;quot;tasselli&amp;quot; che si posso interfacciare con vari altri tasselli per formare una rete virtuale personalizzata&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Tip: &amp;quot;Trovate il nome giusto da dare a tutte le cose che pensate&amp;quot;&lt;br /&gt;
&lt;br /&gt;
PeDaNTe S.P.A. (Physical, Data link, Network, Transport, Session, Presentation, Application)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Internet of Threads====&lt;br /&gt;
&lt;br /&gt;
Dare un indirizzo IP non alla macchina, ma direttamente al processo, questo ti pemette di migrare i processi da una macchina ad un'altra senza che il client deve riconfigurare l'IP della chiamata a quel processo (IPV6 è praticamente obbligatorio per rendere Internet of Threads utillizzabile, perchè IPV4 ha troppi pochi indirizzi)&lt;br /&gt;
Se abbiamo due web servers virtuali sulla stessa macchina fisica vogliamo che abbiano comunque diversi indirizzi ip.&lt;br /&gt;
&lt;br /&gt;
== March 01 2018 ==&lt;br /&gt;
&lt;br /&gt;
[https://etherpad.wikimedia.org/p/W8ZohgqjJy etherpad]&lt;br /&gt;
&lt;br /&gt;
===INFO===&lt;br /&gt;
Le comunicazioni e lo scambio di idee avverranno nel gruppo Telegram.&lt;br /&gt;
&lt;br /&gt;
Per iscriversi/scrivere nel wiki occorre il [http://so.v2.cs.unibo.it/wiki/index.php?title=Qui numero magico] usato già per il corso di Sistemi Operativi.&lt;br /&gt;
&lt;br /&gt;
Vecchio materiale [http://www.cs.unibo.it/~renzo/vsd/ Virtual System Design]&lt;br /&gt;
&lt;br /&gt;
Altre risorse su [https://github.com/rd235 GitHub]&lt;br /&gt;
&lt;br /&gt;
Nickname del docente&lt;br /&gt;
* rd235 (derivato dai documenti RFC es. [https://tools.ietf.org/html/rfc1166 RFC 1166])&lt;br /&gt;
* iz4dje&lt;br /&gt;
&lt;br /&gt;
===Tipi di virtualizzazione===&lt;br /&gt;
[https://www.finnix.org/ finnix] è un sistema operativo live da usare &amp;quot;quando si è nei guai&amp;quot;, non ha interfaccia grafica e permette di provare i sistemi virtuali; la versione 1.0 è quella che funziona bene.&lt;br /&gt;
&lt;br /&gt;
Il sistema operativo in cui viene eseguita la macchina virtuale, viene detto '''host''' (ospitante) mentre la macchina virtuale è chiamata '''guest''' (ospite).&lt;br /&gt;
&lt;br /&gt;
====Emulazione====&lt;br /&gt;
Scrivendo un emulatore di una macchina emulo i passi di esecuzione dell'hardware: convertire le istruzioni dal linguaggio del processore che vuole essere emulato ad istruzioni per la macchina host.&lt;br /&gt;
&lt;br /&gt;
'''QEMU''' è un esempio: traduce il codice macchina guest in codice macchina host (traduzione dinamica). QEMU contiene i sorgenti con le istruzioni del vari assembler (sottoforma di funzioni) che vengono messi in un vettore; fa uso di cache come fanno i browser: il codice non viene tradotto di continuo ma viene eseguito quello &amp;quot;in cache&amp;quot; e questo lo fa risultare 15/20 volte più veloce.&lt;br /&gt;
&lt;br /&gt;
('''NOTA:''' rimane in sospeso '''slirp''', lo vedremo nel dettaglio in futuro)&lt;br /&gt;
&lt;br /&gt;
'''Busybox''' è un piccolo eseguibile che combina diverse applicazioni standard Unix, in pratica le utility Unix non sono altro che un alias di busybox; si può scaricare e compilare i binari di busybox per ''mips'' (arm), se attivo il servizio ''binfmt-support'' il sistema utilizzerà QEMU per eseguire i binari mips, mentre disattivando il servizio sarà possibile utilizzare '''KVM'''.&lt;br /&gt;
&lt;br /&gt;
=====Esempi di emulazione=====&lt;br /&gt;
''qemu-system-''* (wildcard) è il comando per lanciare un'architettura:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
qemu-system-x86_64 -cdrom finnix-110.iso -m 512M&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
dove ''-m 512M'' è la quantità di ram che gli rendiamo disponibile.&lt;br /&gt;
&lt;br /&gt;
Con QEMU possiamo eseguire ''finnix-armhf-111.iso'' su macchina x86_64 seguendo le [https://www.finnix.org/ARM istruzioni], per avere successo bisogna montare l'immagine iso ed estrarre il contenuto (''initrd.xz'', ''linux'' e ''vexpress-v2p-ca9.dtb'') della directory ''/boot/armhf/'' nella cartella da cui si lancia QEMU.&lt;br /&gt;
&lt;br /&gt;
====Virtualizzazione parziale====&lt;br /&gt;
&lt;br /&gt;
'''KVM''', acronimo di Kernel-based Virtual Machine (utilizza VT per Intel e AMD-V per AMD), ha un comportamento a &amp;quot;trigger&amp;quot; il processore si comporta come la routine normale, soltanto quando vengono lanciate determinate call viene cambiata la routine da quella nativa a quella apposita per simulare altri processori. Questo permette di avere macchine virtuali molto più veloci, visto che girano direttamente sul processore escluse le varie eccezione rende una correlazione praticamente 1 a 1.&lt;br /&gt;
&lt;br /&gt;
Si può abilitare la modalità KVM in QEMU usando l'opzione ''-enable-kvm'' che ovviamente richiede che i moduli siano stati caricati.&lt;br /&gt;
&lt;br /&gt;
====Virtualizzazione totale====&lt;br /&gt;
&lt;br /&gt;
'''VirtualBox''' è un esempio di virtualizzazione totale.&lt;br /&gt;
&lt;br /&gt;
'''User-Mode Linux''' è una macchina virtuale i cui sorgenti sono presenti nel kernel linux; usa lo stesso supporto del comando '''strace''' (utile per vedere le system call di un comando); User-Mode Linux è molto vicino a '''umview''' (che appunto sta per '''User-Mode View'''); in quanto a velocità sta in mezzo tra qemu e kvm.&lt;br /&gt;
&lt;br /&gt;
=====Differenze=====&lt;br /&gt;
&lt;br /&gt;
QEMU virtualizzazione a livello di processo ('''PVM'''), KVM a livello di sistema ('''SVM'''), VirtualBox a livello di system call ('''SCVM'''). Vedere [http://www.cs.unibo.it/~renzo/so/lucidi/so-03-struttura-os-1p.pdf#page=36 pag. 36] e a seguire.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
qemu-system-* é formato dal processore di traduzioni dinamiche qemu_(arm, mips...) e dalle periferiche.&lt;br /&gt;
&lt;br /&gt;
kvm invece non fa uso di qemu ma al posto suo usa l'accellerazione del processore (oltre alle periferiche).&lt;br /&gt;
&lt;br /&gt;
qemu funziona come processo utente e non ha bisogno di permessi eccezionali;&lt;br /&gt;
kvm invece risulta vincolato al processore (egrep '^flags.*(vmx|svm)' /proc/cpuinfo) e occorre anche il modulo kernel (lsmod | grep kvm).&lt;br /&gt;
&lt;br /&gt;
VirtualBox non può convivere con KVM.&lt;br /&gt;
&lt;br /&gt;
===Macchine virtuali in rete===&lt;br /&gt;
&lt;br /&gt;
È possibile creare una propria macchina virtuale online usando le credenziali unibo [https://okeanos.grnet.gr/home/ okeanos grnet]&lt;br /&gt;
&lt;br /&gt;
Tip: '''molly-guard''' protects machines from accidental shutdowns/reboots (via ssh); è un software che se si tenta un reboot/poweroff chiede di digitare il nome della macchina, in questo modo si evita di spegnere una macchina virtuale non voluta tra le varie finestre aperte.&lt;br /&gt;
&lt;br /&gt;
== March 06 2018 ==&lt;br /&gt;
[https://etherpad.wikimedia.org/p/avNnD5LhXk Eterpad 06/03/2018]&lt;br /&gt;
&lt;br /&gt;
[https://liveunibo-my.sharepoint.com/:u:/g/personal/francesco_fornari2_studio_unibo_it/EcBK9t59dgVEjB6Y-Lx2tAEBaQ2THtSBZZk9W7p9j5cVSQ?e=tHE25e Registrazione 06/03/2018]&lt;br /&gt;
&lt;br /&gt;
Popek e Goldberg [https://en.wikipedia.org/wiki/Popek_and_Goldberg_virtualization_requirements wiki]&lt;br /&gt;
I requisiti di virtualizzazione di Popek e Goldberg sono delle condizioni sufficienti per un'architettura per supportare la virtualizzazione (in modo efficiente).&lt;br /&gt;
&lt;br /&gt;
Requisiti:&lt;br /&gt;
&lt;br /&gt;
'''Equivalenza / Fedeltà''' - Un programma virtualizzato dovrebbe esibire un comportamento essenzialmente identico a quello dimostrato quando viene eseguito su una macchina equivalente direttamente.&lt;br /&gt;
&lt;br /&gt;
'''Controllo delle risorse / Sicurezza''' - L'hypervisor deve avere il completo controllo delle risorse virtualizzate.&lt;br /&gt;
&lt;br /&gt;
'''Efficienza / Performance'''&lt;br /&gt;
&lt;br /&gt;
Davoli: &amp;quot;Il livello di sicurezza richiesto dipende dall'applicazione&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Popek e Goldberg descrivono anche le caratteristiche che l'ISA della macchina ospite deve possedere per essere in grado di far girare un hypervisor che goda dei tre requisiti precedenti.&lt;br /&gt;
Teoremi di virtualizzazione&lt;br /&gt;
&lt;br /&gt;
Le istruzioni di un'ISA sono classificate in tre gruppi:&lt;br /&gt;
Istruzioni privilegiate - le istruzioni che generano una trap se il processore è in user mode e non generano una trap se il processore è in kernel mode (e.g. divisione per zero, system call, accesso ad indirizzo di memoria non mappato).&lt;br /&gt;
Istruzioni control sensitive - le istruzioni che cercano di cambiare la configurazione delle risorse del sistema (e.g. assegnare memoria, acquisire una risorsa).&lt;br /&gt;
Istruzioni behavior sensitive - istruzioni che hanno comportamenti diversi a seconda della configurazione delle risorse (e.g. istruzioni che dipendono dal valore del registro di rilocazione o dalla modalità di esecuzione del processore).&lt;br /&gt;
&lt;br /&gt;
Teorema relativo alle istruzioni privilegiate&lt;br /&gt;
Si può creare una VM effettiva se e solo se le istruzioni privilegiate sono un sovrainsieme dell'unione delle istruzioni degli altri due tipi.&lt;br /&gt;
In altre parole tutte le istruzioni &amp;quot;sensitive&amp;quot; generano una trap se eseguite in user mode.&lt;br /&gt;
Le istruzioni sensitive sono quelle che possono influenzare il corretto funzionamento dell'hypervisor. Queste istruzioni devono essere tutte privilegiate.&lt;br /&gt;
Le istruzioni control sensitive devono essere privilegiate perché il processo virtualizzato non deve essere in grado di allocare nuove risorse a sè stesso.&lt;br /&gt;
Le istruzioni behavior sensitive devono essere privilegiate perché il processo virtualizzato deve vedere ...&lt;br /&gt;
&lt;br /&gt;
IBM Introduce le maccine virtuali per introdurre sistemi operativi multitasking su macchine monotask&lt;br /&gt;
&lt;br /&gt;
Negli anni 90 si producono processori senza considerare il teorema di Popek e Goldberg. L'ISA di questi processori non soddisfava le condizioni del teorema.&lt;br /&gt;
Vengono aggiunte istruzioni di virtualizzazione (da usare in ambienti virtuali) che non sono altro che le corrispettive istruzioni privilegiate delle istruzioni sensitive non privilegiate.&lt;br /&gt;
&lt;br /&gt;
Libro Robert P. Goldberg: Architectural Principles for Virtual Computer Systems.&lt;br /&gt;
&lt;br /&gt;
È difficile fare virtualizzazione tramite l'emulazione (problemi di efficienza).&lt;br /&gt;
&lt;br /&gt;
L'emulazione consiste nell'emulare ogni singola funzione del sistema operativo e lo traduce per il livello sottostante&lt;br /&gt;
La simulazioneconsiste nel convertire il codice macchina assembler per un certo processore in codice macchina del processore di base&lt;br /&gt;
Simulatore: apparenza (Simulatore di volo)&lt;br /&gt;
Emulatore: funzione effettiva e veritiera al 100% ma per questa molto più lenta (Ali di cera del racconto greco)&lt;br /&gt;
&lt;br /&gt;
Qemu può funzionare in due modalità:&lt;br /&gt;
Macchina virtuale: virtualità al livello di sistema (qemu-system-*).&lt;br /&gt;
Virtualizzare solo il processore: tutte le system call sono gestite dal sistema operativo reale (qemu-*).&lt;br /&gt;
&lt;br /&gt;
Esperimento: Prendere busybox per architettura arm ed eseguirlo anche se siamo su un intel&lt;br /&gt;
Busybox: eseguibile che fa da contenitore per molti comandi. Permette di risparmiare RAM e disco.&lt;br /&gt;
Sistemi embedded: spesso fatti con kernel + busybox + applicazione per cui è nato il sistema.&lt;br /&gt;
&lt;br /&gt;
Finnix su arm:&lt;br /&gt;
https://www.finnix.org/ARM&lt;br /&gt;
Per far partire Finnix su Arm occorre prendere dall'immagine del file system dei file che servono all'esterno.&lt;br /&gt;
Per far partire un sistema occorre sicuramente il kernel e poi in molti casi (non tutti) il file system.&lt;br /&gt;
Il kernel viene caricato dal boot loader.&lt;br /&gt;
&lt;br /&gt;
qemu-system-arm -display none -machine vexpress-a9 -m 256 \&lt;br /&gt;
-kernel linux -initrd initrd.xz -dtb vexpress-v2p-ca9.dtb \&lt;br /&gt;
-append &amp;quot;console=ttyAMA0,115200&amp;quot; -serial stdio \&lt;br /&gt;
-drive file=finnix-armhf.iso,id=cd0,format=raw \&lt;br /&gt;
-device virtio-blk-device,drive=cd0&lt;br /&gt;
&lt;br /&gt;
kernel linux --&amp;gt; cerca nella directory corrente un file &amp;quot;linux&amp;quot; contenente il kernel&lt;br /&gt;
&lt;br /&gt;
initrd è un file di configurazione che contiene i moduli kernel usato per l'inizializzazione.&lt;br /&gt;
Perché nasce initrd?&lt;br /&gt;
Il kernel quando fa boot ha bisogno dei driver per tutti i device che servono per caricare il kernel.&lt;br /&gt;
Se vogliamo progettare un kernel che possa fare boot da vari dischi inserire tutti i device driver di questi dischi all'interno del kernel non è una scelta saggia.&lt;br /&gt;
Possiamo studiare un modo per caricare solo i &amp;quot;moduli&amp;quot; che ci servono --&amp;gt; initrd&lt;br /&gt;
&lt;br /&gt;
Quando il kernel è partito possiamo caricare i moduli che ci servono.&lt;br /&gt;
initrd ha al suo interno un file system (banale, di sola lettura, ad allocazione contigua) che contiene un'altra copia dei moduli kernel (.ko).&lt;br /&gt;
In questo modo si ha un piccolo spreco di memoria: i moduli compaiono sia in initrd che in /sys/. Ad oggi anche nei sistemi embedded si preferisce accettare questo piccolo spreco di memoria flash.&lt;br /&gt;
&lt;br /&gt;
DTB (Device Tree Binary)&lt;br /&gt;
Descrive la configurazione del sistem on chip alla partenza.&lt;br /&gt;
sistem on chip: integratore contenente processore ed altre cose. Lo stesso integrato può essere configurato per fare un sacco di cose diverse. Si possono scegliere le interfacce dei device da attivare.&lt;br /&gt;
Quando il kernel parte, il kernel deve sapere quali device ha a disposizione, quindi la configurazione del sistem on chip va fatta prima che il kernel parta.&lt;br /&gt;
Il vero file contenente le informazioni (in forma testuale) è il device tree, ma dato che queste informazioni devono essere usate in tempi rapidi al boot, questo file viene compilato e si ottiene il dtb.&lt;br /&gt;
&lt;br /&gt;
Possiamo ottenere i tre file di cui abbiamo bisogno montando l'immagine ISO:&lt;br /&gt;
    mount -o ro finnix-armhf.iso /mnt&lt;br /&gt;
ed andando nella cartella /mnt/boot/armhf/ possiamo trovare i file copiarli e smontare l'immagine.&lt;br /&gt;
Possiamo far partire la macchina virtuale.&lt;br /&gt;
&lt;br /&gt;
Paravirtualizzazione&lt;br /&gt;
Il prefisso para significa simile, affine a.&lt;br /&gt;
La paravirtualizzazione è un'ottimizzazione del processo di virtualizzazione (Non so come scriverlo).&lt;br /&gt;
Il punto è che l'implementazione di una virtualizzazione completa talvolta non è efficiente.&lt;br /&gt;
E.g. Algoritmi di minimizzazione delle seek su dischi virtuali sono inutili.&lt;br /&gt;
&lt;br /&gt;
Il kernel del guest deve essere informato di stare girando su un device virtuale.&lt;br /&gt;
Viola i principi di Popek e Goldber.&lt;br /&gt;
&lt;br /&gt;
Meglio emulare perfettamente i sistemi reali o fare device ottimizzati per il mondo virtuale? Dipende.&lt;br /&gt;
&lt;br /&gt;
La virtualizzazione si può realizzare su vari livelli ed in varie modalità&lt;br /&gt;
&lt;br /&gt;
Uno dei modi è quello di catturare le system call (system call interposition) o quello di catturare le chiamate ad una libreria.&lt;br /&gt;
&lt;br /&gt;
Catturare le system call&lt;br /&gt;
ptrace&lt;br /&gt;
ptrace è una system call che si può usare per virtualizzare le system call.&lt;br /&gt;
&lt;br /&gt;
Catturare le chiamate a libreria&lt;br /&gt;
Funziona con le librerie dinamiche. Le librerie dinamiche sono linkate all'eseguibile solamente in fase di esecuzione.&lt;br /&gt;
Un eseguibile non contiene le librerie, ma solamente le dipendenze alle librerie.&lt;br /&gt;
Per vedere quali sono si può usare il comando ldd path_eseguibile.&lt;br /&gt;
&lt;br /&gt;
Esempio&lt;br /&gt;
la system call open non è altro che una funzione che solleva una trap tramite il comando syscall.&lt;br /&gt;
Potremmo trovare un modo per sovrascrivere la open della libreria standard (libc) in modo che la nuova open sia chiamata al posto dell'altra.&lt;br /&gt;
&lt;br /&gt;
purelibc è una libreria che prende gran parte delle system call e le ridefinisce.&lt;br /&gt;
&lt;br /&gt;
Autovirtualizzazione&lt;br /&gt;
Il processo stesso virtualizza le sue chiamate.&lt;br /&gt;
L'hypervisor è una libreria.&lt;br /&gt;
Sicuro NO, utile SI.&lt;br /&gt;
In ViewOS questo meccanismo viene usato in varie occasioni.&lt;br /&gt;
Permette di utilizzale le librerie oltre il loro scopo originale; e.g. se abbiamo una libreria che agisce su dei file e siamo interessati esclusivamente alla logica possiamo fare in modo che le system call relative ai file siano virtualizzate&lt;br /&gt;
in modo tale da fornire i dati in altro modo.&lt;br /&gt;
&lt;br /&gt;
Libreria --&amp;gt; purelibc&lt;br /&gt;
purelibc libreria di autovirtualizzazione&lt;br /&gt;
&lt;br /&gt;
UserModeLinux e ViewOS usano virtualizzano entrambe tramite system call interposition.&lt;br /&gt;
User mode linux virtualizza tutte le chiamate, ViewOS no.&lt;br /&gt;
&lt;br /&gt;
Namespaces: implementano la virtualizzazione parziale (come ViewOS) ma all'interno del kernel. Sono più efficienti ma complicano il kernel.&lt;br /&gt;
&lt;br /&gt;
Xen&lt;br /&gt;
L'idea su cui Xen si basa è quella di fondere insieme kernel ed hypervisor.&lt;br /&gt;
Siccome scrivere un intero kernel sarebbe un compito troppo impegnativo, Xen si ispira all'architettura a microkernel.&lt;br /&gt;
Xen implementa uno strato, che si trova direttamente sull'hardware, che usa paravirtualizzazione e che contiene solo le funzioni necessarie a gestire le macchine virtuali.&lt;br /&gt;
In Xen &amp;quot;tutte le macchine sono uguali, ma una è più uguale delle altre&amp;quot;.&lt;br /&gt;
Di per sè Xen non supporta direttamente l'hardware della macchina reale, infatti non contiene i device driver, ma sfrutta quelli della prima macchina virtuale (domain0).&lt;br /&gt;
Se non configurato diversamente tutti i device vengono gestiti dal domain0. Tutto ciò che arriva dall'hardware viene inoltrato al domain0. Domain0 vede quindi device virtuali che sono rappresentazioni esatte dei device fisici.&lt;br /&gt;
&lt;br /&gt;
KVM ha dimostrato di avere ormai le stesse prestazioni di Xen. Quindi potrebbe essere una buona idea quella di usare un Linux minimale con KVM al posto di Xen.&lt;br /&gt;
&lt;br /&gt;
== March 08 2018 ==&lt;br /&gt;
[https://etherpad.wikimedia.org/p/DZIAaEWQHp Etherpad 08/03/18]&lt;br /&gt;
&lt;br /&gt;
[https://liveunibo-my.sharepoint.com/:u:/g/personal/francesco_fornari2_studio_unibo_it/EQq0OH4TShpFpQB01x-TmAgB111c9tPOwkxV_BdP9swVJw?e=AbDxex Registrazione 08/03/18]&lt;br /&gt;
&lt;br /&gt;
Esempio fatto dal prof:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
 truncate -s 1G mydisk&lt;br /&gt;
 umview xterm		&lt;br /&gt;
&lt;br /&gt;
#nel terminale xterm&lt;br /&gt;
&lt;br /&gt;
 um_add_service umdev&lt;br /&gt;
 um_add_service umfuse&lt;br /&gt;
&lt;br /&gt;
 ls /dev/hda&lt;br /&gt;
&lt;br /&gt;
 mount -t umdevmbr mydisk /dev/hda&lt;br /&gt;
 ls /dev/hda&lt;br /&gt;
&lt;br /&gt;
 fdisk /dev/hda&lt;br /&gt;
&lt;br /&gt;
# basta creare una partizione primaria con i valori di default&lt;br /&gt;
&lt;br /&gt;
 ls /dev/hda1&lt;br /&gt;
&lt;br /&gt;
 /sbin/mkfs.ext2 /dev/hda1		# make file system ext 2&lt;br /&gt;
 /sbin/fsck.ext2 -f /dev/hda1	# file system check &lt;br /&gt;
&lt;br /&gt;
 ls /mnt&lt;br /&gt;
&lt;br /&gt;
 mount -o rw+ -t umfuseext2 /dev/hda1 /mnt&lt;br /&gt;
 ls /mnt&lt;br /&gt;
&lt;br /&gt;
# echo &amp;quot;ciao&amp;quot; &amp;gt; /mnt/ciao&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== March 13 2018 ==&lt;br /&gt;
[https://etherpad.wikimedia.org/p/qKAqRNgtxt Etherpad 13/03/18]&lt;br /&gt;
&lt;br /&gt;
[https://liveunibo-my.sharepoint.com/:u:/g/personal/francesco_fornari2_studio_unibo_it/Ed7XFMhWD9tEjVhCAVij9PQB66auNxzCMUG53Xl9veDlkw?e=JHtQN1 Registrazione 13/03/18]&lt;br /&gt;
&lt;br /&gt;
== March 15 2018 ==&lt;br /&gt;
&lt;br /&gt;
Lezione sospesa causa lauree.&lt;br /&gt;
&lt;br /&gt;
== March 20 2018 ==&lt;br /&gt;
== March 22 2018 ==&lt;br /&gt;
== March 27 2018 ==&lt;br /&gt;
== April 05 2018 ==&lt;br /&gt;
== April 10 2018 ==&lt;br /&gt;
== April 12 2018 ==&lt;br /&gt;
== April 17 2018 ==&lt;br /&gt;
== April 19 2018 ==&lt;br /&gt;
== April 24 2018 ==&lt;br /&gt;
== April 27 2018 ==&lt;br /&gt;
== May 03 2018 ==&lt;br /&gt;
== May 08 2018 ==&lt;br /&gt;
== May 10 2018 ==&lt;br /&gt;
== May 15 2018 ==&lt;br /&gt;
== May 17 2018 ==&lt;br /&gt;
== May 22 2018 ==&lt;br /&gt;
== May 24 2018 ==&lt;/div&gt;</summary>
		<author><name>Leonardo</name></author>
	</entry>
	<entry>
		<id>https://vsd.v2.cs.unibo.it/wiki/index.php?title=2018_Spring_Term&amp;diff=55</id>
		<title>2018 Spring Term</title>
		<link rel="alternate" type="text/html" href="https://vsd.v2.cs.unibo.it/wiki/index.php?title=2018_Spring_Term&amp;diff=55"/>
		<updated>2018-03-13T14:32:25Z</updated>

		<summary type="html">&lt;p&gt;Leonardo: /* March 08 2018 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== February 27 2018 ==&lt;br /&gt;
&lt;br /&gt;
===Virtualità===&lt;br /&gt;
&lt;br /&gt;
Virtualizzare qualcosa significa fornire un oggetto che possa essere usato (stessa interfaccia) efficacemente al posto dell'altro.&lt;br /&gt;
Se si usa una scarpa per piantare un chiodo, la scarpa è un &amp;quot;martello virtuale&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
====Memoria virtuale====&lt;br /&gt;
*Interfaccia della memoria principale: load(indirizzo), store(indirizzo, oggetto).&lt;br /&gt;
*Semantica: se eseguo store(i, a) seguito da load(i), la seconda operazione ritornerà a.&lt;br /&gt;
La memoria secondaria può essere usata per implementare l'interfaccia di quella primaria.&lt;br /&gt;
Anche l'hardware di un calcolatore può essere visto come un'entità astratta che parla il linguaggio ISA del processore di cui fa uso.&lt;br /&gt;
Se virtualizziamo l'hardware tramite un programma che ne implementa la stessa interfaccia otteniamo una macchina virtuale.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Possibilità di virtualizzare il tempo.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Significato di '''virtualsquare'''&lt;br /&gt;
&lt;br /&gt;
Una piazza dove i vari tipi di virtualià coesistono, un laboratorio internazionale sulla virtualità.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Concetto di VIEW====&lt;br /&gt;
&lt;br /&gt;
I processi &amp;quot;vedono&amp;quot; l'ambiente di esecuzione. Se non stanno eseguendo istruzioni di calcolo, i processi si interfacciano (&amp;quot;vedono&amp;quot;) al sistema (accedono a memoria, fanno routing) usando system calls.&lt;br /&gt;
ogni processo può vedere un file diverso allo stesso path name&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;umview&amp;lt;/u&amp;gt; vecchia macchina parziale virtuale&lt;br /&gt;
&lt;br /&gt;
L''''Hypervisor''' agisce parzialmente come un debugger: intercetta le system calls ed intraprende azioni.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Virtual Distributed Ethernet (VDE)====&lt;br /&gt;
&lt;br /&gt;
VDE è una rete Ethernet virtuale che può essere distribuita su diverse macchine fisiche presenti in rete.&lt;br /&gt;
Usare concetti reali nello &amp;quot;Standard&amp;quot; ethernet e vitualizzarli. ad esmpio uno switch con il vitual switch, più avanti nelle versioni sono stati creati dei &amp;quot;tasselli&amp;quot; che si posso interfacciare con vari altri tasselli per formare una rete virtuale personalizzata&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Tip: &amp;quot;Trovate il nome giusto da dare a tutte le cose che pensate&amp;quot;&lt;br /&gt;
&lt;br /&gt;
PeDaNTe S.P.A. (Physical, Data link, Network, Transport, Session, Presentation, Application)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Internet of Threads====&lt;br /&gt;
&lt;br /&gt;
Dare un indirizzo IP non alla macchina, ma direttamente al processo, questo ti pemette di migrare i processi da una macchina ad un'altra senza che il client deve riconfigurare l'IP della chiamata a quel processo (IPV6 è praticamente obbligatorio per rendere Internet of Threads utillizzabile, perchè IPV4 ha troppi pochi indirizzi)&lt;br /&gt;
Se abbiamo due web servers virtuali sulla stessa macchina fisica vogliamo che abbiano comunque diversi indirizzi ip.&lt;br /&gt;
&lt;br /&gt;
== March 01 2018 ==&lt;br /&gt;
&lt;br /&gt;
[https://etherpad.wikimedia.org/p/W8ZohgqjJy etherpad]&lt;br /&gt;
&lt;br /&gt;
===INFO===&lt;br /&gt;
Le comunicazioni e lo scambio di idee avverranno nel gruppo Telegram.&lt;br /&gt;
&lt;br /&gt;
Per iscriversi/scrivere nel wiki occorre il [http://so.v2.cs.unibo.it/wiki/index.php?title=Qui numero magico] usato già per il corso di Sistemi Operativi.&lt;br /&gt;
&lt;br /&gt;
Vecchio materiale [http://www.cs.unibo.it/~renzo/vsd/ Virtual System Design]&lt;br /&gt;
&lt;br /&gt;
Altre risorse su [https://github.com/rd235 GitHub]&lt;br /&gt;
&lt;br /&gt;
Nickname del docente&lt;br /&gt;
* rd235 (derivato dai documenti RFC es. [https://tools.ietf.org/html/rfc1166 RFC 1166])&lt;br /&gt;
* iz4dje&lt;br /&gt;
&lt;br /&gt;
===Tipi di virtualizzazione===&lt;br /&gt;
[https://www.finnix.org/ finnix] è un sistema operativo live da usare &amp;quot;quando si è nei guai&amp;quot;, non ha interfaccia grafica e permette di provare i sistemi virtuali; la versione 1.0 è quella che funziona bene.&lt;br /&gt;
&lt;br /&gt;
Il sistema operativo in cui viene eseguita la macchina virtuale, viene detto '''host''' (ospitante) mentre la macchina virtuale è chiamata '''guest''' (ospite).&lt;br /&gt;
&lt;br /&gt;
====Emulazione====&lt;br /&gt;
Scrivendo un emulatore di una macchina emulo i passi di esecuzione dell'hardware: convertire le istruzioni dal linguaggio del processore che vuole essere emulato ad istruzioni per la macchina host.&lt;br /&gt;
&lt;br /&gt;
'''QEMU''' è un esempio: traduce il codice macchina guest in codice macchina host (traduzione dinamica). QEMU contiene i sorgenti con le istruzioni del vari assembler (sottoforma di funzioni) che vengono messi in un vettore; fa uso di cache come fanno i browser: il codice non viene tradotto di continuo ma viene eseguito quello &amp;quot;in cache&amp;quot; e questo lo fa risultare 15/20 volte più veloce.&lt;br /&gt;
&lt;br /&gt;
('''NOTA:''' rimane in sospeso '''slirp''', lo vedremo nel dettaglio in futuro)&lt;br /&gt;
&lt;br /&gt;
'''Busybox''' è un piccolo eseguibile che combina diverse applicazioni standard Unix, in pratica le utility Unix non sono altro che un alias di busybox; si può scaricare e compilare i binari di busybox per ''mips'' (arm), se attivo il servizio ''binfmt-support'' il sistema utilizzerà QEMU per eseguire i binari mips, mentre disattivando il servizio sarà possibile utilizzare '''KVM'''.&lt;br /&gt;
&lt;br /&gt;
=====Esempi di emulazione=====&lt;br /&gt;
''qemu-system-''* (wildcard) è il comando per lanciare un'architettura:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
qemu-system-x86_64 -cdrom finnix-110.iso -m 512M&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
dove ''-m 512M'' è la quantità di ram che gli rendiamo disponibile.&lt;br /&gt;
&lt;br /&gt;
Con QEMU possiamo eseguire ''finnix-armhf-111.iso'' su macchina x86_64 seguendo le [https://www.finnix.org/ARM istruzioni], per avere successo bisogna montare l'immagine iso ed estrarre il contenuto (''initrd.xz'', ''linux'' e ''vexpress-v2p-ca9.dtb'') della directory ''/boot/armhf/'' nella cartella da cui si lancia QEMU.&lt;br /&gt;
&lt;br /&gt;
====Virtualizzazione parziale====&lt;br /&gt;
&lt;br /&gt;
'''KVM''', acronimo di Kernel-based Virtual Machine (utilizza VT per Intel e AMD-V per AMD), ha un comportamento a &amp;quot;trigger&amp;quot; il processore si comporta come la routine normale, soltanto quando vengono lanciate determinate call viene cambiata la routine da quella nativa a quella apposita per simulare altri processori. Questo permette di avere macchine virtuali molto più veloci, visto che girano direttamente sul processore escluse le varie eccezione rende una correlazione praticamente 1 a 1.&lt;br /&gt;
&lt;br /&gt;
Si può abilitare la modalità KVM in QEMU usando l'opzione ''-enable-kvm'' che ovviamente richiede che i moduli siano stati caricati.&lt;br /&gt;
&lt;br /&gt;
====Virtualizzazione totale====&lt;br /&gt;
&lt;br /&gt;
'''VirtualBox''' è un esempio di virtualizzazione totale.&lt;br /&gt;
&lt;br /&gt;
'''User-Mode Linux''' è una macchina virtuale i cui sorgenti sono presenti nel kernel linux; usa lo stesso supporto del comando '''strace''' (utile per vedere le system call di un comando); User-Mode Linux è molto vicino a '''umview''' (che appunto sta per '''User-Mode View'''); in quanto a velocità sta in mezzo tra qemu e kvm.&lt;br /&gt;
&lt;br /&gt;
=====Differenze=====&lt;br /&gt;
&lt;br /&gt;
QEMU virtualizzazione a livello di processo ('''PVM'''), KVM a livello di sistema ('''SVM'''), VirtualBox a livello di system call ('''SCVM'''). Vedere [http://www.cs.unibo.it/~renzo/so/lucidi/so-03-struttura-os-1p.pdf#page=36 pag. 36] e a seguire.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
qemu-system-* é formato dal processore di traduzioni dinamiche qemu_(arm, mips...) e dalle periferiche.&lt;br /&gt;
&lt;br /&gt;
kvm invece non fa uso di qemu ma al posto suo usa l'accellerazione del processore (oltre alle periferiche).&lt;br /&gt;
&lt;br /&gt;
qemu funziona come processo utente e non ha bisogno di permessi eccezionali;&lt;br /&gt;
kvm invece risulta vincolato al processore (egrep '^flags.*(vmx|svm)' /proc/cpuinfo) e occorre anche il modulo kernel (lsmod | grep kvm).&lt;br /&gt;
&lt;br /&gt;
VirtualBox non può convivere con KVM.&lt;br /&gt;
&lt;br /&gt;
===Macchine virtuali in rete===&lt;br /&gt;
&lt;br /&gt;
È possibile creare una propria macchina virtuale online usando le credenziali unibo [https://okeanos.grnet.gr/home/ okeanos grnet]&lt;br /&gt;
&lt;br /&gt;
Tip: '''molly-guard''' protects machines from accidental shutdowns/reboots (via ssh); è un software che se si tenta un reboot/poweroff chiede di digitare il nome della macchina, in questo modo si evita di spegnere una macchina virtuale non voluta tra le varie finestre aperte.&lt;br /&gt;
&lt;br /&gt;
== March 06 2018 ==&lt;br /&gt;
[https://etherpad.wikimedia.org/p/avNnD5LhXk Eterpad 06/03/2018]&lt;br /&gt;
&lt;br /&gt;
[https://liveunibo-my.sharepoint.com/:u:/g/personal/francesco_fornari2_studio_unibo_it/EcBK9t59dgVEjB6Y-Lx2tAEBaQ2THtSBZZk9W7p9j5cVSQ?e=tHE25e Registrazione 06/03/2018]&lt;br /&gt;
&lt;br /&gt;
Popek e Goldberg [https://en.wikipedia.org/wiki/Popek_and_Goldberg_virtualization_requirements wiki]&lt;br /&gt;
I requisiti di virtualizzazione di Popek e Goldberg sono delle condizioni sufficienti per un'architettura per supportare la virtualizzazione (in modo efficiente).&lt;br /&gt;
&lt;br /&gt;
Requisiti:&lt;br /&gt;
&lt;br /&gt;
'''Equivalenza / Fedeltà''' - Un programma virtualizzato dovrebbe esibire un comportamento essenzialmente identico a quello dimostrato quando viene eseguito su una macchina equivalente direttamente.&lt;br /&gt;
&lt;br /&gt;
'''Controllo delle risorse / Sicurezza''' - L'hypervisor deve avere il completo controllo delle risorse virtualizzate.&lt;br /&gt;
&lt;br /&gt;
'''Efficienza / Performance'''&lt;br /&gt;
&lt;br /&gt;
Davoli: &amp;quot;Il livello di sicurezza richiesto dipende dall'applicazione&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Popek e Goldberg descrivono anche le caratteristiche che l'ISA della macchina ospite deve possedere per essere in grado di far girare un hypervisor che goda dei tre requisiti precedenti.&lt;br /&gt;
Teoremi di virtualizzazione&lt;br /&gt;
&lt;br /&gt;
Le istruzioni di un'ISA sono classificate in tre gruppi:&lt;br /&gt;
Istruzioni privilegiate - le istruzioni che generano una trap se il processore è in user mode e non generano una trap se il processore è in kernel mode (e.g. divisione per zero, system call, accesso ad indirizzo di memoria non mappato).&lt;br /&gt;
Istruzioni control sensitive - le istruzioni che cercano di cambiare la configurazione delle risorse del sistema (e.g. assegnare memoria, acquisire una risorsa).&lt;br /&gt;
Istruzioni behavior sensitive - istruzioni che hanno comportamenti diversi a seconda della configurazione delle risorse (e.g. istruzioni che dipendono dal valore del registro di rilocazione o dalla modalità di esecuzione del processore).&lt;br /&gt;
&lt;br /&gt;
Teorema relativo alle istruzioni privilegiate&lt;br /&gt;
Si può creare una VM effettiva se e solo se le istruzioni privilegiate sono un sovrainsieme dell'unione delle istruzioni degli altri due tipi.&lt;br /&gt;
In altre parole tutte le istruzioni &amp;quot;sensitive&amp;quot; generano una trap se eseguite in user mode.&lt;br /&gt;
Le istruzioni sensitive sono quelle che possono influenzare il corretto funzionamento dell'hypervisor. Queste istruzioni devono essere tutte privilegiate.&lt;br /&gt;
Le istruzioni control sensitive devono essere privilegiate perché il processo virtualizzato non deve essere in grado di allocare nuove risorse a sè stesso.&lt;br /&gt;
Le istruzioni behavior sensitive devono essere privilegiate perché il processo virtualizzato deve vedere ...&lt;br /&gt;
&lt;br /&gt;
IBM Introduce le maccine virtuali per introdurre sistemi operativi multitasking su macchine monotask&lt;br /&gt;
&lt;br /&gt;
Negli anni 90 si producono processori senza considerare il teorema di Popek e Goldberg. L'ISA di questi processori non soddisfava le condizioni del teorema.&lt;br /&gt;
Vengono aggiunte istruzioni di virtualizzazione (da usare in ambienti virtuali) che non sono altro che le corrispettive istruzioni privilegiate delle istruzioni sensitive non privilegiate.&lt;br /&gt;
&lt;br /&gt;
Libro Robert P. Goldberg: Architectural Principles for Virtual Computer Systems.&lt;br /&gt;
&lt;br /&gt;
È difficile fare virtualizzazione tramite l'emulazione (problemi di efficienza).&lt;br /&gt;
&lt;br /&gt;
L'emulazione consiste nell'emulare ogni singola funzione del sistema operativo e lo traduce per il livello sottostante&lt;br /&gt;
La simulazioneconsiste nel convertire il codice macchina assembler per un certo processore in codice macchina del processore di base&lt;br /&gt;
Simulatore: apparenza (Simulatore di volo)&lt;br /&gt;
Emulatore: funzione effettiva e veritiera al 100% ma per questa molto più lenta (Ali di cera del racconto greco)&lt;br /&gt;
&lt;br /&gt;
Qemu può funzionare in due modalità:&lt;br /&gt;
Macchina virtuale: virtualità al livello di sistema (qemu-system-*).&lt;br /&gt;
Virtualizzare solo il processore: tutte le system call sono gestite dal sistema operativo reale (qemu-*).&lt;br /&gt;
&lt;br /&gt;
Esperimento: Prendere busybox per architettura arm ed eseguirlo anche se siamo su un intel&lt;br /&gt;
Busybox: eseguibile che fa da contenitore per molti comandi. Permette di risparmiare RAM e disco.&lt;br /&gt;
Sistemi embedded: spesso fatti con kernel + busybox + applicazione per cui è nato il sistema.&lt;br /&gt;
&lt;br /&gt;
Finnix su arm:&lt;br /&gt;
https://www.finnix.org/ARM&lt;br /&gt;
Per far partire Finnix su Arm occorre prendere dall'immagine del file system dei file che servono all'esterno.&lt;br /&gt;
Per far partire un sistema occorre sicuramente il kernel e poi in molti casi (non tutti) il file system.&lt;br /&gt;
Il kernel viene caricato dal boot loader.&lt;br /&gt;
&lt;br /&gt;
qemu-system-arm -display none -machine vexpress-a9 -m 256 \&lt;br /&gt;
-kernel linux -initrd initrd.xz -dtb vexpress-v2p-ca9.dtb \&lt;br /&gt;
-append &amp;quot;console=ttyAMA0,115200&amp;quot; -serial stdio \&lt;br /&gt;
-drive file=finnix-armhf.iso,id=cd0,format=raw \&lt;br /&gt;
-device virtio-blk-device,drive=cd0&lt;br /&gt;
&lt;br /&gt;
kernel linux --&amp;gt; cerca nella directory corrente un file &amp;quot;linux&amp;quot; contenente il kernel&lt;br /&gt;
&lt;br /&gt;
initrd è un file di configurazione che contiene i moduli kernel usato per l'inizializzazione.&lt;br /&gt;
Perché nasce initrd?&lt;br /&gt;
Il kernel quando fa boot ha bisogno dei driver per tutti i device che servono per caricare il kernel.&lt;br /&gt;
Se vogliamo progettare un kernel che possa fare boot da vari dischi inserire tutti i device driver di questi dischi all'interno del kernel non è una scelta saggia.&lt;br /&gt;
Possiamo studiare un modo per caricare solo i &amp;quot;moduli&amp;quot; che ci servono --&amp;gt; initrd&lt;br /&gt;
&lt;br /&gt;
Quando il kernel è partito possiamo caricare i moduli che ci servono.&lt;br /&gt;
initrd ha al suo interno un file system (banale, di sola lettura, ad allocazione contigua) che contiene un'altra copia dei moduli kernel (.ko).&lt;br /&gt;
In questo modo si ha un piccolo spreco di memoria: i moduli compaiono sia in initrd che in /sys/. Ad oggi anche nei sistemi embedded si preferisce accettare questo piccolo spreco di memoria flash.&lt;br /&gt;
&lt;br /&gt;
DTB (Device Tree Binary)&lt;br /&gt;
Descrive la configurazione del sistem on chip alla partenza.&lt;br /&gt;
sistem on chip: integratore contenente processore ed altre cose. Lo stesso integrato può essere configurato per fare un sacco di cose diverse. Si possono scegliere le interfacce dei device da attivare.&lt;br /&gt;
Quando il kernel parte, il kernel deve sapere quali device ha a disposizione, quindi la configurazione del sistem on chip va fatta prima che il kernel parta.&lt;br /&gt;
Il vero file contenente le informazioni (in forma testuale) è il device tree, ma dato che queste informazioni devono essere usate in tempi rapidi al boot, questo file viene compilato e si ottiene il dtb.&lt;br /&gt;
&lt;br /&gt;
Possiamo ottenere i tre file di cui abbiamo bisogno montando l'immagine ISO:&lt;br /&gt;
    mount -o ro finnix-armhf.iso /mnt&lt;br /&gt;
ed andando nella cartella /mnt/boot/armhf/ possiamo trovare i file copiarli e smontare l'immagine.&lt;br /&gt;
Possiamo far partire la macchina virtuale.&lt;br /&gt;
&lt;br /&gt;
Paravirtualizzazione&lt;br /&gt;
Il prefisso para significa simile, affine a.&lt;br /&gt;
La paravirtualizzazione è un'ottimizzazione del processo di virtualizzazione (Non so come scriverlo).&lt;br /&gt;
Il punto è che l'implementazione di una virtualizzazione completa talvolta non è efficiente.&lt;br /&gt;
E.g. Algoritmi di minimizzazione delle seek su dischi virtuali sono inutili.&lt;br /&gt;
&lt;br /&gt;
Il kernel del guest deve essere informato di stare girando su un device virtuale.&lt;br /&gt;
Viola i principi di Popek e Goldber.&lt;br /&gt;
&lt;br /&gt;
Meglio emulare perfettamente i sistemi reali o fare device ottimizzati per il mondo virtuale? Dipende.&lt;br /&gt;
&lt;br /&gt;
La virtualizzazione si può realizzare su vari livelli ed in varie modalità&lt;br /&gt;
&lt;br /&gt;
Uno dei modi è quello di catturare le system call (system call interposition) o quello di catturare le chiamate ad una libreria.&lt;br /&gt;
&lt;br /&gt;
Catturare le system call&lt;br /&gt;
ptrace&lt;br /&gt;
ptrace è una system call che si può usare per virtualizzare le system call.&lt;br /&gt;
&lt;br /&gt;
Catturare le chiamate a libreria&lt;br /&gt;
Funziona con le librerie dinamiche. Le librerie dinamiche sono linkate all'eseguibile solamente in fase di esecuzione.&lt;br /&gt;
Un eseguibile non contiene le librerie, ma solamente le dipendenze alle librerie.&lt;br /&gt;
Per vedere quali sono si può usare il comando ldd path_eseguibile.&lt;br /&gt;
&lt;br /&gt;
Esempio&lt;br /&gt;
la system call open non è altro che una funzione che solleva una trap tramite il comando syscall.&lt;br /&gt;
Potremmo trovare un modo per sovrascrivere la open della libreria standard (libc) in modo che la nuova open sia chiamata al posto dell'altra.&lt;br /&gt;
&lt;br /&gt;
purelibc è una libreria che prende gran parte delle system call e le ridefinisce.&lt;br /&gt;
&lt;br /&gt;
Autovirtualizzazione&lt;br /&gt;
Il processo stesso virtualizza le sue chiamate.&lt;br /&gt;
L'hypervisor è una libreria.&lt;br /&gt;
Sicuro NO, utile SI.&lt;br /&gt;
In ViewOS questo meccanismo viene usato in varie occasioni.&lt;br /&gt;
Permette di utilizzale le librerie oltre il loro scopo originale; e.g. se abbiamo una libreria che agisce su dei file e siamo interessati esclusivamente alla logica possiamo fare in modo che le system call relative ai file siano virtualizzate&lt;br /&gt;
in modo tale da fornire i dati in altro modo.&lt;br /&gt;
&lt;br /&gt;
Libreria --&amp;gt; purelibc&lt;br /&gt;
purelibc libreria di autovirtualizzazione&lt;br /&gt;
&lt;br /&gt;
UserModeLinux e ViewOS usano virtualizzano entrambe tramite system call interposition.&lt;br /&gt;
User mode linux virtualizza tutte le chiamate, ViewOS no.&lt;br /&gt;
&lt;br /&gt;
Namespaces: implementano la virtualizzazione parziale (come ViewOS) ma all'interno del kernel. Sono più efficienti ma complicano il kernel.&lt;br /&gt;
&lt;br /&gt;
Xen&lt;br /&gt;
L'idea su cui Xen si basa è quella di fondere insieme kernel ed hypervisor.&lt;br /&gt;
Siccome scrivere un intero kernel sarebbe un compito troppo impegnativo, Xen si ispira all'architettura a microkernel.&lt;br /&gt;
Xen implementa uno strato, che si trova direttamente sull'hardware, che usa paravirtualizzazione e che contiene solo le funzioni necessarie a gestire le macchine virtuali.&lt;br /&gt;
In Xen &amp;quot;tutte le macchine sono uguali, ma una è più uguale delle altre&amp;quot;.&lt;br /&gt;
Di per sè Xen non supporta direttamente l'hardware della macchina reale, infatti non contiene i device driver, ma sfrutta quelli della prima macchina virtuale (domain0).&lt;br /&gt;
Se non configurato diversamente tutti i device vengono gestiti dal domain0. Tutto ciò che arriva dall'hardware viene inoltrato al domain0. Domain0 vede quindi device virtuali che sono rappresentazioni esatte dei device fisici.&lt;br /&gt;
&lt;br /&gt;
KVM ha dimostrato di avere ormai le stesse prestazioni di Xen. Quindi potrebbe essere una buona idea quella di usare un Linux minimale con KVM al posto di Xen.&lt;br /&gt;
&lt;br /&gt;
== March 08 2018 ==&lt;br /&gt;
[https://etherpad.wikimedia.org/p/DZIAaEWQHp Etherpad 08/03/18]&lt;br /&gt;
&lt;br /&gt;
[https://liveunibo-my.sharepoint.com/:u:/g/personal/francesco_fornari2_studio_unibo_it/EQq0OH4TShpFpQB01x-TmAgB111c9tPOwkxV_BdP9swVJw?e=AbDxex Registrazione 08/03/18]&lt;br /&gt;
&lt;br /&gt;
Esempio fatto dal prof:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
 truncate -s 1G mydisk&lt;br /&gt;
 umview xterm		&lt;br /&gt;
&lt;br /&gt;
#nel terminale xterm&lt;br /&gt;
&lt;br /&gt;
 um_add_service umdev&lt;br /&gt;
 um_add_service umfuse&lt;br /&gt;
&lt;br /&gt;
 ls /dev/hda&lt;br /&gt;
&lt;br /&gt;
 mount -t umdevmbr mydisk /dev/hda&lt;br /&gt;
 ls /dev/hda&lt;br /&gt;
&lt;br /&gt;
 fdisk /dev/hda&lt;br /&gt;
&lt;br /&gt;
# basta creare una partizione primaria con i valori di default&lt;br /&gt;
&lt;br /&gt;
 ls /dev/hda1&lt;br /&gt;
&lt;br /&gt;
 /sbin/mkfs.ext2 /dev/hda1		# make file system ext 2&lt;br /&gt;
 /sbin/fsck.ext2 -f /dev/hda1	# file system check &lt;br /&gt;
&lt;br /&gt;
 ls /mnt&lt;br /&gt;
&lt;br /&gt;
 mount -o rw+ -t umfuseext2 /dev/hda1 /mnt&lt;br /&gt;
 ls /mnt&lt;br /&gt;
&lt;br /&gt;
# echo &amp;quot;ciao&amp;quot; &amp;gt; /mnt/ciao&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== March 13 2018 ==&lt;br /&gt;
[https://etherpad.wikimedia.org/p/qKAqRNgtxt Etherpad 13/03/18]&lt;br /&gt;
&lt;br /&gt;
[https://liveunibo-my.sharepoint.com/:u:/g/personal/francesco_fornari2_studio_unibo_it/Ed7XFMhWD9tEjVhCAVij9PQB66auNxzCMUG53Xl9veDlkw?e=JHtQN1 Registrazione 13/03/18]&lt;br /&gt;
&lt;br /&gt;
== March 15 2018 ==&lt;br /&gt;
== March 20 2018 ==&lt;br /&gt;
== March 22 2018 ==&lt;br /&gt;
== March 27 2018 ==&lt;br /&gt;
== April 05 2018 ==&lt;br /&gt;
== April 10 2018 ==&lt;br /&gt;
== April 12 2018 ==&lt;br /&gt;
== April 17 2018 ==&lt;br /&gt;
== April 19 2018 ==&lt;br /&gt;
== April 24 2018 ==&lt;br /&gt;
== April 27 2018 ==&lt;br /&gt;
== May 03 2018 ==&lt;br /&gt;
== May 08 2018 ==&lt;br /&gt;
== May 10 2018 ==&lt;br /&gt;
== May 15 2018 ==&lt;br /&gt;
== May 17 2018 ==&lt;br /&gt;
== May 22 2018 ==&lt;br /&gt;
== May 24 2018 ==&lt;/div&gt;</summary>
		<author><name>Leonardo</name></author>
	</entry>
	<entry>
		<id>https://vsd.v2.cs.unibo.it/wiki/index.php?title=2018_Spring_Term&amp;diff=50</id>
		<title>2018 Spring Term</title>
		<link rel="alternate" type="text/html" href="https://vsd.v2.cs.unibo.it/wiki/index.php?title=2018_Spring_Term&amp;diff=50"/>
		<updated>2018-03-09T20:45:37Z</updated>

		<summary type="html">&lt;p&gt;Leonardo: /* March 08 2018 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== February 27 2018 ==&lt;br /&gt;
&lt;br /&gt;
===Virtualità===&lt;br /&gt;
&lt;br /&gt;
Virtualizzare qualcosa significa fornire un oggetto che possa essere usato (stessa interfaccia) efficacemente al posto dell'altro.&lt;br /&gt;
Se si usa una scarpa per piantare un chiodo, la scarpa è un &amp;quot;martello virtuale&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
====Memoria virtuale====&lt;br /&gt;
*Interfaccia della memoria principale: load(indirizzo), store(indirizzo, oggetto).&lt;br /&gt;
*Semantica: se eseguo store(i, a) seguito da load(i), la seconda operazione ritornerà a.&lt;br /&gt;
La memoria secondaria può essere usata per implementare l'interfaccia di quella primaria.&lt;br /&gt;
Anche l'hardware di un calcolatore può essere visto come un'entità astratta che parla il linguaggio ISA del processore di cui fa uso.&lt;br /&gt;
Se virtualizziamo l'hardware tramite un programma che ne implementa la stessa interfaccia otteniamo una macchina virtuale.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Possibilità di virtualizzare il tempo.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Significato di '''virtualsquare'''&lt;br /&gt;
&lt;br /&gt;
Una piazza dove i vari tipi di virtualià coesistono, un laboratorio internazionale sulla virtualità.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Concetto di VIEW====&lt;br /&gt;
&lt;br /&gt;
I processi &amp;quot;vedono&amp;quot; l'ambiente di esecuzione. Se non stanno eseguendo istruzioni di calcolo, i processi si interfacciano (&amp;quot;vedono&amp;quot;) al sistema (accedono a memoria, fanno routing) usando system calls.&lt;br /&gt;
ogni processo può vedere un file diverso allo stesso path name&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;umview&amp;lt;/u&amp;gt; vecchia macchina parziale virtuale&lt;br /&gt;
&lt;br /&gt;
L''''Hypervisor''' agisce parzialmente come un debugger: intercetta le system calls ed intraprende azioni.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Virtual Distributed Ethernet (VDE)====&lt;br /&gt;
&lt;br /&gt;
VDE è una rete Ethernet virtuale che può essere distribuita su diverse macchine fisiche presenti in rete.&lt;br /&gt;
Usare concetti reali nello &amp;quot;Standard&amp;quot; ethernet e vitualizzarli. ad esmpio uno switch con il vitual switch, più avanti nelle versioni sono stati creati dei &amp;quot;tasselli&amp;quot; che si posso interfacciare con vari altri tasselli per formare una rete virtuale personalizzata&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Tip: &amp;quot;Trovate il nome giusto da dare a tutte le cose che pensate&amp;quot;&lt;br /&gt;
&lt;br /&gt;
PeDaNTe S.P.A. (Physical, Data link, Network, Transport, Session, Presentation, Application)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Internet of Threads====&lt;br /&gt;
&lt;br /&gt;
Dare un indirizzo IP non alla macchina, ma direttamente al processo, questo ti pemette di migrare i processi da una macchina ad un'altra senza che il client deve riconfigurare l'IP della chiamata a quel processo (IPV6 è praticamente obbligatorio per rendere Internet of Threads utillizzabile, perchè IPV4 ha troppi pochi indirizzi)&lt;br /&gt;
Se abbiamo due web servers virtuali sulla stessa macchina fisica vogliamo che abbiano comunque diversi indirizzi ip.&lt;br /&gt;
&lt;br /&gt;
== March 01 2018 ==&lt;br /&gt;
&lt;br /&gt;
[https://etherpad.wikimedia.org/p/W8ZohgqjJy etherpad]&lt;br /&gt;
&lt;br /&gt;
===INFO===&lt;br /&gt;
Le comunicazioni e lo scambio di idee avverranno nel gruppo Telegram.&lt;br /&gt;
&lt;br /&gt;
Per iscriversi/scrivere nel wiki occorre il [http://so.v2.cs.unibo.it/wiki/index.php?title=Qui numero magico] usato già per il corso di Sistemi Operativi.&lt;br /&gt;
&lt;br /&gt;
Vecchio materiale [http://www.cs.unibo.it/~renzo/vsd/ Virtual System Design]&lt;br /&gt;
&lt;br /&gt;
Altre risorse su [https://github.com/rd235 GitHub]&lt;br /&gt;
&lt;br /&gt;
Nickname del docente&lt;br /&gt;
* rd235 (derivato dai documenti RFC es. [https://tools.ietf.org/html/rfc1166 RFC 1166])&lt;br /&gt;
* iz4dje&lt;br /&gt;
&lt;br /&gt;
===Tipi di virtualizzazione===&lt;br /&gt;
[https://www.finnix.org/ finnix] è un sistema operativo live da usare &amp;quot;quando si è nei guai&amp;quot;, non ha interfaccia grafica e permette di provare i sistemi virtuali; la versione 1.0 è quella che funziona bene.&lt;br /&gt;
&lt;br /&gt;
Il sistema operativo in cui viene eseguita la macchina virtuale, viene detto '''host''' (ospitante) mentre la macchina virtuale è chiamata '''guest''' (ospite).&lt;br /&gt;
&lt;br /&gt;
====Emulazione====&lt;br /&gt;
Scrivendo un emulatore di una macchina emulo i passi di esecuzione dell'hardware: convertire le istruzioni dal linguaggio del processore che vuole essere emulato ad istruzioni per la macchina host.&lt;br /&gt;
&lt;br /&gt;
'''QEMU''' è un esempio: traduce il codice macchina guest in codice macchina host (traduzione dinamica). QEMU contiene i sorgenti con le istruzioni del vari assembler (sottoforma di funzioni) che vengono messi in un vettore; fa uso di cache come fanno i browser: il codice non viene tradotto di continuo ma viene eseguito quello &amp;quot;in cache&amp;quot; e questo lo fa risultare 15/20 volte più veloce.&lt;br /&gt;
&lt;br /&gt;
('''NOTA:''' rimane in sospeso '''slirp''', lo vedremo nel dettaglio in futuro)&lt;br /&gt;
&lt;br /&gt;
'''Busybox''' è un piccolo eseguibile che combina diverse applicazioni standard Unix, in pratica le utility Unix non sono altro che un alias di busybox; si può scaricare e compilare i binari di busybox per ''mips'' (arm), se attivo il servizio ''binfmt-support'' il sistema utilizzerà QEMU per eseguire i binari mips, mentre disattivando il servizio sarà possibile utilizzare '''KVM'''.&lt;br /&gt;
&lt;br /&gt;
=====Esempi di emulazione=====&lt;br /&gt;
''qemu-system-''* (wildcard) è il comando per lanciare un'architettura:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
qemu-system-x86_64 -cdrom finnix-110.iso -m 512M&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
dove ''-m 512M'' è la quantità di ram che gli rendiamo disponibile.&lt;br /&gt;
&lt;br /&gt;
Con QEMU possiamo eseguire ''finnix-armhf-111.iso'' su macchina x86_64 seguendo le [https://www.finnix.org/ARM istruzioni], per avere successo bisogna montare l'immagine iso ed estrarre il contenuto (''initrd.xz'', ''linux'' e ''vexpress-v2p-ca9.dtb'') della directory ''/boot/armhf/'' nella cartella da cui si lancia QEMU.&lt;br /&gt;
&lt;br /&gt;
====Virtualizzazione parziale====&lt;br /&gt;
&lt;br /&gt;
'''KVM''', acronimo di Kernel-based Virtual Machine (utilizza VT per Intel e AMD-V per AMD), ha un comportamento a &amp;quot;trigger&amp;quot; il processore si comporta come la routine normale, soltanto quando vengono lanciate determinate call viene cambiata la routine da quella nativa a quella apposita per simulare altri processori. Questo permette di avere macchine virtuali molto più veloci, visto che girano direttamente sul processore escluse le varie eccezione rende una correlazione praticamente 1 a 1.&lt;br /&gt;
&lt;br /&gt;
Si può abilitare la modalità KVM in QEMU usando l'opzione ''-enable-kvm'' che ovviamente richiede che i moduli siano stati caricati.&lt;br /&gt;
&lt;br /&gt;
====Virtualizzazione totale====&lt;br /&gt;
&lt;br /&gt;
'''VirtualBox''' è un esempio di virtualizzazione totale.&lt;br /&gt;
&lt;br /&gt;
'''User-Mode Linux''' è una macchina virtuale i cui sorgenti sono presenti nel kernel linux; usa lo stesso supporto del comando '''strace''' (utile per vedere le system call di un comando); User-Mode Linux è molto vicino a '''umview''' (che appunto sta per '''User-Mode View'''); in quanto a velocità sta in mezzo tra qemu e kvm.&lt;br /&gt;
&lt;br /&gt;
=====Differenze=====&lt;br /&gt;
&lt;br /&gt;
QEMU virtualizzazione a livello di processo ('''PVM'''), KVM a livello di sistema ('''SVM'''), VirtualBox a livello di system call ('''SCVM'''). Vedere [http://www.cs.unibo.it/~renzo/so/lucidi/so-03-struttura-os-1p.pdf#page=36 pag. 36] e a seguire.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
qemu-system-* é formato dal processore di traduzioni dinamiche qemu_(arm, mips...) e dalle periferiche.&lt;br /&gt;
&lt;br /&gt;
kvm invece non fa uso di qemu ma al posto suo usa l'accellerazione del processore (oltre alle periferiche).&lt;br /&gt;
&lt;br /&gt;
qemu funziona come processo utente e non ha bisogno di permessi eccezionali;&lt;br /&gt;
kvm invece risulta vincolato al processore (egrep '^flags.*(vmx|svm)' /proc/cpuinfo) e occorre anche il modulo kernel (lsmod | grep kvm).&lt;br /&gt;
&lt;br /&gt;
VirtualBox non può convivere con KVM.&lt;br /&gt;
&lt;br /&gt;
===Macchine virtuali in rete===&lt;br /&gt;
&lt;br /&gt;
È possibile creare una propria macchina virtuale online usando le credenziali unibo [https://okeanos.grnet.gr/home/ okeanos grnet]&lt;br /&gt;
&lt;br /&gt;
Tip: '''molly-guard''' protects machines from accidental shutdowns/reboots (via ssh); è un software che se si tenta un reboot/poweroff chiede di digitare il nome della macchina, in questo modo si evita di spegnere una macchina virtuale non voluta tra le varie finestre aperte.&lt;br /&gt;
&lt;br /&gt;
== March 06 2018 ==&lt;br /&gt;
[https://etherpad.wikimedia.org/p/avNnD5LhXk Eterpad 06/03/2018]&lt;br /&gt;
&lt;br /&gt;
[https://liveunibo-my.sharepoint.com/:u:/g/personal/francesco_fornari2_studio_unibo_it/EcBK9t59dgVEjB6Y-Lx2tAEBaQ2THtSBZZk9W7p9j5cVSQ?e=tHE25e Registrazione 06/03/2018]&lt;br /&gt;
&lt;br /&gt;
== March 08 2018 ==&lt;br /&gt;
[https://etherpad.wikimedia.org/p/DZIAaEWQHp Etherpad 08/03/18]&lt;br /&gt;
&lt;br /&gt;
[https://liveunibo-my.sharepoint.com/:u:/g/personal/francesco_fornari2_studio_unibo_it/EQq0OH4TShpFpQB01x-TmAgB111c9tPOwkxV_BdP9swVJw?e=AbDxex Registrazione 08/03/18]&lt;br /&gt;
&lt;br /&gt;
Esempio fatto dal prof:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
 truncate -s 1G mydisk&lt;br /&gt;
 umview xterm		&lt;br /&gt;
&lt;br /&gt;
#nel terminale xterm&lt;br /&gt;
&lt;br /&gt;
 um_add_service umdev&lt;br /&gt;
 um_add_service umfuse&lt;br /&gt;
&lt;br /&gt;
 ls /dev/hda&lt;br /&gt;
&lt;br /&gt;
 mount -t umdevmbr mydisk /dev/hda&lt;br /&gt;
 ls /dev/hda&lt;br /&gt;
&lt;br /&gt;
 fdisk /dev/hda&lt;br /&gt;
&lt;br /&gt;
# basta creare una partizione primaria con i valori di default&lt;br /&gt;
&lt;br /&gt;
 ls /dev/hda1&lt;br /&gt;
&lt;br /&gt;
 /sbin/mkfs.ext2 /dev/hda1		# make file system ext 2&lt;br /&gt;
 /sbin/fsck.ext2 -f /dev/hda1	# file system check &lt;br /&gt;
&lt;br /&gt;
 ls /mnt&lt;br /&gt;
&lt;br /&gt;
 mount -o rw+ -t umfuseext2 /dev/hda1 /mnt&lt;br /&gt;
 ls /mnt&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== March 13 2018 ==&lt;br /&gt;
== March 15 2018 ==&lt;br /&gt;
== March 20 2018 ==&lt;br /&gt;
== March 22 2018 ==&lt;br /&gt;
== March 27 2018 ==&lt;br /&gt;
== April 05 2018 ==&lt;br /&gt;
== April 10 2018 ==&lt;br /&gt;
== April 12 2018 ==&lt;br /&gt;
== April 17 2018 ==&lt;br /&gt;
== April 19 2018 ==&lt;br /&gt;
== April 24 2018 ==&lt;br /&gt;
== April 27 2018 ==&lt;br /&gt;
== May 03 2018 ==&lt;br /&gt;
== May 08 2018 ==&lt;br /&gt;
== May 10 2018 ==&lt;br /&gt;
== May 15 2018 ==&lt;br /&gt;
== May 17 2018 ==&lt;br /&gt;
== May 22 2018 ==&lt;br /&gt;
== May 24 2018 ==&lt;/div&gt;</summary>
		<author><name>Leonardo</name></author>
	</entry>
	<entry>
		<id>https://vsd.v2.cs.unibo.it/wiki/index.php?title=2018_Spring_Term&amp;diff=47</id>
		<title>2018 Spring Term</title>
		<link rel="alternate" type="text/html" href="https://vsd.v2.cs.unibo.it/wiki/index.php?title=2018_Spring_Term&amp;diff=47"/>
		<updated>2018-03-08T14:25:11Z</updated>

		<summary type="html">&lt;p&gt;Leonardo: /* March 08 2018 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== February 27 2018 ==&lt;br /&gt;
&lt;br /&gt;
===Virtualità===&lt;br /&gt;
&lt;br /&gt;
Virtualizzare qualcosa significa fornire un oggetto che possa essere usato (stessa interfaccia) efficacemente al posto dell'altro.&lt;br /&gt;
Se si usa una scarpa per piantare un chiodo, la scarpa è un &amp;quot;martello virtuale&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
====Memoria virtuale====&lt;br /&gt;
*Interfaccia della memoria principale: load(indirizzo), store(indirizzo, oggetto).&lt;br /&gt;
*Semantica: se eseguo store(i, a) seguito da load(i), la seconda operazione ritornerà a.&lt;br /&gt;
La memoria secondaria può essere usata per implementare l'interfaccia di quella primaria.&lt;br /&gt;
Anche l'hardware di un calcolatore può essere visto come un'entità astratta che parla il linguaggio ISA del processore di cui fa uso.&lt;br /&gt;
Se virtualizziamo l'hardware tramite un programma che ne implementa la stessa interfaccia otteniamo una macchina virtuale.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Possibilità di virtualizzare il tempo.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Significato di '''virtualsquare'''&lt;br /&gt;
&lt;br /&gt;
Una piazza dove i vari tipi di virtualià coesistono, un laboratorio internazionale sulla virtualità.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Concetto di VIEW====&lt;br /&gt;
&lt;br /&gt;
I processi &amp;quot;vedono&amp;quot; l'ambiente di esecuzione. Se non stanno eseguendo istruzioni di calcolo, i processi si interfacciano (&amp;quot;vedono&amp;quot;) al sistema (accedono a memoria, fanno routing) usando system calls.&lt;br /&gt;
ogni processo può vedere un file diverso allo stesso path name&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;umview&amp;lt;/u&amp;gt; vecchia macchina parziale virtuale&lt;br /&gt;
&lt;br /&gt;
L''''Hypervisor''' agisce parzialmente come un debugger: intercetta le system calls ed intraprende azioni.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Virtual Distributed Ethernet (VDE)====&lt;br /&gt;
&lt;br /&gt;
VDE è una rete Ethernet virtuale che può essere distribuita su diverse macchine fisiche presenti in rete.&lt;br /&gt;
Usare concetti reali nello &amp;quot;Standard&amp;quot; ethernet e vitualizzarli. ad esmpio uno switch con il vitual switch, più avanti nelle versioni sono stati creati dei &amp;quot;tasselli&amp;quot; che si posso interfacciare con vari altri tasselli per formare una rete virtuale personalizzata&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Tip: &amp;quot;Trovate il nome giusto da dare a tutte le cose che pensate&amp;quot;&lt;br /&gt;
&lt;br /&gt;
PeDaNTe S.P.A. (Physical, Data link, Network, Transport, Session, Presentation, Application)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Internet of Threads====&lt;br /&gt;
&lt;br /&gt;
Dare un indirizzo IP non alla macchina, ma direttamente al processo, questo ti pemette di migrare i processi da una macchina ad un'altra senza che il client deve riconfigurare l'IP della chiamata a quel processo (IPV6 è praticamente obbligatorio per rendere Internet of Threads utillizzabile, perchè IPV4 ha troppi pochi indirizzi)&lt;br /&gt;
Se abbiamo due web servers virtuali sulla stessa macchina fisica vogliamo che abbiano comunque diversi indirizzi ip.&lt;br /&gt;
&lt;br /&gt;
== March 01 2018 ==&lt;br /&gt;
&lt;br /&gt;
[https://etherpad.wikimedia.org/p/W8ZohgqjJy etherpad]&lt;br /&gt;
&lt;br /&gt;
===INFO===&lt;br /&gt;
Le comunicazioni e lo scambio di idee avverranno nel gruppo Telegram.&lt;br /&gt;
&lt;br /&gt;
Per iscriversi/scrivere nel wiki occorre il [http://so.v2.cs.unibo.it/wiki/index.php?title=Qui numero magico] usato già per il corso di Sistemi Operativi.&lt;br /&gt;
&lt;br /&gt;
Vecchio materiale [http://www.cs.unibo.it/~renzo/vsd/ Virtual System Design]&lt;br /&gt;
&lt;br /&gt;
Altre risorse su [https://github.com/rd235 GitHub]&lt;br /&gt;
&lt;br /&gt;
Nickname del docente&lt;br /&gt;
* rd235 (derivato dai documenti RFC es. [https://tools.ietf.org/html/rfc1166 RFC 1166])&lt;br /&gt;
* iz4dje&lt;br /&gt;
&lt;br /&gt;
===Tipi di virtualizzazione===&lt;br /&gt;
[https://www.finnix.org/ finnix] è un sistema operativo live da usare &amp;quot;quando si è nei guai&amp;quot;, non ha interfaccia grafica e permette di provare i sistemi virtuali; la versione 1.0 è quella che funziona bene.&lt;br /&gt;
&lt;br /&gt;
Il sistema operativo in cui viene eseguita la macchina virtuale, viene detto '''host''' (ospitante) mentre la macchina virtuale è chiamata '''guest''' (ospite).&lt;br /&gt;
&lt;br /&gt;
====Emulazione====&lt;br /&gt;
Scrivendo un emulatore di una macchina emulo i passi di esecuzione dell'hardware: convertire le istruzioni dal linguaggio del processore che vuole essere emulato ad istruzioni per la macchina host.&lt;br /&gt;
&lt;br /&gt;
'''QEMU''' è un esempio: traduce il codice macchina guest in codice macchina host (traduzione dinamica). QEMU contiene i sorgenti con le istruzioni del vari assembler (sottoforma di funzioni) che vengono messi in un vettore; fa uso di cache come fanno i browser: il codice non viene tradotto di continuo ma viene eseguito quello &amp;quot;in cache&amp;quot; e questo lo fa risultare 15/20 volte più veloce.&lt;br /&gt;
&lt;br /&gt;
('''NOTA:''' rimane in sospeso '''slirp''', lo vedremo nel dettaglio in futuro)&lt;br /&gt;
&lt;br /&gt;
'''Busybox''' è un piccolo eseguibile che combina diverse applicazioni standard Unix, in pratica le utility Unix non sono altro che un alias di busybox; si può scaricare e compilare i binari di busybox per ''mips'' (arm), se attivo il servizio ''binfmt-support'' il sistema utilizzerà QEMU per eseguire i binari mips, mentre disattivando il servizio sarà possibile utilizzare '''KVM'''.&lt;br /&gt;
&lt;br /&gt;
=====Esempi di emulazione=====&lt;br /&gt;
''qemu-system-''* (wildcard) è il comando per lanciare un'architettura:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
qemu-system-x86_64 -cdrom finnix-110.iso -m 512M&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
dove ''-m 512M'' è la quantità di ram che gli rendiamo disponibile.&lt;br /&gt;
&lt;br /&gt;
Con QEMU possiamo eseguire ''finnix-armhf-111.iso'' su macchina x86_64 seguendo le [https://www.finnix.org/ARM istruzioni], per avere successo bisogna montare l'immagine iso ed estrarre il contenuto (''initrd.xz'', ''linux'' e ''vexpress-v2p-ca9.dtb'') della directory ''/boot/armhf/'' nella cartella da cui si lancia QEMU.&lt;br /&gt;
&lt;br /&gt;
====Virtualizzazione parziale====&lt;br /&gt;
&lt;br /&gt;
'''KVM''', acronimo di Kernel-based Virtual Machine (utilizza VT per Intel e AMD-V per AMD), ha un comportamento a &amp;quot;trigger&amp;quot; il processore si comporta come la routine normale, soltanto quando vengono lanciate determinate call viene cambiata la routine da quella nativa a quella apposita per simulare altri processori. Questo permette di avere macchine virtuali molto più veloci, visto che girano direttamente sul processore escluse le varie eccezione rende una correlazione praticamente 1 a 1.&lt;br /&gt;
&lt;br /&gt;
Si può abilitare la modalità KVM in QEMU usando l'opzione ''-enable-kvm'' che ovviamente richiede che i moduli siano stati caricati.&lt;br /&gt;
&lt;br /&gt;
====Virtualizzazione totale====&lt;br /&gt;
&lt;br /&gt;
'''VirtualBox''' è un esempio di virtualizzazione totale.&lt;br /&gt;
&lt;br /&gt;
'''User-Mode Linux''' è una macchina virtuale i cui sorgenti sono presenti nel kernel linux; usa lo stesso supporto del comando '''strace''' (utile per vedere le system call di un comando); User-Mode Linux è molto vicino a '''umview''' (che appunto sta per '''User-Mode View'''); in quanto a velocità sta in mezzo tra qemu e kvm.&lt;br /&gt;
&lt;br /&gt;
=====Differenze=====&lt;br /&gt;
&lt;br /&gt;
QEMU virtualizzazione a livello di processo ('''PVM'''), KVM a livello di sistema ('''SVM'''), VirtualBox a livello di system call ('''SCVM'''). Vedere [http://www.cs.unibo.it/~renzo/so/lucidi/so-03-struttura-os-1p.pdf#page=36 pag. 36] e a seguire.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
qemu-system-* é formato dal processore di traduzioni dinamiche qemu_(arm, mips...) e dalle periferiche.&lt;br /&gt;
&lt;br /&gt;
kvm invece non fa uso di qemu ma al posto suo usa l'accellerazione del processore (oltre alle periferiche).&lt;br /&gt;
&lt;br /&gt;
qemu funziona come processo utente e non ha bisogno di permessi eccezionali;&lt;br /&gt;
kvm invece risulta vincolato al processore (egrep '^flags.*(vmx|svm)' /proc/cpuinfo) e occorre anche il modulo kernel (lsmod | grep kvm).&lt;br /&gt;
&lt;br /&gt;
VirtualBox non può convivere con KVM.&lt;br /&gt;
&lt;br /&gt;
===Macchine virtuali in rete===&lt;br /&gt;
&lt;br /&gt;
È possibile creare una propria macchina virtuale online usando le credenziali unibo [https://okeanos.grnet.gr/home/ okeanos grnet]&lt;br /&gt;
&lt;br /&gt;
Tip: '''molly-guard''' protects machines from accidental shutdowns/reboots (via ssh); è un software che se si tenta un reboot/poweroff chiede di digitare il nome della macchina, in questo modo si evita di spegnere una macchina virtuale non voluta tra le varie finestre aperte.&lt;br /&gt;
&lt;br /&gt;
== March 06 2018 ==&lt;br /&gt;
[https://etherpad.wikimedia.org/p/avNnD5LhXk Eterpad 06/03/2018]&lt;br /&gt;
&lt;br /&gt;
[https://liveunibo-my.sharepoint.com/:u:/g/personal/francesco_fornari2_studio_unibo_it/EcBK9t59dgVEjB6Y-Lx2tAEBaQ2THtSBZZk9W7p9j5cVSQ?e=tHE25e Registrazione 06/03/2018]&lt;br /&gt;
&lt;br /&gt;
== March 08 2018 ==&lt;br /&gt;
[https://etherpad.wikimedia.org/p/DZIAaEWQHp Etherpad 08/03/18]&lt;br /&gt;
&lt;br /&gt;
Esempio fatto dal prof:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
 truncate -s 1G mydisk&lt;br /&gt;
 umview xterm		&lt;br /&gt;
&lt;br /&gt;
#nel terminale xterm&lt;br /&gt;
&lt;br /&gt;
 umm_add_service umdev&lt;br /&gt;
 umm_add_service umfuse&lt;br /&gt;
&lt;br /&gt;
 ls /dev/hda&lt;br /&gt;
&lt;br /&gt;
 mount -t umdevmbr mydisk /dev/hda&lt;br /&gt;
 ls /dev/hda&lt;br /&gt;
&lt;br /&gt;
 fdisk /dev/hda&lt;br /&gt;
&lt;br /&gt;
# basta creare una partizione primaria con i valori di default&lt;br /&gt;
&lt;br /&gt;
 ls /dev/hda1&lt;br /&gt;
&lt;br /&gt;
 /sbin/mkfs.ext2 /dev/hda1		# make file system ext 2&lt;br /&gt;
 /sbin/fsck.ext2 -f /dev/hda1	# file system check &lt;br /&gt;
&lt;br /&gt;
 ls /mnt&lt;br /&gt;
&lt;br /&gt;
 mount -o rw+ -t umfuseext2 /dev/hda1 /mnt&lt;br /&gt;
 ls /mnt&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== March 13 2018 ==&lt;br /&gt;
== March 15 2018 ==&lt;br /&gt;
== March 20 2018 ==&lt;br /&gt;
== March 22 2018 ==&lt;br /&gt;
== March 27 2018 ==&lt;br /&gt;
== April 05 2018 ==&lt;br /&gt;
== April 10 2018 ==&lt;br /&gt;
== April 12 2018 ==&lt;br /&gt;
== April 17 2018 ==&lt;br /&gt;
== April 19 2018 ==&lt;br /&gt;
== April 24 2018 ==&lt;br /&gt;
== April 27 2018 ==&lt;br /&gt;
== May 03 2018 ==&lt;br /&gt;
== May 08 2018 ==&lt;br /&gt;
== May 10 2018 ==&lt;br /&gt;
== May 15 2018 ==&lt;br /&gt;
== May 17 2018 ==&lt;br /&gt;
== May 22 2018 ==&lt;br /&gt;
== May 24 2018 ==&lt;/div&gt;</summary>
		<author><name>Leonardo</name></author>
	</entry>
	<entry>
		<id>https://vsd.v2.cs.unibo.it/wiki/index.php?title=2018_Spring_Term&amp;diff=46</id>
		<title>2018 Spring Term</title>
		<link rel="alternate" type="text/html" href="https://vsd.v2.cs.unibo.it/wiki/index.php?title=2018_Spring_Term&amp;diff=46"/>
		<updated>2018-03-08T14:24:53Z</updated>

		<summary type="html">&lt;p&gt;Leonardo: /* March 08 2018 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== February 27 2018 ==&lt;br /&gt;
&lt;br /&gt;
===Virtualità===&lt;br /&gt;
&lt;br /&gt;
Virtualizzare qualcosa significa fornire un oggetto che possa essere usato (stessa interfaccia) efficacemente al posto dell'altro.&lt;br /&gt;
Se si usa una scarpa per piantare un chiodo, la scarpa è un &amp;quot;martello virtuale&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
====Memoria virtuale====&lt;br /&gt;
*Interfaccia della memoria principale: load(indirizzo), store(indirizzo, oggetto).&lt;br /&gt;
*Semantica: se eseguo store(i, a) seguito da load(i), la seconda operazione ritornerà a.&lt;br /&gt;
La memoria secondaria può essere usata per implementare l'interfaccia di quella primaria.&lt;br /&gt;
Anche l'hardware di un calcolatore può essere visto come un'entità astratta che parla il linguaggio ISA del processore di cui fa uso.&lt;br /&gt;
Se virtualizziamo l'hardware tramite un programma che ne implementa la stessa interfaccia otteniamo una macchina virtuale.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Possibilità di virtualizzare il tempo.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Significato di '''virtualsquare'''&lt;br /&gt;
&lt;br /&gt;
Una piazza dove i vari tipi di virtualià coesistono, un laboratorio internazionale sulla virtualità.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Concetto di VIEW====&lt;br /&gt;
&lt;br /&gt;
I processi &amp;quot;vedono&amp;quot; l'ambiente di esecuzione. Se non stanno eseguendo istruzioni di calcolo, i processi si interfacciano (&amp;quot;vedono&amp;quot;) al sistema (accedono a memoria, fanno routing) usando system calls.&lt;br /&gt;
ogni processo può vedere un file diverso allo stesso path name&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;umview&amp;lt;/u&amp;gt; vecchia macchina parziale virtuale&lt;br /&gt;
&lt;br /&gt;
L''''Hypervisor''' agisce parzialmente come un debugger: intercetta le system calls ed intraprende azioni.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Virtual Distributed Ethernet (VDE)====&lt;br /&gt;
&lt;br /&gt;
VDE è una rete Ethernet virtuale che può essere distribuita su diverse macchine fisiche presenti in rete.&lt;br /&gt;
Usare concetti reali nello &amp;quot;Standard&amp;quot; ethernet e vitualizzarli. ad esmpio uno switch con il vitual switch, più avanti nelle versioni sono stati creati dei &amp;quot;tasselli&amp;quot; che si posso interfacciare con vari altri tasselli per formare una rete virtuale personalizzata&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Tip: &amp;quot;Trovate il nome giusto da dare a tutte le cose che pensate&amp;quot;&lt;br /&gt;
&lt;br /&gt;
PeDaNTe S.P.A. (Physical, Data link, Network, Transport, Session, Presentation, Application)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Internet of Threads====&lt;br /&gt;
&lt;br /&gt;
Dare un indirizzo IP non alla macchina, ma direttamente al processo, questo ti pemette di migrare i processi da una macchina ad un'altra senza che il client deve riconfigurare l'IP della chiamata a quel processo (IPV6 è praticamente obbligatorio per rendere Internet of Threads utillizzabile, perchè IPV4 ha troppi pochi indirizzi)&lt;br /&gt;
Se abbiamo due web servers virtuali sulla stessa macchina fisica vogliamo che abbiano comunque diversi indirizzi ip.&lt;br /&gt;
&lt;br /&gt;
== March 01 2018 ==&lt;br /&gt;
&lt;br /&gt;
[https://etherpad.wikimedia.org/p/W8ZohgqjJy etherpad]&lt;br /&gt;
&lt;br /&gt;
===INFO===&lt;br /&gt;
Le comunicazioni e lo scambio di idee avverranno nel gruppo Telegram.&lt;br /&gt;
&lt;br /&gt;
Per iscriversi/scrivere nel wiki occorre il [http://so.v2.cs.unibo.it/wiki/index.php?title=Qui numero magico] usato già per il corso di Sistemi Operativi.&lt;br /&gt;
&lt;br /&gt;
Vecchio materiale [http://www.cs.unibo.it/~renzo/vsd/ Virtual System Design]&lt;br /&gt;
&lt;br /&gt;
Altre risorse su [https://github.com/rd235 GitHub]&lt;br /&gt;
&lt;br /&gt;
Nickname del docente&lt;br /&gt;
* rd235 (derivato dai documenti RFC es. [https://tools.ietf.org/html/rfc1166 RFC 1166])&lt;br /&gt;
* iz4dje&lt;br /&gt;
&lt;br /&gt;
===Tipi di virtualizzazione===&lt;br /&gt;
[https://www.finnix.org/ finnix] è un sistema operativo live da usare &amp;quot;quando si è nei guai&amp;quot;, non ha interfaccia grafica e permette di provare i sistemi virtuali; la versione 1.0 è quella che funziona bene.&lt;br /&gt;
&lt;br /&gt;
Il sistema operativo in cui viene eseguita la macchina virtuale, viene detto '''host''' (ospitante) mentre la macchina virtuale è chiamata '''guest''' (ospite).&lt;br /&gt;
&lt;br /&gt;
====Emulazione====&lt;br /&gt;
Scrivendo un emulatore di una macchina emulo i passi di esecuzione dell'hardware: convertire le istruzioni dal linguaggio del processore che vuole essere emulato ad istruzioni per la macchina host.&lt;br /&gt;
&lt;br /&gt;
'''QEMU''' è un esempio: traduce il codice macchina guest in codice macchina host (traduzione dinamica). QEMU contiene i sorgenti con le istruzioni del vari assembler (sottoforma di funzioni) che vengono messi in un vettore; fa uso di cache come fanno i browser: il codice non viene tradotto di continuo ma viene eseguito quello &amp;quot;in cache&amp;quot; e questo lo fa risultare 15/20 volte più veloce.&lt;br /&gt;
&lt;br /&gt;
('''NOTA:''' rimane in sospeso '''slirp''', lo vedremo nel dettaglio in futuro)&lt;br /&gt;
&lt;br /&gt;
'''Busybox''' è un piccolo eseguibile che combina diverse applicazioni standard Unix, in pratica le utility Unix non sono altro che un alias di busybox; si può scaricare e compilare i binari di busybox per ''mips'' (arm), se attivo il servizio ''binfmt-support'' il sistema utilizzerà QEMU per eseguire i binari mips, mentre disattivando il servizio sarà possibile utilizzare '''KVM'''.&lt;br /&gt;
&lt;br /&gt;
=====Esempi di emulazione=====&lt;br /&gt;
''qemu-system-''* (wildcard) è il comando per lanciare un'architettura:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
qemu-system-x86_64 -cdrom finnix-110.iso -m 512M&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
dove ''-m 512M'' è la quantità di ram che gli rendiamo disponibile.&lt;br /&gt;
&lt;br /&gt;
Con QEMU possiamo eseguire ''finnix-armhf-111.iso'' su macchina x86_64 seguendo le [https://www.finnix.org/ARM istruzioni], per avere successo bisogna montare l'immagine iso ed estrarre il contenuto (''initrd.xz'', ''linux'' e ''vexpress-v2p-ca9.dtb'') della directory ''/boot/armhf/'' nella cartella da cui si lancia QEMU.&lt;br /&gt;
&lt;br /&gt;
====Virtualizzazione parziale====&lt;br /&gt;
&lt;br /&gt;
'''KVM''', acronimo di Kernel-based Virtual Machine (utilizza VT per Intel e AMD-V per AMD), ha un comportamento a &amp;quot;trigger&amp;quot; il processore si comporta come la routine normale, soltanto quando vengono lanciate determinate call viene cambiata la routine da quella nativa a quella apposita per simulare altri processori. Questo permette di avere macchine virtuali molto più veloci, visto che girano direttamente sul processore escluse le varie eccezione rende una correlazione praticamente 1 a 1.&lt;br /&gt;
&lt;br /&gt;
Si può abilitare la modalità KVM in QEMU usando l'opzione ''-enable-kvm'' che ovviamente richiede che i moduli siano stati caricati.&lt;br /&gt;
&lt;br /&gt;
====Virtualizzazione totale====&lt;br /&gt;
&lt;br /&gt;
'''VirtualBox''' è un esempio di virtualizzazione totale.&lt;br /&gt;
&lt;br /&gt;
'''User-Mode Linux''' è una macchina virtuale i cui sorgenti sono presenti nel kernel linux; usa lo stesso supporto del comando '''strace''' (utile per vedere le system call di un comando); User-Mode Linux è molto vicino a '''umview''' (che appunto sta per '''User-Mode View'''); in quanto a velocità sta in mezzo tra qemu e kvm.&lt;br /&gt;
&lt;br /&gt;
=====Differenze=====&lt;br /&gt;
&lt;br /&gt;
QEMU virtualizzazione a livello di processo ('''PVM'''), KVM a livello di sistema ('''SVM'''), VirtualBox a livello di system call ('''SCVM'''). Vedere [http://www.cs.unibo.it/~renzo/so/lucidi/so-03-struttura-os-1p.pdf#page=36 pag. 36] e a seguire.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
qemu-system-* é formato dal processore di traduzioni dinamiche qemu_(arm, mips...) e dalle periferiche.&lt;br /&gt;
&lt;br /&gt;
kvm invece non fa uso di qemu ma al posto suo usa l'accellerazione del processore (oltre alle periferiche).&lt;br /&gt;
&lt;br /&gt;
qemu funziona come processo utente e non ha bisogno di permessi eccezionali;&lt;br /&gt;
kvm invece risulta vincolato al processore (egrep '^flags.*(vmx|svm)' /proc/cpuinfo) e occorre anche il modulo kernel (lsmod | grep kvm).&lt;br /&gt;
&lt;br /&gt;
VirtualBox non può convivere con KVM.&lt;br /&gt;
&lt;br /&gt;
===Macchine virtuali in rete===&lt;br /&gt;
&lt;br /&gt;
È possibile creare una propria macchina virtuale online usando le credenziali unibo [https://okeanos.grnet.gr/home/ okeanos grnet]&lt;br /&gt;
&lt;br /&gt;
Tip: '''molly-guard''' protects machines from accidental shutdowns/reboots (via ssh); è un software che se si tenta un reboot/poweroff chiede di digitare il nome della macchina, in questo modo si evita di spegnere una macchina virtuale non voluta tra le varie finestre aperte.&lt;br /&gt;
&lt;br /&gt;
== March 06 2018 ==&lt;br /&gt;
[https://etherpad.wikimedia.org/p/avNnD5LhXk Eterpad 06/03/2018]&lt;br /&gt;
&lt;br /&gt;
[https://liveunibo-my.sharepoint.com/:u:/g/personal/francesco_fornari2_studio_unibo_it/EcBK9t59dgVEjB6Y-Lx2tAEBaQ2THtSBZZk9W7p9j5cVSQ?e=tHE25e Registrazione 06/03/2018]&lt;br /&gt;
&lt;br /&gt;
== March 08 2018 ==&lt;br /&gt;
[https://etherpad.wikimedia.org/p/DZIAaEWQHp Etherpad 08/03/18]&lt;br /&gt;
&lt;br /&gt;
Esempio fatto dal prof:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
 truncate -s 1G mydisk&lt;br /&gt;
 umview xterm		&lt;br /&gt;
&lt;br /&gt;
#nel terminale xterm&lt;br /&gt;
&lt;br /&gt;
 umm_add_service umdev&lt;br /&gt;
 umm_add_service umfuse&lt;br /&gt;
&lt;br /&gt;
 ls /dev/hda&lt;br /&gt;
&lt;br /&gt;
 mount -t umdevmbr mydisk /dev/hda&lt;br /&gt;
 ls /dev/hda&lt;br /&gt;
&lt;br /&gt;
 fdisk /dev/hda&lt;br /&gt;
&lt;br /&gt;
# basta creare una partizione primaria con i valori di default&lt;br /&gt;
&lt;br /&gt;
 ls /dev/hda1&lt;br /&gt;
&lt;br /&gt;
 /sbin/mkfs.ext2 /dev/hda1		# make file system ext 2&lt;br /&gt;
 /sbin/fsck.ext2 -f /dev/hda1	# file system check &lt;br /&gt;
&lt;br /&gt;
 ls /mnt&lt;br /&gt;
&lt;br /&gt;
 mount -o rw+ -t umfuseext2 /dev/hda1 /mnt&lt;br /&gt;
 ls /mnt&lt;br /&gt;
&lt;br /&gt;
# echo &amp;quot;ciao&amp;quot; &amp;gt; ciao &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== March 13 2018 ==&lt;br /&gt;
== March 15 2018 ==&lt;br /&gt;
== March 20 2018 ==&lt;br /&gt;
== March 22 2018 ==&lt;br /&gt;
== March 27 2018 ==&lt;br /&gt;
== April 05 2018 ==&lt;br /&gt;
== April 10 2018 ==&lt;br /&gt;
== April 12 2018 ==&lt;br /&gt;
== April 17 2018 ==&lt;br /&gt;
== April 19 2018 ==&lt;br /&gt;
== April 24 2018 ==&lt;br /&gt;
== April 27 2018 ==&lt;br /&gt;
== May 03 2018 ==&lt;br /&gt;
== May 08 2018 ==&lt;br /&gt;
== May 10 2018 ==&lt;br /&gt;
== May 15 2018 ==&lt;br /&gt;
== May 17 2018 ==&lt;br /&gt;
== May 22 2018 ==&lt;br /&gt;
== May 24 2018 ==&lt;/div&gt;</summary>
		<author><name>Leonardo</name></author>
	</entry>
	<entry>
		<id>https://vsd.v2.cs.unibo.it/wiki/index.php?title=2018_Spring_Term&amp;diff=45</id>
		<title>2018 Spring Term</title>
		<link rel="alternate" type="text/html" href="https://vsd.v2.cs.unibo.it/wiki/index.php?title=2018_Spring_Term&amp;diff=45"/>
		<updated>2018-03-08T14:21:56Z</updated>

		<summary type="html">&lt;p&gt;Leonardo: /* March 08 2018 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== February 27 2018 ==&lt;br /&gt;
&lt;br /&gt;
===Virtualità===&lt;br /&gt;
&lt;br /&gt;
Virtualizzare qualcosa significa fornire un oggetto che possa essere usato (stessa interfaccia) efficacemente al posto dell'altro.&lt;br /&gt;
Se si usa una scarpa per piantare un chiodo, la scarpa è un &amp;quot;martello virtuale&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
====Memoria virtuale====&lt;br /&gt;
*Interfaccia della memoria principale: load(indirizzo), store(indirizzo, oggetto).&lt;br /&gt;
*Semantica: se eseguo store(i, a) seguito da load(i), la seconda operazione ritornerà a.&lt;br /&gt;
La memoria secondaria può essere usata per implementare l'interfaccia di quella primaria.&lt;br /&gt;
Anche l'hardware di un calcolatore può essere visto come un'entità astratta che parla il linguaggio ISA del processore di cui fa uso.&lt;br /&gt;
Se virtualizziamo l'hardware tramite un programma che ne implementa la stessa interfaccia otteniamo una macchina virtuale.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Possibilità di virtualizzare il tempo.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Significato di '''virtualsquare'''&lt;br /&gt;
&lt;br /&gt;
Una piazza dove i vari tipi di virtualià coesistono, un laboratorio internazionale sulla virtualità.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Concetto di VIEW====&lt;br /&gt;
&lt;br /&gt;
I processi &amp;quot;vedono&amp;quot; l'ambiente di esecuzione. Se non stanno eseguendo istruzioni di calcolo, i processi si interfacciano (&amp;quot;vedono&amp;quot;) al sistema (accedono a memoria, fanno routing) usando system calls.&lt;br /&gt;
ogni processo può vedere un file diverso allo stesso path name&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;umview&amp;lt;/u&amp;gt; vecchia macchina parziale virtuale&lt;br /&gt;
&lt;br /&gt;
L''''Hypervisor''' agisce parzialmente come un debugger: intercetta le system calls ed intraprende azioni.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Virtual Distributed Ethernet (VDE)====&lt;br /&gt;
&lt;br /&gt;
VDE è una rete Ethernet virtuale che può essere distribuita su diverse macchine fisiche presenti in rete.&lt;br /&gt;
Usare concetti reali nello &amp;quot;Standard&amp;quot; ethernet e vitualizzarli. ad esmpio uno switch con il vitual switch, più avanti nelle versioni sono stati creati dei &amp;quot;tasselli&amp;quot; che si posso interfacciare con vari altri tasselli per formare una rete virtuale personalizzata&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Tip: &amp;quot;Trovate il nome giusto da dare a tutte le cose che pensate&amp;quot;&lt;br /&gt;
&lt;br /&gt;
PeDaNTe S.P.A. (Physical, Data link, Network, Transport, Session, Presentation, Application)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Internet of Threads====&lt;br /&gt;
&lt;br /&gt;
Dare un indirizzo IP non alla macchina, ma direttamente al processo, questo ti pemette di migrare i processi da una macchina ad un'altra senza che il client deve riconfigurare l'IP della chiamata a quel processo (IPV6 è praticamente obbligatorio per rendere Internet of Threads utillizzabile, perchè IPV4 ha troppi pochi indirizzi)&lt;br /&gt;
Se abbiamo due web servers virtuali sulla stessa macchina fisica vogliamo che abbiano comunque diversi indirizzi ip.&lt;br /&gt;
&lt;br /&gt;
== March 01 2018 ==&lt;br /&gt;
&lt;br /&gt;
[https://etherpad.wikimedia.org/p/W8ZohgqjJy etherpad]&lt;br /&gt;
&lt;br /&gt;
===INFO===&lt;br /&gt;
Le comunicazioni e lo scambio di idee avverranno nel gruppo Telegram.&lt;br /&gt;
&lt;br /&gt;
Per iscriversi/scrivere nel wiki occorre il [http://so.v2.cs.unibo.it/wiki/index.php?title=Qui numero magico] usato già per il corso di Sistemi Operativi.&lt;br /&gt;
&lt;br /&gt;
Vecchio materiale [http://www.cs.unibo.it/~renzo/vsd/ Virtual System Design]&lt;br /&gt;
&lt;br /&gt;
Altre risorse su [https://github.com/rd235 GitHub]&lt;br /&gt;
&lt;br /&gt;
Nickname del docente&lt;br /&gt;
* rd235 (derivato dai documenti RFC es. [https://tools.ietf.org/html/rfc1166 RFC 1166])&lt;br /&gt;
* iz4dje&lt;br /&gt;
&lt;br /&gt;
===Tipi di virtualizzazione===&lt;br /&gt;
[https://www.finnix.org/ finnix] è un sistema operativo live da usare &amp;quot;quando si è nei guai&amp;quot;, non ha interfaccia grafica e permette di provare i sistemi virtuali; la versione 1.0 è quella che funziona bene.&lt;br /&gt;
&lt;br /&gt;
Il sistema operativo in cui viene eseguita la macchina virtuale, viene detto '''host''' (ospitante) mentre la macchina virtuale è chiamata '''guest''' (ospite).&lt;br /&gt;
&lt;br /&gt;
====Emulazione====&lt;br /&gt;
Scrivendo un emulatore di una macchina emulo i passi di esecuzione dell'hardware: convertire le istruzioni dal linguaggio del processore che vuole essere emulato ad istruzioni per la macchina host.&lt;br /&gt;
&lt;br /&gt;
'''QEMU''' è un esempio: traduce il codice macchina guest in codice macchina host (traduzione dinamica). QEMU contiene i sorgenti con le istruzioni del vari assembler (sottoforma di funzioni) che vengono messi in un vettore; fa uso di cache come fanno i browser: il codice non viene tradotto di continuo ma viene eseguito quello &amp;quot;in cache&amp;quot; e questo lo fa risultare 15/20 volte più veloce.&lt;br /&gt;
&lt;br /&gt;
('''NOTA:''' rimane in sospeso '''slirp''', lo vedremo nel dettaglio in futuro)&lt;br /&gt;
&lt;br /&gt;
'''Busybox''' è un piccolo eseguibile che combina diverse applicazioni standard Unix, in pratica le utility Unix non sono altro che un alias di busybox; si può scaricare e compilare i binari di busybox per ''mips'' (arm), se attivo il servizio ''binfmt-support'' il sistema utilizzerà QEMU per eseguire i binari mips, mentre disattivando il servizio sarà possibile utilizzare '''KVM'''.&lt;br /&gt;
&lt;br /&gt;
=====Esempi di emulazione=====&lt;br /&gt;
''qemu-system-''* (wildcard) è il comando per lanciare un'architettura:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
qemu-system-x86_64 -cdrom finnix-110.iso -m 512M&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
dove ''-m 512M'' è la quantità di ram che gli rendiamo disponibile.&lt;br /&gt;
&lt;br /&gt;
Con QEMU possiamo eseguire ''finnix-armhf-111.iso'' su macchina x86_64 seguendo le [https://www.finnix.org/ARM istruzioni], per avere successo bisogna montare l'immagine iso ed estrarre il contenuto (''initrd.xz'', ''linux'' e ''vexpress-v2p-ca9.dtb'') della directory ''/boot/armhf/'' nella cartella da cui si lancia QEMU.&lt;br /&gt;
&lt;br /&gt;
====Virtualizzazione parziale====&lt;br /&gt;
&lt;br /&gt;
'''KVM''', acronimo di Kernel-based Virtual Machine (utilizza VT per Intel e AMD-V per AMD), ha un comportamento a &amp;quot;trigger&amp;quot; il processore si comporta come la routine normale, soltanto quando vengono lanciate determinate call viene cambiata la routine da quella nativa a quella apposita per simulare altri processori. Questo permette di avere macchine virtuali molto più veloci, visto che girano direttamente sul processore escluse le varie eccezione rende una correlazione praticamente 1 a 1.&lt;br /&gt;
&lt;br /&gt;
Si può abilitare la modalità KVM in QEMU usando l'opzione ''-enable-kvm'' che ovviamente richiede che i moduli siano stati caricati.&lt;br /&gt;
&lt;br /&gt;
====Virtualizzazione totale====&lt;br /&gt;
&lt;br /&gt;
'''VirtualBox''' è un esempio di virtualizzazione totale.&lt;br /&gt;
&lt;br /&gt;
'''User-Mode Linux''' è una macchina virtuale i cui sorgenti sono presenti nel kernel linux; usa lo stesso supporto del comando '''strace''' (utile per vedere le system call di un comando); User-Mode Linux è molto vicino a '''umview''' (che appunto sta per '''User-Mode View'''); in quanto a velocità sta in mezzo tra qemu e kvm.&lt;br /&gt;
&lt;br /&gt;
=====Differenze=====&lt;br /&gt;
&lt;br /&gt;
QEMU virtualizzazione a livello di processo ('''PVM'''), KVM a livello di sistema ('''SVM'''), VirtualBox a livello di system call ('''SCVM'''). Vedere [http://www.cs.unibo.it/~renzo/so/lucidi/so-03-struttura-os-1p.pdf#page=36 pag. 36] e a seguire.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
qemu-system-* é formato dal processore di traduzioni dinamiche qemu_(arm, mips...) e dalle periferiche.&lt;br /&gt;
&lt;br /&gt;
kvm invece non fa uso di qemu ma al posto suo usa l'accellerazione del processore (oltre alle periferiche).&lt;br /&gt;
&lt;br /&gt;
qemu funziona come processo utente e non ha bisogno di permessi eccezionali;&lt;br /&gt;
kvm invece risulta vincolato al processore (egrep '^flags.*(vmx|svm)' /proc/cpuinfo) e occorre anche il modulo kernel (lsmod | grep kvm).&lt;br /&gt;
&lt;br /&gt;
VirtualBox non può convivere con KVM.&lt;br /&gt;
&lt;br /&gt;
===Macchine virtuali in rete===&lt;br /&gt;
&lt;br /&gt;
È possibile creare una propria macchina virtuale online usando le credenziali unibo [https://okeanos.grnet.gr/home/ okeanos grnet]&lt;br /&gt;
&lt;br /&gt;
Tip: '''molly-guard''' protects machines from accidental shutdowns/reboots (via ssh); è un software che se si tenta un reboot/poweroff chiede di digitare il nome della macchina, in questo modo si evita di spegnere una macchina virtuale non voluta tra le varie finestre aperte.&lt;br /&gt;
&lt;br /&gt;
== March 06 2018 ==&lt;br /&gt;
[https://etherpad.wikimedia.org/p/avNnD5LhXk Eterpad 06/03/2018]&lt;br /&gt;
&lt;br /&gt;
[https://liveunibo-my.sharepoint.com/:u:/g/personal/francesco_fornari2_studio_unibo_it/EcBK9t59dgVEjB6Y-Lx2tAEBaQ2THtSBZZk9W7p9j5cVSQ?e=tHE25e Registrazione 06/03/2018]&lt;br /&gt;
&lt;br /&gt;
== March 08 2018 ==&lt;br /&gt;
[https://etherpad.wikimedia.org/p/DZIAaEWQHp Etherpad 08/03/18]&lt;br /&gt;
&lt;br /&gt;
Esempio fatto dal prof:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
 truncate -s 1G mydisk&lt;br /&gt;
 umview xterm		&lt;br /&gt;
&lt;br /&gt;
#nel terminale xterm&lt;br /&gt;
&lt;br /&gt;
 umm_add_service umdev&lt;br /&gt;
 umm_add_service umfuse&lt;br /&gt;
&lt;br /&gt;
 ls /dev/hda&lt;br /&gt;
&lt;br /&gt;
 mount -t umdevmbr mydisk /dev/hda&lt;br /&gt;
 ls /dev/hda&lt;br /&gt;
&lt;br /&gt;
 fdisk /dev/hda&lt;br /&gt;
&lt;br /&gt;
# basta creare una partizione primaria con i valori di default&lt;br /&gt;
&lt;br /&gt;
 ls /dev/hda1&lt;br /&gt;
&lt;br /&gt;
 /sbin/mkfs.ext2 /dev/hda1		# make file system ext 2&lt;br /&gt;
 /sbin/fsck.ext2 -f /dev/hda1	# file system check &lt;br /&gt;
&lt;br /&gt;
 ls /mnt&lt;br /&gt;
&lt;br /&gt;
 mount -o rw+ -t umfuseext2 /dev/hda1 /mnt&lt;br /&gt;
 ls /mnt&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== March 13 2018 ==&lt;br /&gt;
== March 15 2018 ==&lt;br /&gt;
== March 20 2018 ==&lt;br /&gt;
== March 22 2018 ==&lt;br /&gt;
== March 27 2018 ==&lt;br /&gt;
== April 05 2018 ==&lt;br /&gt;
== April 10 2018 ==&lt;br /&gt;
== April 12 2018 ==&lt;br /&gt;
== April 17 2018 ==&lt;br /&gt;
== April 19 2018 ==&lt;br /&gt;
== April 24 2018 ==&lt;br /&gt;
== April 27 2018 ==&lt;br /&gt;
== May 03 2018 ==&lt;br /&gt;
== May 08 2018 ==&lt;br /&gt;
== May 10 2018 ==&lt;br /&gt;
== May 15 2018 ==&lt;br /&gt;
== May 17 2018 ==&lt;br /&gt;
== May 22 2018 ==&lt;br /&gt;
== May 24 2018 ==&lt;/div&gt;</summary>
		<author><name>Leonardo</name></author>
	</entry>
</feed>