4.3 Struttura del File System in Linux

Per un sistema operativo, tutto è considerato dati. Per Linux, tutto è considerato un file: programmi, file regolari, directory, dispositivi a blocchi (dischi rigidi, ecc.), dispositivi di carattere (console, ecc.), processi del kernel, socket, partizioni, collegamenti, ecc La struttura di directory Linux, a partire dalla radice/, è una raccolta di file contenenti dati. Il fatto che tutto sia un file è una potente funzionalità di Linux in quanto permette di modificare praticamente ogni singolo aspetto del sistema.

In questa lezione discuteremo le diverse posizioni in cui vengono memorizzati dati importanti come stabilito dal Linux Filesystem Hierarchy Standard (FHS). Alcuni di questi percorsi sono directory reali che memorizzano i dati in modo persistente sui dischi, mentre altri sono pseudo filesystem caricati in memoria che ci danno accesso ai dati del sottosistema del kernel come processi in esecuzione, uso della memoria, configurazione hardware e così via. I dati memorizzati in queste directory virtuali vengono utilizzati da una serie di comandi che ci permettono di monitorarli e gestirli.

Programmi e loro configurazione

I dati importanti su un sistema Linux sono — senza dubbio — i suoi programmi e i loro file di configurazione. I primi sono file eseguibili contenenti insiemi di istruzioni che devono essere eseguiti 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. I dati di configurazione su Linux sono tradizionalmente memorizzati anche in file di testo, anche se esistono vari stili di rappresentazione dei dati di configurazione.

Dove sono archiviati i file binari

Come qualsiasi altro file, i file eseguibili vivono in directory appese alla fine da /. Più specificamente, i programmi sono distribuiti su una struttura a tre livelli: il primo livello (/) include programmi che possono essere necessari in modalità utente singolo, il secondo livello (/usr) contiene la maggior parte dei programmi multi-utente e il terzo livello (/usr/local) viene utilizzato per archiviare software che non è fornito dalla distribuzione e è stato compilato localmente.

Le posizioni tipiche dei programmi includono: /sbin

Contiene binari essenziali per l’amministrazione del sistema come parted o ip. /bin

Contiene binari essenziali per tutti gli utenti come ls, mv, o mkdir. /usr/sbin

Memorizza i file binari per l’amministrazione del sistema come deluser o groupadd. /usr/bin

Include la maggior parte dei file eseguibili, come free, pstree, sudo o man, che possono essere utilizzati da tutti gli utenti. /usr/local/sbin

Viene utilizzato per archiviare programmi installati localmente per l’amministrazione del sistema che non sono gestiti dal gestore pacchetti del sistema. /usr/local/bin

Serve allo 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.

Nota La directory /opt viene talvolta utilizzata per archiviare applicazioni di terze parti opzionali.

Oltre a queste directory, gli utenti regolari possono avere i propri programmi in:

/home/ $utente/bin

/home/ $user/.local/bin

Suggerimento È possibile scoprire da quali directory sono disponibili per eseguire i file binari facendo riferimento alla variabile PATH con echo $PATH. Per ulteriori informazioni su PATH, consulta le lezioni sulle variabili e la personalizzazione della shell.

Possiamo trovare la posizione dei programmi con il quale comando:

$quale git

/usr/bin/git

Dove sono archiviati i file di configurazione

La directory /etc

Nei primi giorni di Unix c’era una cartella per ogni tipo di dati, come /bin per i binari e /boot per i kernel. Tuttavia, /etc (cioè et cetera) è stato creato come directory catch-all 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 così /etc è diventato la cartella principale per i file di configurazione dei programmi. Come detto sopra, un file di configurazione di solito è un file di testo locale (al contrario di binario) che controlla il funzionamento di un programma.

In /etc possiamo trovare diversi modelli per i nomi dei file di configurazione:

File con un’estensione ad hoc o nessuna estensione a tutti, per ExampleGroupSystem gruppo database.HostNameName del computer ospitante.HostsList di indirizzi IP e il loro hostname translations.PasswdSystem database utente — composto da sette campi separati da due punti che forniscono informazioni sul User.ProfileSystem-wide per il file BASH.ShadowEncrypted per le password utente.

File di inizializzazione che terminano in RC:bash.bashrcsystem-wide file.bashrc per il file di inizializzazione interattivo bash shells.Nanorcsample per GNU nano (un semplice editor di testo che normalmente viene fornito con qualsiasi distribuzione).

File che terminano in file.conf:resolv.confconfig per il resolver — che forniscono l’accesso al file DNS (Internet Domain Name System) .sysctl.confconfig per impostare le variabili di sistema per il kernel.

Directory con il suffisso.d: Alcuni programmi con un file di configurazione unico (*.conf o altro) si sono evoluti per avere una directory *.d dedicata che aiuta a creare configurazioni modulari e più robuste. Ad esempio, per configurare logrotate, troverete logrotate.conf, ma anche le directory logrotate.d. Questo approccio è utile nei casi in cui diverse applicazioni necessitano di configurazioni per lo stesso servizio specifico. Se, ad esempio, un pacchetto di server Web contiene una configurazione logrotate, questa configurazione può essere inserita in un file dedicato nella directory logrotate.d. Questo file può essere aggiornato dal pacchetto webserver senza interferire con la restante configurazione logrotate. Allo stesso modo, i pacchetti possono aggiungere attività specifiche inserendo file nella directory /etc/cron.d invece di modificare /etc/Crontab.in Debian — e le derivate Debian — un simile approccio è stato applicato alla lista delle fonti affidabili 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 in HOME (Dotfiles)

A livello di utente, i programmi memorizzano le loro configurazioni e impostazioni in file nascosti nella home directory dell’utente (rappresentata anche ~). Ricordate, i file nascosti iniziano con un punto (.) – da qui il loro nome: dotfiles.

Alcuni di questi dotfile sono script Bash che personalizzano la sessione della shell dell’utente e vengono originati non appena l’utente accede al sistema: .bash_history

Memorizza la cronologia della riga di comando.. bash_logout

Include comandi da eseguire quando si lascia la shell di login.. bashrc

Script di inizializzazione di Bash per shell non-login.. profilo

Lo script di inizializzazione di Bash per le shell di accesso.

Nota Fare riferimento alla lezione su «Command Line Nozioni di base» per ulteriori informazioni su Bash e sui suoi file init.

I file di configurazione di altri programmi specifici dell’utente vengono originati quando vengono avviati i rispettivi programmi: .gitconfig, .emacs.d, .ssh, ecc.

Il kernel Linux

Prima di poter eseguire qualsiasi processo, il kernel deve essere caricato in un’area protetta di memoria. Dopodiché, il processo con PID 1 (più spesso che non systemd al giorno d’oggi) fa partire la catena di processi, vale a dire, un processo inizia altri (s) e così via. Una volta attivi i processi, il kernel Linux si occupa di allocare risorse a loro (tastiera, mouse, dischi, memoria, interfacce di rete, ecc.).

Nota Prima di systemd, /sbin/init era sempre il primo processo in un sistema Linux come parte del gestore di sistema System V Init. In effetti, trovi ancora /sbin/init attualmente ma collegato a /lib/systemd/systemd.

Dove sono memorizzati i kernel: /boot

Il kernel risiede in/boot — insieme ad altri file relativi all’avvio. La maggior parte di questi file include i componenti del numero di versione del kernel nei loro nomi (versione del kernel, revisione principale, revisione minore e numero di patch).

La directory /boot include i seguenti tipi di file, con nomi corrispondenti alla rispettiva versione del kernel: config-4.9.0-9-amd64

Impostazioni di configurazione per il kernel come opzioni e moduli che sono stati compilati insieme a kernel.initrd.img-4.9.0-9-amd64

Immagine del disco RAM iniziale che aiuta nel processo di avvio caricando un file system radice temporaneo in Memory.System-Map-4.9.0-9-AMD64

Mappe del dispositivo dei dischi rigidi. Gestisce la memoria prima del caricamento del kernel.vmlinuz-4.9.0-9-amd64

Il kernel corretto in un formato autoestraente, salvaspazio, compresso (da qui la z in vmlinuz; vm sta per memoria virtuale e ha iniziato ad essere usato quando il kernel ha ottenuto il supporto per la memoria virtuale) .grub

Directory di configurazione per il bootloader di grub2.

Suggerimento Poiché si tratta di una caratteristica critica del sistema operativo, più di un kernel e i relativi file vengono mantenuti in/boot nel caso in cui quello predefinito diventi difettoso e dobbiamo ripiegare su una versione precedente per — almeno — essere in grado di avviare il sistema e ripararlo.

La directory /proc

La directory /proc è uno dei cosiddetti filesystem virtuali o pseudo poiché i suoi contenuti non sono scritti su disco, ma caricati in memoria. Viene popolato dinamicamente ogni volta che il computer si avvia e riflette costantemente lo stato corrente del sistema. /proc include 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 i file con informazioni sull’hardware del sistema e le impostazioni di configurazione del kernel. Alcuni di questi file includono: /proc/cpuinfo

