SaLUG! @ Manifatture KNOS
19 Gennaio 2015
Cos'e' un sistemista?
colui che amministra il sistema
Cosa deve sapere un sistemista?
conoscere il sistema e i meccanismi che lo governano
Di che sistema parliamo?
- un insieme di software
- distribuiti su diversi livelli di astrazione
- che alla fine espongono agli utenti e/o agli sviluppatori di applicazioni di alto livello l'ambiente in cui lavorare
il sistemista non e' un programmatore mancato
- sistemista e programmatore partono dalle stesse basi teoriche e pratiche
- l'uno e l'altro andranno poi a specializzarsi nello sviluppo e manutenzione rispettivamente di sistemi e applicazioni
"Computers are good at following instructions, but not at reading your mind"
- distinzione tra hardware, firmware e software
- il significato delle misure di:
- frequenza del processore
- numero di core
- dimensione memorie cache
- il numero di bit dell'architettura
- distinzione tra kernel e user space
- micro-kernel e kernel monolitici
- driver, firmware
- applicazioni e librerie dinamiche
- distinzione tra linguaggio di programmazione e paradigma di programmazione
- conoscenze base di strutture dati e algoritmi
- saper valutare la complessita' degli algoritmi
- saper distinguere tra linguaggi compilati, interpretati e gli approcci misti
- distinzione tra linguaggi fortemente tipizzati, debolmente e dinamicamente tipizzati e non tipizzati
- linking dinamico e statico di librerie
- installazione e configurazione della propria postazione di sviluppo
- installazione e configurazione di ambienti di test (e.g. sistema server o embedded)
- debugging di applicazione/sistema e dell'interazione tra i software che compongono l'applicazione/sistema
- saper leggere e interpretare la sintassi e i messaggi di errore dei linguaggi di programmazione utilizzati dalle componenti piu' importanti
- saper utilizzare strumenti di testing, debugging e tracing (e.g. test unit/functional/blackbox, gdb, strace/ltrace, ping/traceroute)
- basi sui linguaggi di programmazione (e di scripting) piu' comuni:
- C/C++
- Java
- Javascript
- PHP, Python, Ruby, Perl
- Shell Scripting
- basi sui tool di sviluppo e building piu' comuni:
- Shell Scripting
- Makefiles
- autotools
- sistemi di revisione (e.g. git, hg, svn)
E tanto tanto altro ancora...
non avrai mai
il tempo di annoiarti!
Quale misteriosa alchimia...
ha consentito ad un manipolo di hacker di darci modo di sostituire il sistema operativo fornito con i nostri dispositivi?
Photo from dditt@flickr
cpu, gpu, banchi di ram e controller (usb, pci etc) a disposizione
Photo from warrenski@flickr
bios, device driver binary blobs
Photo from dullhunk@flickr
bootloader, kernel, userspace libs, userspace apps
Booting...
Photo from nickgray@flickr
Il Master Boot Record e' il primo settore di un disco di un PC compatibile, e' caratterizzato da una dimensione fissa di 512 byte
- contiene la tabella delle partizioni (ultimi 64 byte + un byte firma 0xAA55)
- contiene il boot loader, necessario all'avvio del sistema operativo (300 byte + 80 di messaggi di errore)
Il disco viene di solito suddiviso in sezioni, dette partizioni.
- L'MBR, che contiene la tabella delle partizioni, e' una zona del disco estremamente piccola per questo motivo non era inizialmente possibile gestire piu' di 4 partizioni
- ogni record della tabella partizioni contiene le informazioni di tipo, primo cilindro e dimensione della partizione
- Le partizioni logiche consentono di superare il limite delle 4 partizioni
- caricamento ed esecuzione del kernel ed eventuali altri file a supporto
Kernel
- kernel booting
- process management
- memory management
- virtual file system
- networking
- drivers
- abstractions (dri/drm, alsa etc)
Userspace
- gestione dell'avvio e shutdown del sistema
- librerie ed applicazioni di sistema
- interfacce utente (testo o gui)
Il miglior modo di imparare qualcosa e'
- Provare provare provare!!!
- Sbagliare ed impare dai propri errori
- Non accontertarsi del primo risultato
Possiamo imparare commettendo tutti gli errori che vogliamo senza rischiare di danneggiare il sistema che utilizziamo per lavorare o studiare grazie alle Macchine Virtuali
Virtual Machine e' un termine piuttosto abusato in informatica
astrazione di un calcolatore elettronico, reale o ipotetico
Nell'ambito dei linguaggi di programmazione non compilati in linguaggio macchina:
un interprete
la componente che esegue il programma dal suo codice sorgente o mediante un proprio set di istruzioni macchina
In ambito sistemistico:
una applicazione che emula un hardware
su cui eseguire un'applicazione, di solito un sistema operativo completo
applicazione di virtualizzazione software & hardware x86/AMD64 (cross-platform)
Unix e' un sistema operativo multitasking e multiutente nato durante gli anni 60 nei laboratori di ricerca AT&T
All'inizio degli anni 60 MIT, AT&T Bell Labs e General Electric stavano sviluppanto un sistema operativo time sharing sperimentale: Multics
Alla fine degli anni 60 Ken Thompson, Dennis Ritchie, M.D. McIlroy e J.G. Osanna decisero di ricreare il sistema interamente focalizzandosi su una scala minore
Nel 1970, Peter Neumann conio' il nome UNICS
Nel 1972, Unix venne riscritto completamente in C (fino ad allora i kernel erano scritti in codice macchina)
Durante gli anni 70 e 80 Unix influenzo' e porto' alla sua adozione da parte di molti circoli accademici e aziende commerciali.
Il suo design modulare sopravvive tuttora nelle numerose varianti di Unix che esistono oggi
- fornire un set di semplici tool, con funzioni limitate ben definite
- filesystem unificato e utilizzato come principale mezzo di comunicazione
- un shell in grado di intepretare i nostri comandi e di comporli in script
- gestione della memoria virtuale
- portabilita' grazie al linguaggio C
- aperto, attraverso la formalizzazione delle sue API di sistema (Standard POSIX) e dei protocolli di comunicazione (Standard IETF)
Presto le diverse varianti di divisero in due grandi famiglie:
Negli anni 90 alcuni sistemi Unix-like sviluppati collettivamente da gruppi di programmatori sviluppati in tutto il mondo crebbero in popolarita' ed adozione:
- Linux (Slackware, RedHat, Debian, Ubuntu, Gentoo, Fedora etc)
- BSD (FreeBSD, NetBSD, OpenBSD)
Apple, dopo aver acquisito NeXT verso la meta' degli anni 90, rilascia Darwin, che divenne il core del sistema operativo OSX.
Nel 1983 Richard Stallman annucio' il progetto GNU
L'obiettivo del progetto GNU e' la creazione di un sistema operativo Unix-like completamente libero
Richard Stallman definisce anche quali sono le liberta' che devono essere garantite per poter definire un software libero:
Chiunque riceva una copia del software deve avere anche la liberta' di usarlo, studiarlo, modificarlo e redistribuirlo
All'inizio degli anni 90 GNU aveva gia' prodotto la suite di compilazione gcc, molte delle utility di sistema e l'editor emacs, ma...
-
... non aveva ancora un kernel abbastanza completo
quando nel 1991 Linus Torvalds rilascio' la prima versione del kernel Linux sotto la licenza GNU General Public License
Per Distribuzioni GNU/Linux intendiamo:
Tra le distribuzioni Linux piu' diffuse in ambito desktop e server troviamo:
Sistemi operativi come l' MS-DOS erano in grado di eseguire una sola applicazione alla volta
Sistemi di questo tipo vengono definiti single-task
Al contrario, i sistemi operativi multi-tasking sono in grado di eseguire piu' applicazioni (processi o task) contemporaneamente (almeno in maniera apparente) anche in presenza di un unico processore
Con time-sharing intendiamo la condivisione di una risorsa di calcolo tra piu' applicazioni
Il sistema operativo suddivide l'attivita' della CPU in intervalli temporali assegnati ai singoli processi.
Il sistema operativo identifica ed isola tra di loro i processi appartenenti ad utenti differenti del sistema
Il sistema operativo organizza i processi attivi in attesa di risorse (processore, disco, rete etc.) in una o piu' code di esecuzione, lo scheduler dei processi e' la componente che si occupa di creare e gestire tale struttura dati in spazio kernel e a effettuare il passaggio delle risorse ai processi correntemente attivi in spazio utente.
una carattestistica chiave di Unix e' costituita dall'accesso in forma di stream di byte a molte delle risorse disponibili (file e cartelle, dati raw presenti negli storage, tastiere, mouse etc.)
Il vantaggio di questo approccio e' quello di poter utilizzare lo stesso set di strumenti per accedere a risorse differenti
E' un principio di design che consiste nel contenere il piu' possibile la complessita', preferendo soluzioni semplici e con un obiettivo semplice e ben delineato.
Nei sistemi Unix sono presenti delle funzioni base di sicurezza basate sui concetti di: