Una discussione di alto livello sui concetti del filesystem Linux

Questo articolo vuole essere una discussione di alto livello sui concetti del filesystem Linux. Non vuole essere una descrizione di basso livello su come funziona un particolare tipo di filesystem, come EXT4, né un tutorial sui comandi del filesystem.

Ogni computer di uso generale ha bisogno di memorizzare dati di vario tipo su un hard disk (HDD) o un equivalente, come una chiavetta USB. Ci sono un paio di ragioni per questo. Primo, la RAM perde il suo contenuto quando il computer viene spento. Ci sono tipi non volatili di RAM che possono mantenere i dati memorizzati dopo che l’alimentazione viene rimossa (come la RAM flash usata nelle chiavette USB e nelle unità a stato solido), ma la RAM flash è molto più costosa della RAM volatile standard come la DDR3 e altri tipi simili.

La seconda ragione per cui i dati devono essere memorizzati su hard disk è che anche la RAM standard è ancora più costosa dello spazio su disco. Sia i costi della RAM che del disco sono scesi rapidamente, ma la RAM è ancora in testa in termini di costo per byte. Un rapido calcolo del costo per byte, basato sui costi per 16GB di RAM contro un disco rigido da 2TB, mostra che la RAM è circa 71 volte più costosa per unità rispetto al disco rigido. Un costo tipico per la RAM è circa $0.0000000043743750 per byte oggi.

Per una rapida nota storica per mettere i costi attuali della RAM in prospettiva, nei primissimi giorni dell’informatica, un tipo di memoria era basata su punti su uno schermo CRT. Questo era molto costoso a circa $1.00 per bit!

Definizioni

Potresti sentire la gente parlare di filesystem in un numero di modi diversi e confusi. La parola stessa può avere molteplici significati, e potreste dover discernere il significato corretto dal contesto di una discussione o di un documento.

Tenterò di definire i vari significati della parola “filesystem” in base a come l’ho osservata essere usata in diverse circostanze. Si noti che, pur cercando di conformarsi ai significati standard “ufficiali”, il mio intento è quello di definire il termine in base ai suoi vari usi. Questi significati saranno esplorati più in dettaglio nelle sezioni seguenti di questo articolo.

  1. L’intera struttura di directory di Linux a partire dalla directory principale (/).
  2. Un tipo specifico di formato di archiviazione dati, come EXT3, EXT4, BTRFS, XFS e così via. Linux supporta quasi 100 tipi di filesystem, inclusi alcuni molto vecchi così come alcuni dei più nuovi. Ognuno di questi tipi di filesystem usa le proprie strutture di metadati per definire come i dati sono memorizzati e accessibili.
  3. Una partizione o un volume logico formattato con un tipo specifico di filesystem che può essere montato su un punto di montaggio specificato su un filesystem Linux.

Funzioni di base del filesystem

La memorizzazione su disco è una necessità che porta con sé alcuni dettagli interessanti e ineludibili. Ovviamente, un filesystem è progettato per fornire spazio per la memorizzazione non volatile dei dati; questa è la sua funzione finale. Tuttavia, ci sono molte altre funzioni importanti che derivano da questo requisito.

Tutti i filesystem hanno bisogno di fornire un namespace, cioè una metodologia di denominazione e organizzazione. Questo definisce come un file può essere nominato, in particolare la lunghezza di un nome di file e il sottoinsieme di caratteri che possono essere usati per i nomi di file sul totale dei caratteri disponibili. Definisce anche la struttura logica dei dati su un disco, come l’uso di directory per organizzare i file invece di raggrupparli tutti insieme in una singola, enorme congerie di file.

Una volta che lo spazio dei nomi è stato definito, una struttura di metadati è necessaria per fornire la base logica di quello spazio dei nomi. Questo include le strutture di dati richieste per supportare una struttura gerarchica di directory; strutture per determinare quali blocchi di spazio sul disco sono utilizzati e quali sono disponibili; strutture che permettono di mantenere i nomi dei file e delle directory; informazioni sui file come la loro dimensione e gli orari in cui sono stati creati, modificati o hanno avuto l’ultimo accesso; e la posizione o le posizioni dei dati appartenenti al file sul disco. Altri metadati sono usati per memorizzare informazioni di alto livello sulle suddivisioni del disco, come volumi logici e partizioni. Questi metadati di alto livello e le strutture che rappresentano contengono le informazioni che descrivono il filesystem memorizzato sul disco o sulla partizione, ma sono separati e indipendenti dai metadati del filesystem.

I filesystem richiedono anche una Application Programming Interface (API) che fornisce l’accesso alle chiamate di funzioni di sistema che manipolano oggetti del filesystem come file e directory. Le API forniscono compiti come la creazione, lo spostamento e la cancellazione di file. Forniscono anche algoritmi che determinano cose come la posizione di un file su un filesystem. Tali algoritmi possono tenere conto di obiettivi come la velocità o la minimizzazione della frammentazione del disco.

I filesystem moderni forniscono anche un modello di sicurezza, che è uno schema per definire i diritti di accesso a file e directory. Il modello di sicurezza del filesystem Linux aiuta a garantire che gli utenti abbiano accesso solo ai propri file e non a quelli di altri o al sistema operativo stesso.

Il blocco finale è il software necessario per implementare tutte queste funzioni. Linux usa un’implementazione software in due parti come un modo per migliorare sia l’efficienza del sistema che del programmatore.


Figura 1: L’implementazione software del filesystem Linux in due parti.

La prima parte di questa implementazione in due parti è il filesystem virtuale di Linux. Questo filesystem virtuale fornisce un singolo insieme di comandi per il kernel, e per gli sviluppatori, per accedere a tutti i tipi di filesystem. Il software del filesystem virtuale chiama il driver di dispositivo specifico richiesto per interfacciarsi con i vari tipi di filesystem. I driver di dispositivo specifici del filesystem sono la seconda parte dell’implementazione. Il driver di dispositivo interpreta l’insieme standard di comandi del filesystem in quelli specifici per il tipo di filesystem sulla partizione o volume logico.

Struttura delle directory

Come una Vergine solitamente molto organizzata, mi piacciono le cose immagazzinate in piccoli gruppi organizzati piuttosto che in un grande secchio. L’uso delle directory mi aiuta ad essere in grado di memorizzare e poi individuare i file che voglio quando li cerco. Le directory sono anche conosciute come cartelle perché possono essere pensate come cartelle in cui i file sono tenuti in una sorta di analogia fisica con il desktop.

In Linux e molti altri sistemi operativi, le directory possono essere strutturate in una gerarchia ad albero. La struttura delle directory di Linux è ben definita e documentata nel Linux Filesystem Hierarchy Standard (FHS). Fare riferimento a queste directory quando si accede ad esse è realizzato utilizzando i nomi di directory più profondi in sequenza collegati da barre in avanti (/) come /var/log e /var/spool/mail. Questi sono chiamati percorsi.

La seguente tabella fornisce una lista molto breve delle directory standard, ben note e definite di primo livello di Linux e dei loro scopi.

Directory Description
/ (root filesystem) La root filesystem è la directory di primo livello del filesystem. Deve contenere tutti i file richiesti per avviare il sistema Linux prima che vengano montati altri filesystem. Deve includere tutti gli eseguibili e le librerie necessarie per avviare gli altri filesystem. Dopo che il sistema è stato avviato, tutti gli altri filesystem sono montati su punti di montaggio standard e ben definiti come sottodirectory del filesystem root.
/bin La directory /bin contiene file eseguibili dall’utente.
/boot Contiene il bootloader statico e i file eseguibili e di configurazione del kernel necessari per avviare un computer Linux.
/dev Questa directory contiene i file dei dispositivi per ogni dispositivo hardware collegato al sistema. Questi non sono driver di dispositivi, piuttosto sono file che rappresentano ogni dispositivo sul computer e facilitano l’accesso a quei dispositivi.
/etc Contiene i file di configurazione del sistema locale per il computer host.
/home Rubrica di memorizzazione dei file utente. Ogni utente ha una sottodirectory in /home.
/lib Contiene i file di libreria condivisi che sono necessari per avviare il sistema.
/media Un posto per montare dispositivi multimediali esterni rimovibili come le chiavette USB che possono essere collegate all’host.
/mnt Un punto di montaggio temporaneo per filesystem regolari (non supporti rimovibili) che può essere usato mentre l’amministratore sta riparando o lavorando su un filesystem.
/opt I file opzionali come i programmi applicativi forniti dal fornitore dovrebbero essere posizionati qui.
/root Questo non è il filesystem root (/). È la directory home dell’utente root.
/sbin File binari di sistema. Questi sono eseguibili usati per l’amministrazione del sistema.
/tmp Cartella temporanea. Usata dal sistema operativo e da molti programmi per memorizzare file temporanei. Anche gli utenti possono memorizzare qui i file temporaneamente. Si noti che i file memorizzati qui possono essere cancellati in qualsiasi momento senza preavviso.
/usr Questi sono file condivisibili, di sola lettura, inclusi binari eseguibili e librerie, file man, e altri tipi di documentazione.
/var I file di dati variabili sono memorizzati qui. Questo può includere cose come file di log, MySQL e altri file di database, file di dati del server web, caselle di posta elettronica e molto altro.

Tabella 1: Il livello superiore della gerarchia del filesystem Linux.

Le directory e le loro sottodirectory mostrate nella Tabella 1, insieme alle loro sottodirectory, che hanno uno sfondo verde acqua sono considerate parte integrante del filesystem root. Cioè, non possono essere create come un filesystem separato e montate all’avvio. Questo perché esse (in particolare, il loro contenuto) devono essere presenti all’avvio affinché il sistema si avvii correttamente.

Le directory /media e /mnt sono parte del filesystem di root, ma non dovrebbero mai contenere dati. Piuttosto, sono semplicemente punti di montaggio temporanei.

Le restanti directory, quelle che non hanno colore di sfondo nella Tabella 1 non hanno bisogno di essere presenti durante la sequenza di avvio, ma saranno montate più tardi, durante la sequenza di avvio che prepara l’host ad eseguire il lavoro utile.

Siate sicuri di fare riferimento alla pagina web ufficiale di Linux Filesystem Hierarchy Standard (FHS) per i dettagli su ciascuna di queste directory e le loro molte sottodirectory. Anche Wikipedia ha una buona descrizione del FHS. Questo standard dovrebbe essere seguito il più strettamente possibile per assicurare la coerenza operativa e funzionale. Indipendentemente dai tipi di filesystem usati su un host, questa struttura gerarchica di directory è la stessa.

Struttura di directory unificata di Linux

In alcuni sistemi operativi per PC non-Linux, se ci sono più dischi rigidi fisici o più partizioni, ad ogni disco o partizione viene assegnata una lettera di unità. È necessario sapere su quale disco rigido si trova un file o un programma, come C: o D:. Poi si emette la lettera di unità come comando, D:, per esempio, per passare all’unità D:, e poi si usa il comando cd per passare alla directory corretta per localizzare il file desiderato. Ogni disco rigido ha il proprio albero di directory separato e completo.

Il filesystem Linux unifica tutti i dischi rigidi fisici e le partizioni in una singola struttura di directory. Tutto inizia in cima: la directory principale (/). Tutte le altre directory e le loro sottodirectory si trovano sotto la singola directory principale di Linux. Questo significa che c’è solo un singolo albero di directory in cui cercare file e programmi.

Questo può funzionare solo perché un filesystem, come /home, /tmp, /var, /opt, o /usr può essere creato su dischi rigidi fisici separati, una partizione diversa, o un volume logico diverso dal filesystem / (root) e poi essere montato su un punto di montaggio (directory) come parte dell’albero del filesystem root. Anche le unità rimovibili come una chiavetta USB o un disco rigido esterno USB o ESATA saranno montate sul filesystem di root e diventeranno parte integrante di quell’albero di directory.

Una buona ragione per fare questo è evidente durante un aggiornamento da una versione di una distribuzione Linux ad un’altra, o passando da una distribuzione ad un’altra. In generale, e a parte qualsiasi utilità di aggiornamento come dnf-upgrade in Fedora, è saggio riformattare occasionalmente il disco fisso (o i dischi fissi) che contengono il sistema operativo durante un aggiornamento per rimuovere positivamente qualsiasi traccia che si è accumulata nel tempo. Se /home fa parte del filesystem di root, sarà riformattato anch’esso e dovrà essere ripristinato da un backup. Avendo /home come un filesystem separato, sarà noto al programma di installazione come un filesystem separato e la sua formattazione può essere saltata. Questo si può applicare anche a /var dove sono memorizzati il database, le caselle di posta elettronica, il sito web e altri dati variabili dell’utente e del sistema.

