Appunti lezioni 2019
26 Febbraio 2019
Precondizioni: manualità con command line, sistemi operativi, C e programmazione.
Cos’è la virtualità
L’informatica dal nostro punto di vista è “a strati”: linguaggi che permettono di astrarre il livello attuale e fornire qualcosa al livello superiore.
A noi informatici non interessa l’implementazione hardware di un sistema di elaborazione.
Qualcosa che si adatta perfettamente a sostituire un X lo chiameremo X Virtuale.
Una macchina virtuale è capace di parlare il linguaggio di una macchina reale:
- il linguaggio della sua instruction set ⇒ processore
- serve un sistema di emulazione della memoria con cui il processore dialoga.
- occorre ricreare la parte del linguaggio che rappresenta i bus di comunicazione tra periferiche.
Se siamo in grado di ricreare correttamente la macchina, la macchina non si accorgerà di essere virtuale.
Per noi la memoria è qualcosa che risponde a due comandi fondamentali: READ e STORE.
Possiamo ricreare queste operazioni e unire insieme memoria fisica con operazioni virtuali, ricreando la memoria virtuale.
Ci saranno sistemi virtuali, reti virtuali, ecc…
Efficacemente?
Un emulatore è un programma che emula il comportamento di qualcosa, un programma capace di apparire esattamente come qualcos’altro.
Come la macchina virtuale? No, emula e fa le cose dell'oggetto che emula, ma manca la parola efficacemente.
Il simulatore non fa le cose che fa l’oggetto simulato, appare solo che faccia le sue operazioni.
Con un simulatore di volo non si va in vacanza.
Icaro aveva ricreato un emulatore di volo.
Un emulatore è una macchina virtuale? Dipende dallo scopo.
Se la virtualità non si crea per emulazione, come si crea? Si crea trovando il modo di inserire nel sistemi dei supporti che ci aiutino a creare la virtualità senza simulazione.
La RAM simulata non è altro che memoria secondaria. ⇒ no virtualità.
MMU ci aiuta a simulare la memoria virtuale.
Nei sistemi Intel è presente VTX, ovvero supporti per creare sistemi virtuali. Per le operazioni di processore e memoria il sistema lavora come se non fosse in una macchina virtuale. Quando questi due non bastano, si delegano le operazioni alla macchina reale.
L’utente vuole da questa entità virtuale un servizio. La nostra macchina virtuale è efficace se il servizio non ha differenze dal quello fornito da una macchina reale.
Virtual Square
Cos’è? Davoli dice “non lo so”.
Nasce per dare un marchio ad una serie di progetti, oggi è un contenitore di progetti o laboratorio internazionale che porta avandi idee di progetti.
Internazionale perchè nel corso degli anni le persone che hanno partecipato al progetto hanno aggiunto codice e idee che li ha portati a lavorare in giro per il mondo, ma restando collegati a Virtual Square.
I progetti portati avanti sono tanti, le idee non vengono da sole.
I capisaldi sono la virtualizzazione di sistemi e di reti.
Tutti i progetti del 2014 sono nelle repo Debian ufficiali.
Quest’anno vorrebbe fare il salto e portare la realtà dei progetti attuali ad essere fruibile al mondo.
Questo è un corso ma non è un esame. Il voto si baserà su un progetto (come riporta il nome del corso).
Modalità di lavoro
Lezione, editor condiviso, il wiki, gruppo telegram e bot telegram.
Come esercizio aggiuntivo potremmo provare a diventare Debian maintainer.
VDE: Virtual Distributed Ethernet
Uno dei cavalli di battaglia di Virtual Square, rete ethernet virtuale.
L’ethernet è la rete più comune nell’ambito locale, ha tantissime implementazioni (fili di rame, fibra ottica, diverse velocità). Il comune denominatore di tutto questo (ciò che fa di una ethernet una ethernet) è il livello 2, ovvero il formato del pacchetto, i primi 14 byte. Se riusciamo a ricreare una rete virtuale possiamo interamente sostituire una rete fisica.
ifconfig è il vecchissimo metodo utilizzato per configurare l’IP di un sistema.
Macchine virtuali parziali
A differenza di una macchina virtuale totale si può virtualizzare solamente una parte del sistema (ad esempio solamente la rete, ignorando l’implementazione del file system). Non richiede l’intero boot. Questo è possibile tramite le systemcall.
Esperimento in classe: Emulato un file system e fatto un mount all’interno. Dall’esterno non è visibile.
Qemu è una macchina virtuale che funziona tramite compilazione dinamica. Ha sistema di caching che ricorda le istruzioni recentemente eseguite. Tutti i sistemi di sviluppo per mobile utilizzano Qemu. Permette di utilizzare diverse implementazioni dell’architettura rispetto alla macchina ospitante.
Conclusioni
Molte implementazioni di virtualizzazione.
Proseguimento del corso: mostrare tutti gli esperimenti sulla virtualizzazione, prima come si usano e poi come sono stati implementati.
1 Marzo 2019
- Bug Squashing dei progetti esistenti
- Tutorial su come installare vuos
- Possibilità di aggiungere system call personalizzate che Linux non ha tramite UMView
VDE (Virtual Distributed Ethernet)
Ethernet è lo standard per la rete locale, la guerra agli standard non esiste più. Ethernet ha una platea di utilizzatori enormi, da qui l’idea di creare una Ethernet virtuale.
Occorre virtualizzare in modo che sia compatibile con le applicazioni e con gli umani.
La prima idea è stata quella di creare una scatola logica chiamata VDE switch, facendo in modo che le macchine virtuali avessero porte capaci di interfacciarsi con questo switch. Dopodichè serviva la possibilità di collegare più switch insieme.
vde_switch ⇒ comando per creare uno switch ⇒ es. vde_switch -s /tmp/my_switch
- avviata macchina virtuale dando come parametro per il socket lo switch appena creato
- ora abbiamo una macchina virtuale collegata ad uno switch virtuale ⇒ “è un po’ autistica, parla con se stessa” cit. Davoli
- lanciata seconda macchina virtuale cambiando il MAC address (qemu avvia tutte le macchine virtuali con lo stesso MAC di default)
- settato indirizzo IP delle due macchine virtuali
- pingate le macchine a vicenda e funziona ⇒ “miracolo”
- dal terminale con cui abbiamo avviato lo switch, premendo enter possiamo dare comandi, tipo port/print per avere info sui dispositivi collegati, oppure hash/print per la forwarding table
Come collegare assieme due switch
Per ora abbiamo solo V ed E di VED, manca distributed.
L’idea iniziale era di virtualizzare l’intero cavo di rete, ma si è scelto di virtualizzare solamente le spine per poter utilizzare come canale di comunicazione anche strumenti già esistenti.
vde_plug /tmp/my_switch ⇒ collegata la spina allo switch esistente
vde_plug utilizza i primi due byte per identificare il pacchetto trasmesso, e poi accoda il pacchetto.
Ora port/print vede anche la terza porta collegata al plug.
dpipe ⇒ tool di uso generale per collegare assieme due entità.
dpipe vde_plug /tmp/myswitch = ssh vde.v2.cs.unibo vde_plug
- collegato il secondo switch virtuale ad internet, ora pingandola raggiungiamo la macchina virtuale di Davoli
- da qualche parte c’è il passaggio tra virtuale e reale: il kernel Linux permette la creazione di interfacce TUN TAP. Creano interfacce ethernet (TAP livello 2, TUN livello 3). Quando si deve inviare un pacchetto all’interfaccia TAP, lo si invia al programma che ha creato la TAP, nel nostro caso a vde_plug
- creata interfacce TAP assegnata a utente 1000, poi collegata la macchina virtuale alla macchina fisica e pingata.
Come si è evoluto il progetto
Lucidi del Prof del FOSDEM 2018
5 Marzo 2019
Solitamente passando a SU vengono annullate le variabili d'ambiente per questioni di sicurezza.
Internet of Threads
- Internet Node ⇒ scheda di rete, entità indirizzabili (come un telefono fisso)
- Le macchine virtuali hanno a loro volta indirizzi IP, ma la scheda di rete è virtuale
L'idea è quella di spostare lo stack TCP-IP da dentro al kernel a dentro ai processi. Questo permette di:
- vari utenti possono utilizzare la stessa macchina con indirizzi IP dedicati
- diverse routing sullo stesso sistema
- far girare più server sulla stessa interfaccia/porta
- utilizzare VPN per alcuni processi e la vera rete per altri
Per tutto questo è praticamente fondamentale IPv6.
È la controparte dell'IoTh, invece che utilizzare cose utilizziamo servizi.
Occorre una LAN virtuale, cioè VDE.
I server potrebbero usare indirizzi IP dinamici: questo eviterebbe i brute force attack, perchè dopo un tot tempo l'indirizzo sarebbe invalido.
Gli indirizzi IP reali sarebbero usati dagli amministratori del sistema per parlare della macchina, agli utenti invece interessano i servizi.
Avere lo stack nei processi ha il problema che facendo la fork si creeranno due processi con lo stesso IP.
mascherato indirizzo IP esterno tramite vdens ⇒ crea un namespace di rete.
vdens -R 80.80.80.80 cmd://"ssh 130.136.200.200 vde_plug slirp://"
- 130.136.200.200 ⇒ macchina reale di Davoli
- slirp è in esecuzione su quella macchina
VDE Stack
Permette di creare uno stack di rete.
fatto esperimenti con vdestack, vde, vxvde
- creato un buco di un giga in /tmp/mydisk con il comando truncate
- montanto il file mydisk come /dev/hda con il comando vudevpartx
- partizionato il file con cfdisk in due partizioni
- creato il file system ext4 nella prima partizione
- mount -o rw+ -t vufuseext2 /dev/hda1 /mnt
- scritto un file nella partizione
Vufs
usato mincow per montare in copy and write modalità minimale il file system, modificato /etc/passwd e cancellato l'utente renzo
Premette di branchare il proprio file system.