Memorizza le informazioni sulla CPU del sistema:

$cat /proc/cpuinfo

processore: 0

vendor_id: GenuineIntel

famiglia cpu: 6

modello: 158

nome del modello: Intel (R) Core (TM) i7-8700K CPU @ 3.70GHz

passo: 10

cpu MHz: 3696.000

dimensione della cache: 12288 KB

(…)

/proc/cmdline

Memorizza le stringhe passate al kernel all’avvio:

$cat /proc/cmdline

boot_image=/boot/vmlinuz-4.9.0-9-amd64 root=uuuid=5216e1e4-ae0e-441f-b8f5-8061c0034c74 ro tranquillo

/proc/moduli

Mostra l’elenco dei moduli caricati nel kernel:

$cat /proc/moduli

nls_utf8 16384 1 – Live 0xffffffc0644000

isofs 40960 1 – Live 0xffffffc0635000

udf 90112 0 – Live 0xffffffc061e000

crc_itu_t 16384 1 udf, live 0xffffffc04be000

fusibile 98304 3 – Live 0xffffffc0605000

vboxsf 45056 0 – Live 0xffffffc05f9000 (O)

joydev 20480 0 – Live 0xffffffc056e000

vboxguest 327680 5 vboxsf, live 0xffffffc05a8000 (O)

hid_generic 16384 0 – Live 0xffffffc0569000

(…)

La directory /proc/sys

Questa directory include le impostazioni di configurazione del kernel in file classificati in categorie per sottodirectory:

$ls /proc/sys

abi debug dev fs kernel net user vm

La maggior parte di questi file agisce come un interruttore e, quindi, contiene solo uno dei due valori possibili: 0 o 1 («on» o «off»). Per esempio: /proc/sys/net/ipv4/ip_forward

Il valore che abilita o disabilita la nostra macchina per fungere da router (essere in grado di inoltrare pacchetti):

$cat /proc/sys/net/ipv4/ip_forward

0

Ci sono alcune eccezioni, però: /proc/sys/kernel/pid_max

Il PID massimo consentito:

$cat /proc/sys/kernel/pid_max

32768

Attenzione Prestare particolare attenzione quando si modificano le impostazioni del kernel poiché il valore errato potrebbe causare un sistema instabile.

Dispositivi hardware

Ricorda, in Linux «tutto è un file». Ciò implica che le informazioni sul dispositivo hardware e le impostazioni di configurazione del kernel sono tutte memorizzate in file speciali che risiedono nelle directory virtuali.

La directory /dev

La directory del dispositivo /dev contiene file di periferica (o nodi) per tutti i dispositivi hardware connessi. Questi file di dispositivo vengono utilizzati come interfaccia tra i dispositivi e i processi che li utilizzano. Ogni file del dispositivo rientra in una delle due categorie:Blocca dispositivi

Sono quelli in cui i dati vengono letti e scritti in blocchi che possono essere affrontati individualmente. Esempi includono dischi rigidi (e le loro partizioni, come /dev/sda1), unità flash USB, CD, DVD, ecc. Dispositivi con caratteri

Sono quelli in cui i dati vengono letti e scritti sequenzialmente un carattere alla volta. Esempi includono tastiere, console di testo (/dev/console), porte seriali (come /dev/ttyS0 e così via), ecc.

Quando si elencano i file del dispositivo, assicurarsi di utilizzare ls con l’opzione -l per distinguere tra i due. Possiamo, ad esempio, verificare la presenza di dischi rigidi e partizioni:

s -l /dev/sd *

brw-rw— 1 root disk 8, 0 maio 25 17:02 /dev/sda

brw-rw— 1 root disk 8, 1 maio 25 17:02 /dev/sda1

brw-rw— 1 root disk 8, 2 maio 25 17:02 /dev/sda2

(…)

O per terminali seriali (TeletypeWriter):

ls -l /dev/tty *

crw-rw-rw- 1 radice tty 5, 0 maggio 25 17:26 /dev/tty

crw—w— 1 radice tty 4, 0 maggio 25 17:26 /dev/tty0

crw—w— 1 radice tty 4, 1 maggio 25 17:26 /dev/tty1

(…)

Si noti come il primo carattere è b per i dispositivi a blocchi e c per i dispositivi a caratteri.