Ci sono altre ragioni per mantenere alcune parti dell’albero delle directory di Linux come filesystem separati. Per esempio, molto tempo fa, quando non ero ancora consapevole dei potenziali problemi relativi all’avere tutte le directory Linux necessarie come parte del filesystem / (root), sono riuscito a riempire la mia directory home con un gran numero di file molto grandi. Poiché né la directory /home né la directory /tmp erano filesystem separati ma semplicemente sottodirectory del filesystem di root, l’intero filesystem di root si riempì. Non c’era più spazio per il sistema operativo per creare file temporanei o per espandere i file di dati esistenti. All’inizio, i programmi applicativi hanno iniziato a lamentarsi che non c’era spazio per salvare i file, e poi il sistema operativo stesso ha iniziato a comportarsi in modo molto strano. L’avvio in modalità utente singolo e la cancellazione dei file incriminati nella mia home directory mi hanno permesso di ripartire. Ho poi reinstallato Linux usando una configurazione multi-filesystem abbastanza standard e sono stato in grado di evitare che si verificassero di nuovo crash completi del sistema.

Una volta ho avuto una situazione in cui un host Linux continuava a funzionare, ma impediva all’utente di accedere usando il desktop GUI. Sono stato in grado di accedere utilizzando l’interfaccia a riga di comando (CLI) localmente utilizzando una delle console virtuali, e in remoto utilizzando SSH. Il problema era che il filesystem /tmp si era riempito e alcuni file temporanei richiesti dal desktop GUI non potevano essere creati al momento del login. Poiché il login CLI non richiedeva la creazione di file in /tmp, la mancanza di spazio lì non mi ha impedito di fare il login usando la CLI. In questo caso, la directory /tmp era un filesystem separato e c’era molto spazio disponibile nel gruppo di volumi di cui il volume logico /tmp faceva parte. Ho semplicemente espanso il volume logico /tmp a una dimensione che si adattava alla mia nuova comprensione della quantità di spazio per i file temporanei necessari su quell’host e il problema era risolto. Si noti che questa soluzione non ha richiesto un riavvio, e non appena il filesystem /tmp è stato ampliato l’utente è stato in grado di accedere al desktop.

Un’altra situazione si è verificata mentre stavo lavorando come amministratore di laboratorio in una grande azienda tecnologica. Uno dei nostri sviluppatori aveva installato un’applicazione nella posizione sbagliata (/var). L’applicazione andava in crash perché il filesystem /var era pieno e i file di log, che sono memorizzati in /var/log su quel filesystem, non potevano essere aggiunti con nuovi messaggi a causa della mancanza di spazio. Tuttavia, il sistema è rimasto attivo e funzionante perché i filesystem critici / (root) e /tmp non si sono riempiti. Rimuovere l’applicazione incriminata e reinstallarla nel filesystem /opt ha risolto il problema.

Tipi di filesystem

