Il filesystem: dischi, partizioni, mount point | ALTRI capitoli | |||||||
Il disco fisso ( hard drive o hard disk ) principale, in un sistema Linux, è, solitamente, nominato:
Gli altri dischi fissi eventualmente presenti nel sistema, verranno identificati come:
e così via. L'acronimo “sd” sta per "SCSI ( Small Computer System Interface ) mass-storage driver". SCSI è un insieme di standard (comandi, protocolli, interfacce elettriche e ottiche) che definisce le connessioni fisiche e il trasferimento di dati tra le periferiche e il computer al quale queste sono collegate. Gli standard SCSI sono solitamente utilizzati per gli hard disk, i CD, i DVD, etc. Gli standard SCSI vengono spesso sostituiti da standard meno performanti, ma più economici, quali ATA/IDE (Advanced Technology Attachment / Integrated Drive Electronics) per gli hard disk e USB (Universal Serial Bus) per altre periferiche di uso comune. Nei sistemi Linux, per la gestione dei dischi e delle eventuali partizioni, sono disponibili i comandi:
Per sapere, per esempio, quanti e quali dischi sono stati rilevati dal sistema operativo, eseguite uno dei seguenti comandi:
Il comando
dove
La directory:
è una directory non presente sul disco fisso, bensì creata e gestita, dal kernel, direttamente nella memoria di sistema (RAM), ma rappresentata, sempre dal kernel, come una normale directory, così da permettere agli utenti di ottenere informazioni normalmente appannaggio del kernel stesso. Il kernel rappresenta questa directory come un vero e proprio filesystem indipendente, che proprio perchè non corrispondente ad un filesystem presente fisicamente sul disco, viene chiamato pseudo filesystem. La directory /dev non è il solo pseudo filesystem presente in un sistema Linux. Per esempio:
è lo pseudo filesystem dove vengono rappresentati tutti i processi in esecuzione in un dato momento. Tutti i file non relativi ad un processo, invece, vengono conservati in un altro pseudo filesystem, contenuto nella directory:
gestito direttamente dal kernel. È da questo file system che UDEV raccoglie le informazioni da pubblicare in /dev. UDEV è la componente software di Linux (dal kernel Linux 2.6) che si occupa di gestire le periferiche, creando o rimuovendo, in modo dinamico, per le sole periferiche connesse al sistema, i file di periferica all'interno della directory /dev. È il successore di devfs e hotplug e viene eseguito all'interno dello userspace, permettendo, così, all'utente di modificare i nomi delle periiferiche. Gli pseudo filesystem rappresentano un'interfaccia attraverso la quale le applicazioni utente possono interagire direttamente con il kernel, poichè rappresentano la struttura interna del kernel in un dato momento. Grazie alla creazione di filesystem virtuali, Linux rende possibile interagire con l'hardware sottostante, utilizzando le normali funzioni di Input/Output ( scrittura e lettura ). Proviamo a verificare su quale terminale o pseudo terminale stiamo lavorando, eseguendo il comando di shell:
Se riceviamo una risposta del tipo:
significa che stiamo lavorando su uno pseudoterminale, nominato 3 ( probabilmente, avremo già aperto altri due pseudoterminali ). Ora, apriamo un nuovo terminale e, con i privilegi di root, scriviamo una nuova riga nel file:
Torniamo, ora, sul nostro pseudoterminale 3 e troveremo stampato il messaggio appena inviato dal nuovo pseudoterminale. Le periferiche sono, normalmente, periferiche a blocchi o a caratteri. In generale, le periferiche a blocchi, quali dischi fissi e CD−ROM contengono dati, mentre le periferiche a caratteri, quali porte seriali, porte parallele per stampanti, mouse, sono le periferiche che trasmettono o trasferiscono dati. Per vedere l'elenco delle periferiche attualmente gestite dal kernel, sarà, quindi, sufficiente eseguire un listato all'interno della direcory dev:
oppure, per selezionare i dischi fissi:
Quindi, per leggere il contenuto del disco fisso principale, è sufficiente leggere il file sda:
In questo esempio, stiamo leggendo il primo settore (512 byte) del disco, che contiene il Master Boot Record. Per leggere il secondo settore del disco, sarà necessario il comando:
che legge i primi 512 byte, saltando i primi 512 byte. In presenza di più dischi fissi, nel sistema, come è possibile identificare esattamente un disco? A quale disco fisico corrisponde, per esempio, la periferica sda? Il kernel Linux, infatti, assegna i nomi ai vari dischi fissi ad ogni caricamento (boot) del sistema operativo: è possibile, quindi, operare su un disco, convinti di operare su un differente disco. In questo caso, può essere di enorme aiuto un sottosistema di /dev:
all'interno del quale i dischi vengono identificati con nomi più persistenti (uguali ad ogni caricamento, o boot, del sistema operativo):
proprio per offrire la possibilità all'utente ( e alle sue applicazioni ) di identificare in modo univoco tutti i dischi connessi al sistema. Le subdirectory contenute nella directory disk, infatti, contengono link simbolici che collegano uno specifico hard disk ad un file contenuto in /dev. Nella directory by-id, un disco fisso viene, solitamente, identificato con il suo numero seriale:
In questo esempio, vediamo che il disco fisso Hitachi_HTS545032B9A300_091111PB5C01QDKED30G corrisponde al disco denominato SDA. UDEVD (il demone UDEV) nomina le periferiche utilizzando:
Le regole seguite da UDEV per assegnare nomi persistenti alle periferiche sono specifiche del sistema in cui UDEV opera e sono scritte nei file di configurazione di UDEV, salvati nella directory:
Per avere l'elenco di tutti i nomi persistenti creati da UDEV per i dischi, eseguite il comando:
Nei sistemi Unix e Unix-like, come Linux, è possibile accedere alle periferiche hardware attraverso file speciali (chiamati anche device file, o file di periferica, o nodi), salvati nella directory:
Questi file possono essere letti e sovrascritti come normali file, ma, invece di leggere dal disco fisso o scrivere sul disco fisso, essi comunicano direttamente con un driver del kernel che, a sua volta, comunica direttamente con l'hardware. Una volta entrati in /dev, quindi, per individuare una periferica e verificarne i permessi associati, utilizzate il comando:
Il primo carattere di ciascuna riga dell'output, esprime il tipo di periferica che il file rappresenta:
Le periferiche a blocchi sono le periferiche, quali i dischi fissi, che hanno una dimensione fissa e i cui dati possono essere estratti a blocchi di dimensione determinata. I processi possono accedere a qualsiasi blocco di dati, in modo casuale, con l'aiuto del kernel. Le periferiche a caratteri lavorano su flussi di dati. Le periferiche a caratteri non hanno una dimensione. Da una periferica a caratteri, quale una stampante, è possibile leggere o scrivere solo singoli caratteri. Il kernel, una volta passati i dati ad un'altra periferica o ad un processo, non sarà più in grado di tornare indietro e riesaminare i caratteri del flusso precedente. I pipe sono simili alle periferiche a caratteri, con la sola differenza che il flusso di dati è instaurato tra due processi, non tra un processo e un driver del kernel. I socket, infine, sono flussi di dati utilizzati per le comunicazioni tra processi (interprocess communication). La coppia di numeri che appaiono prima della data, sono i cosiddetti major device number e minor device number, utili al kernel alla identificazione della periferica. I file speciali, una volta, venivano installati in fase di installazione del sistema operativo, utilizzando il comando:
ma ultimamente, i sistemi Linux hanno introdotto UDEV, per gestire i file /dev anche con il sistema operativo in esecuzione (runtime). UDEV è in grado di creare nodi (file di periferica) ogni qualvolta viene rilevata una nuova periferica, oppure di eliminare nodi ogni qualvolta una periferica viene rimossa. Grazie a questo meccanismo, la directory /dev conterrà, in gran parte, solo file di periferiche realmente connesse al sistema, in un dato momento. UDEV offre anche la possibilità di personalizzare la creazione dei file di periferica, o nodi, attraverso una potente interfaccia, che utilizza script, normalmente salvati all'interno della directory:
Come abbiamo già visto, i file di configurazione di UDEV si trovano, in realtà, in:
ma, come specificato dal README che troviamo in questa directory di configurazione, "i file presenti in questa directory vengono letti da udev(7) e utilizzati ogni qualvolta il kernel invia un evento. Se volete modificare il comportamento di UDEV, è possibile scegliere tra due opzioni:
La personalizzazione comprende i permessi sui file, l'allocazione all'interno del filesystem, la creazione di link simbolici. È facile capire come la personalizzazione potrebbe rendere problematica la localizzazione dei file di periferica da parte delle applicazioni esterne, che credono di trovare un determinato nodo all'interno della directory /dev, senza sapere che quel nodo, in realtà, in quel particolare sistema, è stato spostato in una directory differente. Un altro problema legato a UDEV è che quando vengono connesse, al computer, più periferiche dello stesso tipo, per esempio più periferiche USB, l'ordine in cui quelle periferiche appaiono all'interno della directory /dev potrebbe modificarsi ad ogni reboot del sistema, anche se ciascuna periferica rimanesse connessa alla stessa porta USB. Questo particolare problema può essere aggirato creando regole UDEV che creino link simbolici, a partire da un dato più stabile ( o persistente ), quale un numero seriale di periferica. E qui entra in gioco un altro filesystem virtuale, il filesystem Sysfs, esportato direttamente dal kernel, montato nella directory:
contenente tutte le informazioni sulle periferiche e sui driver di periferica, dal quale UDEV estrae le informazioni. Sysfs è una rappresentazione di oggetti del kernel, dei loro attributi e delle relazioni intercorrenti tra un oggetto e l'altro. Sysfs è composto da un'interfaccia di programmazione del kernel, per esportare questi oggetti via sysfs, e un'interfaccia utente che permette all'utente di vedere e manipolare questi oggetti esportati che, a loro volta, rimandano agli oggetti del kernel che rappresentano. Questa è la relazione esistente tra i costrutti del kernel e la loro rappresentazione esterna (userspace):
La directory /sys contiene le directory:
La directory base per le periferiche è, ovviamente:
che è la rappresentazione, dal punto di vista del kernel, di tutte le periferiche individuate dal boot del sistema e di come queste sono connesse l'una all'altra. È organizzata a partire dal bus di sistema (system bus) e la sua configurazione varia da sistema a sistema, ovviamente. Tre sono le directory comuni a tutti i sistemi operativi:
system contiene le periferiche fondamentali per il sistema, comprese le CPU ed i clock. virtual contiene le periferiche cosiddette memory-based, quali le periferiche:
contenute in:
oppure le periferiche di loopback, contenute in:
Infine, platform contiene tutte le periferiche, quali le embedded device, che non sono connesse attraverso un BUS tradizionale. Tutte le altre periferiche appaiono nella directory corrispondente al BUS di sistema al quale sono connesse. Il BUS PCI principale (root) appare come:
Una partizione è una porzione, separata e distinta, di un disco fisso. Una partizione può anche occupare un intero disco: in questo caso, il disco avrà una sola partizione. Perchè un disco dovrebbe essere diviso in più partizioni? Innanzitutto, creare più partizioni può evitare che un danno, subito da una delle partizioni, si riversi automaticamente sulle altre partizioni. In secondo luogo, ciascuna partizione può essere gestita da un differente filesystem. Per esempio, è possibile installare, su un disco fisso, due sistemi operativi differenti ( dual boot ), quali Windows e Linux, i quali hanno due filesystem differenti.
Senza un filesystem, un disco o una partizione di un disco conterrebbe solo una sequenza di bit, di cui il sistema operativo non saprebbe che fare. Un disco può contenere più partizioni, ma una partizione può contenere un solo filesystem. Inoltre, due partizioni differenti potrebbero contenere lo stesso filesystem, ma con differenti impostazioni, come le dimensioni del cluster: per la partizione in cui prevedo di salvare solo file di piccole dimensioni, tenderò ad impostare un cluster di dimensioni ridotte, in modo da non disperdere, inutilmente, spazio su disco, mentre per la partizione in cui prevedo di salvare solo file di grandi dimensioni, tenderò ad impostare un cluster di dimensioni superiori, in modo da velocizzare il processo di recupero dei dati. Se per i sistemi Microsoft i filesystem, FAT16, FAT32, NTFS, sono legati ad una ( o più ) particolare release del sistema operativo, diventando, quindi, una scelta obbligata, per l'utente, per un utente Linux è possibile decidere, in fase di installazione del sistema operativo, quale filesystem utilizzare. I sistemi operativi Linux, infatti, sono in grado di interpretare correttamente molti filesystem differenti, compresi quelli di altri sistemi operativi. Nel caso aveste installato due partizioni, nel vostro computer, ciascuna delle quali ospitasse un sistema operativo differente, Linux e Windows, per esempio, vi accorgereste ben presto che dalla partizione Linux siete in grado di aprire le directory Windows presenti sull'altra partizione, mentre dalla partizione Windows non siete in grado di leggere i file presenti sulla partizione Linux. I filesysyem principali di Linux sono:
o extended 2, il filesystem nato con Linux, molto resistente, già allora, alla frammentazione, ma ormai superato dalle versioni successive, caratterizzate dalla presenza della funzionalità definita Journaling, introdotta già con:
ma completamente implementata con la versione successiva:
in cui troviamo, anche, un maggior supporto per i filesystem ed i file di grandi dimensioni, con 48 bit utilizzati per l'indirizzamento dei blocchi su disco, l'introduzione dei blocchi contigui di dati ( Extent ), in cui memorizzare i dati di un file, al fine di migliorarne, poi, il recupero, della preallocazione e dell'allocazione ritardata dello spazio su disco. Ai suoi esordi, il sistema operativo Linux venne implementato su filesystem Minix ( il filesystem di una omonima versione commerciale di Unix, Minix ), che, però, aveva due importanti limiti: gli indirizzi dei settori ( blocchi ) venivano memorizzati con soli 16 bit e le directory potevano contenere file con nomi di non più di 14 caratteri. Con soli 16 bit a disposizione, le dimensioni massime del filesystem erano di 64 MB, pur riservando 1024 byte a ciascun settore. Per ovviare a questi inconvenienti, nacquero, prima, lo " Extended File System ", nel 1992, poi, il " Second Extended File System ", l'anno successivo. Con il " Second Extended File System ", tanto per intenderci, le dimensioni di un solo file potevano essere comprese tra i 16 GB ed i 2 TB, mentre le dimensioni complessive della partizione potevano essere comprese tra i 2 TB ed i 32 TB, contro i 64 MB del vecchio filesystem Minix. Nel 2001, nacque il " third extended file system " ( ext3 ), nel quale venne compreso il meccanismo del " journaling ". Nel 2008, arrivò il " fourth extended file system " ( ext4 ), in cui, fra le tante novità, le dimensioni di un solo file potevano essere comprese tra i 16 GB ed i 16 TB, mentre le dimensioni complessive della partizione potevano raggiungere 1 EB ( exabyte ): 1 GB x 1024 ( terabyte ) x 1024 ( petabyte ) x 1024.
Un altro filesystem con Journaling è:
che prende il nome dal suo creatore, Hans Reiser. Si tratta di un filesystem che gestisce ottimamente la memorizzazione ed il recupero di una gran quantità di piccoli file, tendendo a salvare più file in un unico blocco. Il suo successore:
a causa delle vicissitudini giudiziarie che hanno colpito il suo autore, non è sviluppato adeguatamente. Una valida alternativa è rappresentata dal filesystem:
un filesystem in continuo sviluppo, ma ricco di funzionalità avanzate, quali la deduplicazione ( un processo che tenta di identificare file duplicati presenti su uno o più dischi ), la compressione dei dati, la gestione del filesystem estesa a più hard disk. È bene ricordare, però, che
che presenta molte delle caratteristiche di
particolarmente indicato per la gestione di dischi e file di grandi dimensioni. Lavorare con un nuovo disco, in un sistema Linux, può essere un compito molto semplice, ma il primo problema che si pone è come identificare il disco su cui si desidera operare. Filesystem: i mount point ed il file di configurazione Prima di poter utilizzare un filesystem, è necessario associarlo ad una partizione del disco. Abbiamo detto che una partizione può contenere un solo filesystem, ma un filesystem può essere installato su più partizioni. Il vostro filesystem viene sempre rappresentato da una struttura ad albero, dalla cui radice ( root ) si dipartono tutte le directory e le sottodirectory che compongono l'intero filesystem. Ciascuna delle parti dell'albero ( rami ), quindi, ciascuna directory o sottodirectory, può essere allocata in una partizione diversa dalla partizione in cui si trova la radice ( root ) e quella partizione diversa potrebbe tranquillamente trovarsi su un disco differente da quello in cui si trova la radice, anche su un disco esterno ( un disco DVD, oppure USB, oppure su un disco di un computer remoto ). Associare un filesystem ad una particolare partizione significa eseguire un mount del filesystem. Prima di aver effettuato il mount di una partizione o di una periferica e del relativo filesystem, il sistema operativo non ne conoscerà nemmeno l'esistenza.
Grazie al mount del filesystem, dovunque si trovi, una directory o una sottodirectory del filesystem verrà sempre vista come parte di esso, poichè sarà sempre associata ad un mount point, cioè ad un punto di accesso. Vediamo un esempio:
Questo è il contenuto del file:
FileSystem Table, nel quale è possibile indicare al sistema operativo quali filesystem associare a quali partizioni, in fase di boot ( caricamento del sistema operativo ). Il file
eseguono sequenzialmente i comandi. Ciascun filesystem viene descritto in una riga separata dalle altre. Ciascun campo è separato dagli altri da tab o spazi. Le righe che iniziano con:
sono commenti e vengono ignorate, così come le righe bianche. Il primo campo descrive la periferica a blocchi o il filesystem remoto da montare. Nel nostro esempio, nella partizione:
viene installato un filesystem
Un punto di accesso deve essere creato prima di eseguire il Per i filesystem NFS (Network File System), il primo campo avrà una sintassi simile alla seguente:
Per i filesystem senza storage, può essere utilizzata qualsiasi stringa testuale, per il primo campo. Per esempio:
Altri filesystem speciali, quali:
non vengono, normalmente, listati in
Questo renderà il sistema molto più robusto, visto che, aggiungendo o eliminando un disco fisso, il nome della periferica potrebbe essere modificato, mentre etichetta e UUID resterebbero comunque invariati. Per conoscere lo UUID di tutte le partizioni, eseguite il comando:
oppure, per conoscere l'etichetta e lo UUID di un particolare filesystem, il comando:
Il secondo campo di ciascun record del file
Per la partizione di swap, questo campo dovrebbe essere specificato come none:
Il terzo campo, indica il tipo di filesystem. È possibile non indicare il filesystem in uso, chiedendo al sistema operativo di riconoscerlo automaticamente. In questo caso, è sufficiente indicare, al posto del nome del filesystem, il termine:
Il quarto campo di ciascun record del file
Le opzioni disponibili, ovviamente, dipendono dal sistema operativo in uso. Per conoscerle, è sufficiente leggere la pagina di manuale del comando
anche se alcune di esse sono universali, quali:
La prima coppia di opzioni indica se il filesystem debba essere montato ( mounted ) in fase di boot del sistema, in modo automatico. La seconda coppia di opzioni indica se i file eseguibili presenti nella partizione debbano essere eseguiti (
comprende le opzioni:
Il quinto campo indica se e quando eseguire il back up ( dump ) della partizione ( il valore zero indica di non effettuare mai il backup della partizione ), nel nostro esempio:
Il sesto campo indica l'ordine in cui il programma
è riservato alla directory root;
indica di eseguire il check solo dopo averlo eseguito sulla directory root;
indica di non eseguire alcun check. In pratica, usa "1" per la partizione che contiene la root (
seguono esattamente ed iterativamente quest'ordine, sebbene il comando:
potrebbe anche seguire un ordine differente, nel caso lo ritenesse più sicuro ed opportuno " ( MAN page del file I comandi:
conservano un elenco dei filesystem installati ( mounted ) nel file:
Se si esegue il comando:
senza specificare alcun argomento, il comando restituisce questo elenco.
|
||||||||
Il filesystem: dischi, partizioni, mount point | Le guide di .bit: contenuto originale |