Suggerimento L’asterisco () è un carattere globbing che significa 0 o più caratteri. Da qui la sua importanza nei comandi ls -l /dev/sd e ls -l /dev/tty * sopra. Per saperne di più su questi personaggi speciali, consulta la lezione sul globbing.

Inoltre, /dev include alcuni file speciali che sono molto utili per diversi scopi di programmazione: /dev/zero

Esso fornisce il maggior numero di caratteri nulli come richiesto. /dev/null

– Ovvero secchio. Elimina tutte le informazioni inviate. /dev/urandom

Genera numeri pseudo-casuali.

La directory /sys

Il filesystem sys (sysfs) è montato su/sys. È stato introdotto con l’arrivo del kernel 2.6 e ha significato un grande miglioramento su /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 ordinati in categorie. Ad esempio, per controllare l’indirizzo MAC della scheda di rete (enp0s3), si dovrebbe catalizzatore il seguente file:

$cat /sys/class/net/enp0s3/indirizzo

08:00:27:02:b 2:74

Tipi di memoria e memoria

Fondamentalmente, affinché un programma inizi a funzionare, deve essere caricato in memoria. In generale, quando parliamo di memoria ci riferiamo alla memoria ad accesso casuale (RAM) e — rispetto ai dischi rigidi meccanici — ha il vantaggio di essere molto più veloce. Sul lato inferiore, è volatile (cioè, una volta che il computer si spegne, i dati sono spariti).

Nonostante quanto sopra, quando si tratta di memoria, possiamo differenziare due tipi principali in un sistema Linux: memoria fisica

Conosciuto anche come RAM, si presenta sotto forma di chip costituiti da circuiti integrati contenenti milioni di transistor e condensatori. Questi, a loro volta, formano celle di memoria (l’elemento costitutivo di base della memoria del computer). Ognuna di queste celle ha un codice esadecimale associato – un indirizzo di memoria – in modo che possa essere referenziato quando necessario.Swap

Conosciuto anche come spazio di swap, è la porzione di memoria virtuale che vive sul disco rigido e viene utilizzata quando non c’è più RAM disponibile.

D’altra parte, c’è il concetto di memoria virtuale che è un’astrazione della quantità totale di memoria utilizzabile, indirizzamento (RAM, ma anche spazio su disco) come visto dalle applicazioni.

free parses /proc/meminfo e visualizza la quantità di memoria libera e utilizzata nel sistema in modo molto chiaro:

$gratis

totale utilizzato libero buff/cache condivisa disponibile

Materiale: 4050960 1474960 1482260 96900 1093740 2246372

Scambio: 4192252 0 4192252

Spieghiamo le diverse colonne:totale

Quantità totale di memoria fisica e swap installato.used

Quantità di memoria fisica e swap attualmente in uso.free

Quantità di memoria fisica e swap attualmente non in uso.shared

Quantità di memoria fisica utilizzata — per lo più — da tmpfs.buff/cache

Quantità di memoria fisica attualmente in uso dai buffer del kernel e dalla cache della pagina e slabs.available

Stima della quantità di memoria fisica disponibile per i nuovi processi.

Per impostazione predefinita libera mostra i valori in kibibyte, ma consente una varietà di interruttori per visualizzare i suoi risultati in diverse unità di misura. Alcune di queste opzioni includono: -b

Byte. -m

Mebibytes. -g

Gibibiti. -h

Formato leggibile dall’uomo.

-h è sempre comodo da leggere:

$gratis -h

totale utilizzato libero buff/cache condivisa disponibile

Mem: 3,9G 1,4G 1,5G 75M 1,0G 2,2G

Scambio: 4,0G 0B 4,0G

Nota Un kibibyte (KiB) equivale a 1.024 byte mentre un kilobyte (KB) equivale a 1000 byte. Lo stesso vale rispettivamente per mebibtytes, gibitybes, ecc.

Esercizi Guidati

Utilizzare il comando quale per trovare la posizione dei seguenti programmi e completare la tabella:ProgramQuale CommandPath to Executable (output) L’utente ha bisogno dei privilegi di root? swaponkillcutusermodcronps

Dove si trovano i seguenti file? File/etc ~.bashrcbash.bashrcpasswd.profileresolv.confsysctl.conf

Spiegare il significato degli elementi numerici per il file del kernel vmlinuz-4.15.0-50-generico trovato in /boot:number elementSignificante415050

Quale comando useresti per elencare tutti i dischi rigidi e le partizioni in/dev?

Esercizi esplorativi