Linux supporta la lettura di circa 100 tipi di partizioni; può creare e scrivere solo su alcuni di questi. Ma è possibile – e molto comune – montare filesystem di tipi diversi sullo stesso filesystem di root. In questo contesto stiamo parlando di filesystem in termini di strutture e metadati richiesti per memorizzare e gestire i dati utente su una partizione di un disco rigido o un volume logico. La lista completa dei tipi di partizione del filesystem riconosciuti dal comando fdisk di Linux è fornita qui, in modo che si possa avere un’idea dell’alto grado di compatibilità che Linux ha con molti tipi di sistemi.

 0 Empty 24 NEC DOS 81 Minix / old Lin bf Solaris 1 FAT12 27 Hidden NTFS Win 82 Linux swap / So c1 DRDOS/sec (FAT- 2 XENIX root 39 Plan 9 83 Linux c4 DRDOS/sec (FAT- 3 XENIX usr 3c PartitionMagic 84 OS/2 hidden or c6 DRDOS/sec (FAT- 4 FAT16 <32M 40 Venix 80286 85 Linux extended c7 Syrinx 5 Extended 41 PPC PReP Boot 86 NTFS volume set da Non-FS data 6 FAT16 42 SFS 87 NTFS volume set db CP/M / CTOS / . 7 HPFS/NTFS/exFAT 4d QNX4.x 88 Linux plaintext de Dell Utility 8 AIX 4e QNX4.x 2nd part 8e Linux LVM df BootIt 9 AIX bootable 4f QNX4.x 3rd part 93 Amoeba e1 DOS access a OS/2 Boot Manag 50 OnTrack DM 94 Amoeba BBT e3 DOS R/O b W95 FAT32 51 OnTrack DM6 Aux 9f BSD/OS e4 SpeedStor c W95 FAT32 (LBA) 52 CP/M a0 IBM Thinkpad hi ea Rufus alignment e W95 FAT16 (LBA) 53 OnTrack DM6 Aux a5 FreeBSD eb BeOS fs f W95 Ext'd (LBA) 54 OnTrackDM6 a6 OpenBSD ee GPT10 OPUS 55 EZ-Drive a7 NeXTSTEP ef EFI (FAT-12/16/11 Hidden FAT12 56 Golden Bow a8 Darwin UFS f0 Linux/PA-RISC b12 Compaq diagnost 5c Priam Edisk a9 NetBSD f1 SpeedStor14 Hidden FAT16 <3 61 SpeedStor ab Darwin boot f4 SpeedStor16 Hidden FAT16 63 GNU HURD or Sys af HFS / HFS+ f2 DOS secondary17 Hidden HPFS/NTF 64 Novell Netware b7 BSDI fs fb VMware VMFS18 AST SmartSleep 65 Novell Netware b8 BSDI swap fc VMware VMKCORE1b Hidden W95 FAT3 70 DiskSecure Mult bb Boot Wizard hid fd Linux raid auto1c Hidden W95 FAT3 75 PC/IX bc Acronis FAT32 L fe LANstep1e Hidden W95 FAT1 80 Old Minix be Solaris boot ff BBT

Lo scopo principale nel supportare la capacità di leggere così tanti tipi di partizione è di permettere la compatibilità e almeno una certa interoperabilità con i filesystem di altri sistemi informatici. Le scelte disponibili quando si crea un nuovo filesystem con Fedora sono mostrate nella lista seguente.

  • btrfs
  • cramfs
  • ext2
  • ext3
  • ext4
  • fat
  • gfs2
  • hfsplus
  • minix
  • msdos
  • ntfs
  • reiserfs
  • vfat
  • xfs

Altre distribuzioni supportano la creazione di diversi tipi di filesystem. Per esempio, CentOS 6 supporta la creazione solo di quei filesystem evidenziati in grassetto nella lista precedente.

Montaggio

Il termine “montare” un filesystem in Linux si riferisce ai primi giorni dell’informatica quando un nastro o un disco rimovibile doveva essere fisicamente montato su un dispositivo appropriato. Dopo essere stato fisicamente posizionato sul disco, il filesystem sul disk pack sarebbe stato montato logicamente dal sistema operativo per rendere il contenuto disponibile per l’accesso da parte del sistema operativo, dei programmi applicativi e degli utenti.

Un punto di montaggio è semplicemente una directory, come qualsiasi altra, che viene creata come parte del filesystem root. Così, per esempio, il filesystem home è montato sulla directory /home. I filesystem possono essere montati in punti di montaggio su altri filesystem non root, ma questo è meno comune.

Il filesystem root di Linux è montato sulla directory principale (/) molto presto nella sequenza di avvio. Altri filesystem sono montati dopo, dai programmi di avvio di Linux, sia rc sotto SystemV che systemd nelle versioni più recenti di Linux. Il montaggio dei filesystem durante il processo di avvio è gestito dal file di configurazione /etc/fstab. Un modo semplice per ricordarlo è che fstab sta per “file system table”, ed è una lista di filesystem che devono essere montati, i loro punti di montaggio designati, e qualsiasi opzione che potrebbe essere necessaria per filesystem specifici.

I filesystem sono montati su una directory esistente/punto di montaggio usando il comando mount. In generale, qualsiasi directory usata come punto di montaggio dovrebbe essere vuota e non avere nessun altro file contenuto in essa. Linux non impedirà agli utenti di montare un filesystem su uno che è già presente o su una directory che contiene file. Se si monta un filesystem su una directory o filesystem esistente, il contenuto originale sarà nascosto e solo il contenuto del filesystem appena montato sarà visibile.

Conclusione

Spero che un po’ della possibile confusione intorno al termine filesystem sia stata chiarita da questo articolo. Mi ci è voluto molto tempo e un mentore molto utile per capire e apprezzare veramente la complessità, l’eleganza e la funzionalità del filesystem Linux in tutte le sue accezioni.

Se avete domande, aggiungetele nei commenti qui sotto e cercherò di rispondere.

Il mese prossimo

Un altro concetto importante è che per Linux, tutto è un file. Questo concetto ha alcune interessanti e importanti applicazioni pratiche per gli utenti e gli amministratori di sistema. La ragione per cui lo menziono è che potreste voler leggere il mio articolo “Tutto è un file” prima dell’articolo che ho in programma per il mese prossimo sulla directory /dev.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.