4.3 Lezione 1
Certificazione: |
Linux Essentials |
---|---|
Versione: |
1.6 |
Argomento: |
4 Il Sistema Operativo Linux |
Obiettivo: |
4.3 Dove Sono Memorizzati i Dati |
Lezione: |
1 di 2 |
Introduzione
Per un sistema operativo ogni cosa è un dato. Per Linux, ogni cosa è un file: programmi, file regolari, directory, dispositivi a blocchi (dischi rigidi, etc.), dispositivi a caratteri (console, etc.), processi del kernel, socket, partizioni, link, etc: la struttura delle directory di Linux , che inizia dalla root /
, è un insieme di file contenenti dati. Il fatto che tutto sia considerato un file è una potente funzionalità di Linux in quanto consente di modificare praticamente ogni singolo aspetto del sistema.
In questa lezione discuteremo le diverse posizioni in cui vengono memorizzati i dati importanti, come stabilito dal Linux Filesystem Hierarchy Standard (FHS). Alcune di queste posizioni sono delle directory reali che memorizzano i dati in modo persistente sui dischi, mentre altre rappresentano pseudo-filesystem che vengono caricati in memoria e danno accesso ai dati del sottosistema del kernel come, per esempio, i processi in esecuzione, l’utilizzo della memoria, la configurazione hardware e così via. I dati memorizzati in queste directory virtuali vengono utilizzati da una serie di comandi che ci consentono di monitorarli e gestirli.
I Programmi e la Loro Configurazione
I dati importanti su un sistema Linux sono, senza dubbio, i programmi e i loro file di configurazione. I primi sono file eseguibili contenenti un’insieme di istruzioni che devono essere eseguite dal processore del computer, mentre i secondi sono solitamente documenti di testo che controllano il funzionamento di un programma. I file eseguibili possono essere file binari o file di testo. I file di testo eseguibili sono chiamati script. Anche i dati di configurazione, in Linux, sono tradizionalmente archiviati in file di testo, sebbene esistano vari stili di rappresentazione di questi dati.
Dove sono Memorizzati i File Binari
Come ogni altro file, i file eseguibili risiedono in directory fondamentalmente collegate a /
. Nello specifico, i programmi sono distribuiti su una struttura a tre livelli: il primo livello (/
) include i programmi che potrebbero essere necessari in modalità utente singolo; il secondo livello (/usr
) contiene la maggior parte dei programmi multiutente; il terzo livello (/usr/local
) viene utilizzato per memorizzare il software che non è fornito dalla distribuzione ed è stato compilato localmente.
In genere, i programmi si trovano in queste posizioni:
/sbin
-
Contiene i binari essenziali per l’amministrazione del sistema, come
parted
oip
. /bin
-
Contiene i binari essenziali per tutti gli utenti come
ls
,mv
, omkdir
. /usr/sbin
-
Memorizza i binari per l’amministrazione del sistema, come
deluser
ogroupadd
. /usr/bin
-
Include la maggior parte dei file eseguibili, come
free
,pstree
,sudo
oman
, che possono essere utilizzati da tutti gli utenti. /usr/local/sbin
-
Viene utilizzato per memorizzare i programmi installati localmente per l’amministrazione del sistema che non sono gestiti dal gestore dei pacchetti del sistema.
/usr/local/bin
-
Ha lo stesso scopo di
/usr/local/sbin
, ma per i normali programmi utente.
Recentemente alcune distribuzioni hanno iniziato a sostituire /bin
e /sbin
con collegamenti simbolici a /usr/bin
e /usr/sbin
.
Note
|
La directory |
Oltre a queste directory, gli utenti ordinari possono avere i propri programmi in:
-
/home/$USER/bin
-
/home/$USER/.local/bin
Tip
|
Puoi scoprire da quali directory puoi eseguire i binari facendo riferimento alla variabile |
Possiamo trovare la posizione dei programmi con il comando which
:
$ which git /usr/bin/git
Dove sono Memorizzati i File di Configurazione
La Directory /etc
Agli albori di Unix c’era una cartella per ogni tipo di dato, come, per esempio, /bin
per i binari e /boot
per il (i) kernel. Tuttavia, /etc
(per et cetera) è stata creata come directory generica per memorizzare tutti i file che non appartenevano alle altre categorie. La maggior parte di questi file erano file di configurazione. Con il passare del tempo sono stati aggiunti sempre più file di configurazione e così /etc
è diventata la cartella principale per i file di configurazione dei programmi. Come detto sopra, un file di configurazione di solito è un file locale di testo normale (al contrario di un file binario) che controlla il funzionamento di un programma.
In /etc
troviamo diversi modelli per i nomi dei file di configurazione:
-
File con una estensione ad hoc o nessuna estensione, come per esempio:
group
-
Database dei gruppi del sistema.
hostname
-
Nome del computer host.
hosts
-
Elenco di indirizzi IP e relative traduzioni in nome host.
passwd
-
Database degli utenti del sistema — composto da sette campi separati da due punti che forniscono informazioni sull’utente.
profile
-
File di configurazione a livello di sistema per Bash.
shadow
-
File crittografato per le password degli utenti.
-
File di inizializzazione che terminano con
rc
:bash.bashrc
-
File
.bashrc
a livello di sistema per shell bash interattive. nanorc
-
File di inizializzazione di esempio per GNU nano (un semplice editor di testo normalmente incluso in qualsiasi distribuzione).
-
File che terminano con
.conf
:resolv.conf
-
File di configurazione per il resolver, che fornisce l’accesso al DNS (Internet Domain Name System).
sysctl.conf
-
File di configurazione per impostare le variabili di sistema per il kernel.
-
Directory con suffisso
.d
:Alcuni programmi con un unico file di configurazione (
*.conf
o altro) si sono evoluti per avere una directory dedicata*.d
che aiuta a costruire configurazioni modulari e più robuste. Per esempio, per configurare logrotate, troverailogrotate.conf
, ma anche la directorylogrotate.d
.Questo approccio è utile nei casi in cui applicazioni diverse richiedano configurazioni per lo stesso specifico servizio. Se, per esempio, un pacchetto del server web contiene una configurazione di logrotate, questa configurazione può essere inserita in un file dedicato nella directory
logrotate.d
. Questo file può essere aggiornato dal pacchetto del server web senza interferire con la restante configurazione di logrotate. Allo stesso modo, i pacchetti possono aggiungere attività specifiche inserendo i file nella directory/etc/cron.d
invece di modificare/etc/crontab
.In Debian e nelle sue derivate tale approccio è stato applicato all’elenco delle fonti attendibili lette dallo strumento di gestione dei pacchetti
apt
: a parte il classico/etc/apt/sources.list
, ora troviamo la directory/etc/apt/sources.list.d
:$ ls /etc/apt/sources* /etc/apt/sources.list /etc/apt/sources.list.d:
File di Configurazione nella HOME
(Dotfile)
A livello utente i programmi memorizzano le proprie configurazioni e le proprie impostazioni in file nascosti all’interno della directory home dell’utente (rappresentata anche da ~
). Ricorda che i file nascosti iniziano con un punto (.
) - da qui il loro nome: dotfile.
Alcuni di questi dotfile sono script Bash che personalizzano la sessione di shell dell’utente e vengono letti non appena l’utente accede al sistema:
.bash_history
-
Memorizza la cronologia della Command Line.
.bash_logout
-
Contiene i comandi da eseguire quando si esce dalla shell di login.
.bashrc
-
Script di inizializzazione di Bash per shell non di login.
.profile
-
Script di inizializzazione di Bash per shell di login.
Note
|
Fai riferimento alla lezione “Nozioni di Base sulla Command Line” per saperne di più su Bash e sui suoi file di inizializzazione. |
Altri file di configurazione relativi a programmi specifici dell’utente vengono letti quando il corrispondente programma viene avviato: .gitconfig
, .emacs.d
, .ssh
, etc.
Il kernel Linux
Prima che qualsiasi processo possa essere eseguito, il kernel deve essere caricato in un’area di memoria protetta. Dopodiché, il processo con PID 1
(oggigiorno il più delle volte systemd
) avvia la catena di processi, vale a dire un processo ne avvia un altro (o altri) e così via. Una volta che i processi sono attivi, il kernel Linux è responsabile dell’allocazione delle risorse (tastiera, mouse, dischi, memoria, interfacce di rete, etc.).
Note
|
Prima dell’avvento di |
Dove sono Memorizzati i File del Kernel: /boot
Il kernel risiede in /boot
assieme ad altri file relativi all’avvio del sistema. La maggior parte di questi file include nel nome ciò che compone il numero di versione del kernel (kernel version, major revision, minor revision e patch number).
La directory /boot
include i seguenti tipi di file, i cui nomi corrispondono alla relativa versione del kernel:
config-4.9.0-9-amd64
-
Impostazioni di configurazione del kernel come, per esempio, opzioni e moduli che sono stati compilati assieme al kernel.
initrd.img-4.9.0-9-amd64
-
Immagine del disco RAM iniziale (Initial RAM disk) che aiuta il processo di avvio caricando un filesystem di root temporaneo in memoria.
System-map-4.9.0-9-amd64
-
Il file
System-map
(su alcuni sistemi presente comeSystem.map
) contiene le posizioni degli indirizzi di memoria per i nomi dei simboli del kernel. Ogni volta che un kernel viene ricostruito, il contenuto del file cambia poiché le posizioni di memoria potrebbero essere diverse. Il kernel utilizza questo file per cercare le posizioni degli indirizzi di memoria per un particolare simbolo del kernel, o viceversa. vmlinuz-4.9.0-9-amd64
-
Il kernel vero e proprio in un formato compresso autoestraente che consente di risparmiare spazio (da qui la
z
invmlinuz
;vm
sta per memoria virtuale - ha iniziato a essere utilizzato quando il kernel ha iniziato a supportare la memoria virtuale). grub
-
Directory di configurazione per il bootloader
grub2
.
Tip
|
Poiché è una criticità del sistema operativo, vengono conservati in |
La Directory /proc
La directory /proc
è uno dei così detti filesystem virtuali o pseudo-filesystem dal momento che il suo contenuto non è scritto sul disco, ma caricato in memoria. Viene popolato dinamicamente ogni volta che il computer si avvia e riflette costantemente lo stato corrente del sistema. /proc
contiene informazioni su:
-
Processi in esecuzione
-
Configurazione del kernel
-
Hardware di sistema
Oltre a tutti i dati relativi ai processi che vedremo nella prossima lezione, questa directory memorizza anche file con informazioni sull’hardware di sistema e le impostazioni di configurazione del kernel. Alcuni di questi file sono:
/proc/cpuinfo
-
Memorizza informazioni sulla CPU del sistema:
$ cat /proc/cpuinfo processor : 0 vendor_id : GenuineIntel cpu family : 6 model : 158 model name : Intel(R) Core(TM) i7-8700K CPU @ 3.70GHz stepping : 10 cpu MHz : 3696.000 cache size : 12288 KB (...)
/proc/cmdline
-
Memorizza le stringhe passate al kernel all’avvio del sistema:
$ cat /proc/cmdline BOOT_IMAGE=/boot/vmlinuz-4.9.0-9-amd64 root=UUID=5216e1e4-ae0e-441f-b8f5-8061c0034c74 ro quiet
/proc/modules
-
Mostra l’elenco dei moduli caricati nel kernel:
$ cat /proc/modules nls_utf8 16384 1 - Live 0xffffffffc0644000 isofs 40960 1 - Live 0xffffffffc0635000 udf 90112 0 - Live 0xffffffffc061e000 crc_itu_t 16384 1 udf, Live 0xffffffffc04be000 fuse 98304 3 - Live 0xffffffffc0605000 vboxsf 45056 0 - Live 0xffffffffc05f9000 (O) joydev 20480 0 - Live 0xffffffffc056e000 vboxguest 327680 5 vboxsf, Live 0xffffffffc05a8000 (O) hid_generic 16384 0 - Live 0xffffffffc0569000 (...)
La Directory /proc/sys
Questa directory contiene le impostazioni di configurazione del kernel sotto forma di file classificati in categorie rappresentate dalle diverse sottodirectory:
$ ls /proc/sys abi debug dev fs kernel net user vm
La maggior parte di questi file funziona come un interruttore e, quindi, contiene solamente uno dei due possibili valori: 0
o 1
(“acceso” o “spento”). Per esempio:
/proc/sys/net/ipv4/ip_forward
-
Il valore che abilita o disabilita la nostra macchina a funzionare da router (e quindi a essere in grado di inoltrare pacchetti):
$ cat /proc/sys/net/ipv4/ip_forward 0
Esistono tuttavia alcune eccezioni:
/proc/sys/kernel/pid_max
-
Il PID massimo consentito:
$ cat /proc/sys/kernel/pid_max 32768
Warning
|
Presta particolare attenzione quando modifichi le impostazioni del kernel poiché un valore errato potrebbe causare instabilità di sistema. |
Dispositivi Hardware
Ricorda, in Linux “ogni cosa è un file”. Questo implica che le informazioni sul dispositivo hardware e le impostazioni di configurazione del kernel siano tutte memorizzate in file speciali che risiedono in directory virtuali.
La Directory /dev
La directory /dev
, che sta per device, contiene i file di dispositivo (o nodi) per tutti i dispositivi hardware collegati. Questi file di dispositivo vengono utilizzati come interfaccia tra i dispositivi e i processi che li utilizzano. Ogni file di dispositivo rientra in una delle due seguenti categorie:
- Dispositivi a blocchi
-
Sono quelli in cui i dati vengono letti e scritti in blocchi che possono essere indirizzati individualmente. Alcuni esempi sono: i dischi rigidi (e le loro partizioni, come
/dev/sda1
), le unità flash USB, CD, DVD, etc. - Dispositivi a caratteri
-
Sono quelli in cui i dati vengono letti e scritti in modo sequenziale, un carattere alla volta. Alcuni esempi sono: le tastiere, la console di testo (
/dev/console
), le porte seriali (come/dev/ttyS0
e così via), etc.
Quando si elencano i file di dispositivo è necessario assicurarsi di utilizzare ls
con l’opzione -l
per fare distinzione tra le due categorie. Possiamo, per esempio, controllare i dischi rigidi e le partizioni:
# ls -l /dev/sd* brw-rw---- 1 root disk 8, 0 may 25 17:02 /dev/sda brw-rw---- 1 root disk 8, 1 may 25 17:02 /dev/sda1 brw-rw---- 1 root disk 8, 2 may 25 17:02 /dev/sda2 (...)
O i terminali seriali (TeleTYpewriter):
# ls -l /dev/tty* crw-rw-rw- 1 root tty 5, 0 may 25 17:26 /dev/tty crw--w---- 1 root tty 4, 0 may 25 17:26 /dev/tty0 crw--w---- 1 root tty 4, 1 may 25 17:26 /dev/tty1 (...)
Nota che il primo carattere è b
per i dispositivi a blocchi e c
per i dispositivi a caratteri.
Tip
|
L’asterisco ("*") è un carattere di globbing che significa 0 o più caratteri. Pertanto, è estremamente importante nei comandi |
Inoltre, /dev
include alcuni file speciali che sono abbastanza utili per diversi scopi di programmazione:
/dev/zero
-
Fornisce tanti caratteri null quanti sono quelli richiesti.
/dev/null
-
Chiamato anche cestino per i bit, o in inglese bit bucket. Elimina tutte le informazioni che gli vengono inviate.
/dev/urandom
-
Genera numeri pseudo-casuali.
La Directory /sys
Il filesystem sys (sysfs
) è montato su /sys
. È stato introdotto con il kernel 2.6 e ha apportato un grande miglioramento per /proc/sys
.
I processi devono interagire con i dispositivi in /dev
e quindi il kernel ha bisogno di una directory che contenga informazioni su questi dispositivi hardware. Questa directory è /sys
e i suoi dati sono organizzati in categorie. Per esempio, per controllare l’indirizzo MAC della scheda di rete (enp0s3
), è necessario eseguire il comando cat
sul seguente file:
$ cat /sys/class/net/enp0s3/address 08:00:27:02:b2:74
Memoria e Tipi di Memoria
Affinché un programma inizi a funzionare, deve essere caricato in memoria. In generale, quando parliamo di memoria ci riferiamo alla Random Access Memory (RAM) che, rispetto ai dischi rigidi meccanici, ha il vantaggio di essere molto più veloce. Di contro, è volatile (cioè, una volta spento il computer, i dati scompaiono).
Fermo restando quanto detto sopra, quando si tratta di memoria possiamo distinguerne in un sistema Linux due tipi principali:
- Memoria fisica
-
Conosciuta anche come RAM, si presenta sotto forma di chip costituiti da circuiti integrati contenenti milioni di transistor e condensatori che, a loro volta, formano celle di memoria (il componente base della memoria del computer). Ciascuna di queste celle ha un codice esadecimale associato, un indirizzo di memoria, a cui è possibile fare riferimento quando necessario.
- Swap
-
Conosciuta anche come spazio di swap, è la porzione di memoria virtuale che si trova sul disco rigido e viene utilizzata quando non c’è più RAM disponibile.
D’altra parte, esiste il concetto di memoria virtuale che è un’astrazione della quantità totale di memoria di indirizzamento utilizzabile (RAM, ma anche spazio su disco) come viene vista dalle applicazioni.
Il comando free
analizza /proc/meminfo
e mostra la quantità di memoria libera e utilizzata nel sistema in modo molto chiaro:
$ free total used free shared buff/cache available Mem: 4050960 1474960 1482260 96900 1093740 2246372 Swap: 4192252 0 4192252
Spieghiamo le diverse colonne:
total
-
Quantità totale di memoria fisica e di swap installata.
used
-
Quantità di memoria fisica e di swap attualmente in uso.
free
-
Quantità di memoria fisica e di swap attualmente non in uso.
shared
-
Quantità di memoria fisica usata — principalmente — da
tmpfs
. buff/cache
-
Quantità di memoria fisica attualmente utilizzata dai buffer del kernel, dalla cache e dagli slab.
available
-
Stima della quantità di memoria fisica disponibile per i nuovi processi.
Per impostazione predefinita, free
mostra i valori in kibibyte, ma consente, grazie a una varietà di opzioni, di visualizzare i risultati in diverse unità di misura. Alcune di queste opzioni sono:
-b
-
Bytes.
-m
-
Mebibytes.
-g
-
Gibibytes.
-h
-
Formato leggibile dall’uomo.
Il formato mostrato tramite l’opzione -h
è sempre comodo da leggere:
$ free -h total used free shared buff/cache available Mem: 3,9G 1,4G 1,5G 75M 1,0G 2,2G Swap: 4,0G 0B 4,0G
Note
|
Un kibibyte (KiB) equivale a 1024 byte, mentre un kilobyte (KB) equivale a 1000 byte. Lo stesso vale, rispettivamente, per mebibyte, gibibyte, etc. |
Esercizi Guidati
-
Usa il comando
which
per scoprire la posizione dei seguenti programmi e completare la tabella:Programma Comando which
Percorso dell’eseguibile (output) L’utente ha bisogno dei privilegi di root
?swapon
kill
cut
usermod
cron
ps
-
Dove si trovano i seguenti file?
File /etc
~
.bashrc
bash.bashrc
passwd
.profile
resolv.conf
sysctl.conf
-
Spiega il significato degli elementi numerici del file del kernel
vmlinuz-4.15.0-50-generic
che si trova in/boot
:Elemento numerico Significato 4
15
0
50
-
Quale comando puoi usare per elencare tutti i dischi rigidi e le partizioni in
/dev
?
Esercizi Esplorativi
-
I file di dispositivo per i dischi rigidi sono rappresentati in base ai controller che usano: abbiamo visto
/dev/sd*
per i dischi che utilizzano SCSI (Small Computer System Interface) e SATA (Serial Advanced Technology Attachment), ma-
Come erano rappresentati i vecchi dischi IDE (Integrated Drive Electronics)?
-
E i moderni dischi NVMe (Non-Volatile Memory Express)?
-
-
Dai un’occhiata al file
/proc/meminfo
. Confronta il contenuto di questo file con l’output del comandofree
e identifica quale voce di/proc/meminfo
corrisponde ai seguenti campi nell’output difree
:Output di free
Campo di /proc/meminfo
total
free
shared
buff/cache
available
Sommario
In questa lezione hai imparato la posizione dei programmi e dei loro file di configurazione in un sistema Linux. Le cose più importanti da ricordare sono:
-
Fondamentalmente, i programmi si trovano in una struttura di directory a tre livelli:
/
,/usr
e/usr/local
. Ciascuno di questi livelli può contenere le directorybin
esbin
; -
I file di configurazione sono memorizzati in
/etc
e~
; -
I dotfile sono file nascosti che iniziano con un punto (
.
).
Abbiamo anche discusso del kernel Linux. Le cose più importanti sono:
-
Per Linux, ogni cosa è un file;
-
Il kernel Linux si trova in
/boot
assieme agli altri file relativi all’avvio; -
Affinchè i processi possano essere eseguiti, il kernel deve prima essere caricato in un’area di memoria protetta;
-
Il compito del kernel è allocare le risorse di sistema per i processi;
-
Il filesystem virtuale (o pseudo filesystem)
/proc
memorizza, in modo volatile, importanti dati del kernel e del sistema.
Allo stesso modo, abbiamo esplorato i dispositivi hardware e appreso quanto segue:
-
La directory
/dev
memorizza file speciali (o nodi) per tutti i dispositivi hardware collegati: dispositivi a blocchi o dispositivi a caratteri. I primi trasferiscono i dati in blocchi; i secondi, un carattere alla volta; -
La directory
/dev
contiene anche altri file speciali come/dev/zero
,/dev/null
o/dev/urandom
; -
La directory
/sys
memorizza le informazioni sui dispositivi hardware in base a una suddivisione per categorie.
Infine, abbiamo affrontato la memoria. Ecco ciò che abbiamo imparato:
-
Un programma viene eseguito quando viene caricato in memoria;
-
Cos’è la RAM (Random Access Memory);
-
Cos’è lo Swap;
-
Come visualizzare l’utilizzo della memoria.
Comandi utilizzati in questa lezione:
cat
-
Concatena/stampa il contenuto di un file.
free
-
Visualizza la quantità di memoria libera e utilizzata nel sistema.
ls
-
Elenca il contenuto di una directory.
which
-
Mostra la posizione di un programma.
Risposte agli Esercizi Guidati
-
Usa il comando
which
per scoprire la posizione dei seguenti programmi e completare la tabella:Programma Comando which
Percorso dell’eseguibile (output) L’utente ha bisogno dei privilegi di root
?swapon
which swapon
/sbin/swapon
Si
kill
which kill
/bin/kill
No
cut
which cut
/usr/bin/cut
No
usermod
which usermod
/usr/sbin/usermod
Si
cron
which cron
/usr/sbin/cron
Si
ps
which ps
/bin/ps
No
-
Dove si trovano i seguenti file?
File /etc
~
.bashrc
No
Si
bash.bashrc
Si
No
passwd
Si
No
.profile
No
Si
resolv.conf
Si
No
sysctl.conf
Si
No
-
Spiega il significato degli elementi numerici del file del kernel
vmlinuz-4.15.0-50-generic
che si trova in/boot
:Elemento numerico Significato 4
Kernel version
15
Major revision
0
Minor revision
50
Patch number
-
Quale comando puoi usare per elencare tutti i dischi rigidi e le partizioni in
/dev
?ls /dev/sd*
Risposte agli Esercizi Esplorativi
-
I file di dispositivo per i dischi rigidi sono rappresentati in base ai controller che usano: abbiamo visto
/dev/sd*
per i dischi che utilizzano SCSI (Small Computer System Interface) e SATA (Serial Advanced Technology Attachment), ma-
Come erano rappresentati i vecchi dischi IDE (Integrated Drive Electronics)?
/dev/hd*
-
E i moderni dischi NVMe (Non-Volatile Memory Express)?
/dev/nvme*
-
-
Dai un’occhiata al file
/proc/meminfo
. Confronta il contenuto di questo file con l’output del comandofree
e identifica quale voce di/proc/meminfo
corrisponde ai seguenti campi nell’output difree
:Output di free
Campo di /proc/meminfo
total
MemTotal
/SwapTotal
free
MemFree
/SwapFree
shared
Shmem
buff/cache
Buffers
,Cached
eSReclaimable
available
MemAvailable