I file dei dispositivi per i dischi rigidi sono rappresentati in base ai controller utilizzati — abbiamo visto /dev/sd * per le unità che utilizzano SCSI (Small Computer System Interface) e SATA (Serial Advanced Technology Attachment), ma

Come erano rappresentate le vecchie unità IDE (Integrated Drive Electronics)?

E le moderne unità NVMe (Non-Volatile Memory Express)?

Dai un’occhiata al file /proc/meminfo. Confrontare il contenuto di questo file con l’output del comando libero e identificare quale chiave da /proc/meminfo corrispondono ai seguenti campi nell’output di free:free output/proc/meminfo fieldtotalfreesharedbuff/cacheavailable

Riepilogo

In questa lezione hai imparato a conoscere la posizione dei programmi e dei loro file di configurazione in un sistema Linux. I fatti importanti da ricordare sono:

Fondamentalmente, i programmi sono da trovare attraverso una struttura di directory a tre livelli:/, /usr e /usr/local. Ciascuno di questi livelli può contenere directory bin e sbin.

I file di configurazione sono memorizzati in /etc e ~.

I file Dotfiles sono file nascosti che iniziano con un punto (.).

Abbiamo anche discusso il kernel Linux. I fatti importanti sono:

Per Linux, tutto è un file.

Il kernel Linux vive in/boot insieme ad altri file relativi all’avvio.

Per avviare l’esecuzione dei processi, il kernel deve prima essere caricato in un’area protetta di memoria.

Il processo del kernel è quello di allocare le risorse di sistema ai processi.

Il filesystem virtuale /proc (o pseudo) archivia importanti dati del kernel e del sistema in modo volatile.

Allo stesso modo, abbiamo esplorato i dispositivi hardware e imparato quanto segue:

La directory /dev memorizza file speciali (ovvero nodi) per tutti i dispositivi hardware connessi: dispositivi a blocchi o dispositivi a caratteri. Il primo trasferimento dei dati in blocchi; il secondo, un carattere alla volta.

La directory /dev contiene anche altri file speciali come /dev/zero, /dev/null o /dev/urandom.

La directory /sys memorizza informazioni sui dispositivi hardware disposti in categorie.

Infine, abbiamo toccato la memoria. Abbiamo imparato:

Un programma viene eseguito quando viene caricato in memoria.

Che RAM (Random Access Memory) è.

Quello che Swap è.

Come visualizzare l’uso della memoria.

Comandi utilizzati in questa lezione:cat

Concatenate/stampa file content.free

Visualizzazione della quantità di memoria libera e utilizzata nel system.ls

Elenca i contenuti della directory.che

Mostra la posizione del programma.

Risposte agli esercizi guidati

Utilizzare il comando quale per trovare la posizione dei seguenti programmi e completare la tabella:ProgramQuale CommandPath to Binary (output) L’utente ha bisogno dei privilegi di root? swaponche swapon/sbin/swaponyeskillche uccide/bin/killnocutquale taglio/usr/bin/cutnousermodche usermod/usr/sbin/usermodyescronche cron/usr/sbin/cronyespsquali PS/bin/PSno

Dove si trovano i seguenti file? File/etc~.bashrcnoyesbash.bashrcyesnopasswdyesno.profilenoyesresolv.confyesnosysctl.confyesno

Spiegare il significato degli elementi numerici per il file del kernel vmlinuz-4.15.0-50-generico trovato in /boot:Number ElementSignificante4Kernel version15Major Revision0Minor Revision50Patch number

Quale comando useresti per elencare tutti i dischi rigidi e le partizioni in/dev? s /dev/sd *

Risposte agli esercizi esplorativi

I file dei dispositivi per i dischi rigidi sono rappresentati in base ai controller utilizzati — abbiamo visto /dev/sd * per le unità che utilizzano SCSI (Small Computer System Interface) e SATA (Serial Advanced Technology Attachment), ma

Come erano rappresentate le vecchie unità IDE (Integrated Drive Electronics)? /dev/hd *

E le moderne unità NVMe (Non-Volatile Memory Express)? /dev/nvme*

Dai un’occhiata al file /proc/meminfo. Confrontare il contenuto di questo file con l’output del comando libero e identificare quale chiave da /proc/meminfo corrispondono ai seguenti campi nell’output di free:free output/proc/meminfo fieldTotalMemTotal/SwapTotalFreeEmFree/SwapFreeSharedShMemBuff/cacheBuffers, cache e SreclamabiledisponibilemDisponibile