Introduzione alla terminologia e ai concetti dello storage su Linux

13 Luglio 2016 Fondamenti di Linux Storage Block Storage

Introduzione

Linux ha dei solidi meccanismi e strumenti per gestire i dispositivi hardware, incluse le unità di archiviazione (storage). In questo articolo parleremo, ad alto livello, del modo in cui Linux rappresenta questi dispositivi e di come, in un server, lo storage viene trasformato in spazio utilizzabile.

Cos’è lo storage a blocchi?

Lo storage a blocchi è un altro nome per intendere quello che il kernel di Linux chiama dispositivo a blocchi. Un dispositivo a blocchi è hardware che può essere utilizzato per memorizzare i dati, come un tradizionale hard disk drive i cui dischi ruotano ad un determinato numero di giri (HDD), un disco a stato solido (SSD), una memory stick, ecc. Si chiama dispositivo a blocchi perché le interfacce del kernel con l’hardware fanno riferimento a blocchi di dimensioni fisse, o porzioni (chuncks) di spazio.

Quindi, fondamentalmente, lo storage a blocchi è quello che voi pensate di un comune disco di archiviazione di un computer. Una volta che lo si è inizializzato, agisce in sostanza come una estensione del filesystem corrente e, senza soluzione di continuità, da tale unità si possono scrivere o leggere le informazioni.

Cosa sono le partizioni del disco?

Le partizioni del disco sono un modo per suddividere una unità di archiviazione in unità più piccole che possono essere utilizzabili. Una partizione è una sezione di una unità di archiviazione che può essere trattata allo stessa maniera del disco.

Il partizionamento consente di segmentare lo spazio a disposizione ed utilizzare ogni partizione per scopi diversi. Questo fornisce all’utente un sacco di flessibilità, dandogli l’eventuale possibilità di segmentare la sua installazione per un aggiornamento più semplice, per ospitare più sistemi operativi, lo spazio di swap o dei filesystem specializzati.

Mentre i dischi possono essere formattati ed utilizzati senza il partizionamento, alcuni sistemi operativi si aspettano di trovare una tabella delle partizioni anche se sul disco c’è solo una singola partizione scritta. In generale si consiglia di partizionare le nuove unità per avere in futuro una maggiore flessibilità.

MBR vs GPT

Quando si partiziona un disco è importante sapere quale formato di partizionamento verrà utilizzato. Questo in genere si riduce ad una scelta tra MBR (Master Boot Record) e GPT (GUID Partition Table).

MBR è il tradizionale sistema di partizionamento che è in uso da oltre 30 anni. A causa della sua età ha alcune gravi limitazioni. Per esempio non può essere utilizzato per i dischi più grandi di 2 Terabyte e può avere solo un massimo di quattro partizioni primarie. Per questo motivo la quarta partizione è generalmente impostata come “partizione estesa” nella quale si possono creare “partizioni logiche”. Ciò consente di suddividere efficacemente l’ultima partizione in ulteriori partizioni.

GPT è uno schema di partizionamento più moderno che tenta di risolvere alcuni dei problemi inerenti a MBR. I sistemi che usano GPT possono avere molte più partizioni per disco. Queste sono generalmente limitate solo dalle restrizioni imposte dal sistema operativo. Inoltre, con GPT non esiste la limitazione delle dimensioni del disco e le informazioni della tabella delle partizioni sono disponibili in più punti al fine di tutelarsi contro la corruzione dei dati. GPT può anche scrivere un “MBR di scorta” che dice ai tool che usano solo MBR che il disco è in uso.

Nella maggior parte dei casi, GPT è la scelta migliore a meno che il sistema operativo o i tool vi impediscano di utilizzarlo.

Formattazione e filesystem

Mentre il kernel di Linux è in grado di riconoscere un disco non formattato, il drive non può essere utilizzato così com’è. Per poterlo usare deve essere formattato. La formattazione è il processo di scrittura di un filesystem sul disco e la preparazione di tale disco per le operazioni sui file. Un filesystem è il sistema che struttura i dati e controlla come l’informazione viene scritta e recuperata dal disco sottostante. Senza un filesystem non è possibile utilizzare il dispositivo di archiviazione per alcuna operazione  correlata ai file.

Ci sono molti formati differenti di filesystem, ognuno con compromessi su tutta una serie di aspetti tra cui il supporto al sistema operativo. A livello basilare, tutti presentano all’utente una analoga rappresentazione del disco, ma le caratteristiche che ognuno di essi supporta ed i meccanismi utilizzati per permettere all’utente di effettuare operazioni e le operazioni di manutenzione possono essere molto diverse.

Alcuni dei filesystem per Linux più popolari sono:

  • Ext4: Il filesystem di default più popolare è ext4, ovvero la quarta versione del filesystem esteso. Il filesystem Ext4 è journaled, compatibile con i sistemi legacy, incredibilmente stabile ed ha un supporto e dei tool maturi. È una buona scelta se non avete esigenze particolari.
  • XFS: XFS è specializzato per le alte prestazioni e per grandi quantità di dati. Si formatta rapidamente ed ha buone peculiarità nel throughput durante la gestione di file di grandi dimensioni e quando si lavora con dischi di grandi dimensioni. Ha anche delle funzioni di snapshot a caldo. XFS utilizza il journaling dei metadati in contrasto con il journaling sia dei metadati che dei dati. Questo porta ad avere alte prestazioni ma può teoricamente causare il danneggiamento dei dati in caso di una improvvisa perdita dell’alimentazione.
  • Btrfs: Btrfs è un filesystem moderno, ricco di funzionalità e copy-on-write [“copia in caso di scrittura”, da Wikipedia]. Questa architettura consente ad alcune funzionalità di gestione del volume di essere integrate all’interno del layer del filesystem, tra le quali gli snapshot, la clonazione, i volumi, ecc. Btrfs ha ancora alcuni problemi nella gestione di dischi pieni. Si è dibattuto parecchio riguardo alla sua prontezza nei carichi di lavoro in ambito di produzione e molti amministratori di sistema sono in attesa che il filesystem raggiunga una maggiore maturità.
  • ZFS: ZFS è un filesystem copy-on-write ed è un volume manager con un insieme di funzionalità solido e maturo. Ha ottime caratteristiche di integrità dei dati, è in grado di gestire filesystem di grandi dimensioni, ha caratteristiche tipiche dei volumi come lo snapshot e la clonazione ed è in grado di organizzare i volumi in RAID e in array RAID-like per motivi di ridondanza e di prestazioni. Nell’uso su Linux, ZFS ha una storia controversa a causa di problemi di licenza. Tuttavia Ubuntu, per poter gestire ZFS, viene distrubuito con un modulo binario per il kernel e Debian include il codice sorgente nei suoi repository. Il supporto, relativamente ad altre distribuzioni, è ancora da definire.

La gestione delle periferiche di archiviazione in Linux

I file di dispositivo in /dev

In Linux, quasi tutto è rappresentato da un file. Questo include dell’hardware come le unità di archiviazione, che sono rappresentate dal sistema come file nella directory /dev. In genere i file che rappresentano dei dispositivi di archiviazione iniziano con sd o hd seguito da una lettera. Per esempio, la prima unità su un server è di solito qualcosa di simile a /dev/sda.

Su queste unità le partizioni hanno file anche all’interno di /dev, rappresentate aggiungendo il numero della partizione alla fine del nome dell’unità. Per esempio, la prima partizione sul disco dell’esempio precedente sarebbe /dev/sda1.

Mentre i file di dispositivo (device file) /dev/sd* e /dev/hd* rappresentano il tradizionale modo di fare riferimento alle unità e alle partizioni, vi è un significativo svantaggio nell’utilizzo diretto di questi valori. Il kernel di Linux decide quale dispositivo riceve il nome ad ogni avvio; questo può dunque portare a situazioni ambigue in cui i dispositivi cambiano device.

Per ovviare a questo problema, la directory /dev/disk contiene sottodirectory corrispondenti a differenti e più persistenti modi per identificare dischi e partizioni sul sistema. Queste sottodirectory contengono link simbolici che vengono creati all’avvio e che puntano al corretto file /dev/[sh]da* . Ai collegamenti viene dato il nome in base alla caratteristica che identifica la directory (ad esempio dall’etichetta di partizionamento della directory /dev/disk/by-partlabel). Questi collegamenti punteranno sempre ai dispositivi corretti, in modo che possano essere utilizzati come identificatori statici per gli spazi di archiviazione.

Alcune o tutte le seguenti sottodirectory possono essere presenti in /dev/disk :

  • by-label : La maggior parte dei filesystem hanno un meccanismo di etichettatura che consente l’assegnazione di nomi arbitrari, specificati dall’utente, per un disco o una partizione. Questa directory è costituita da link che prendono il nome da queste etichette fornite dall’utente.
  • by-uuid : Gli UUID, o identificatori univoci universali, sono una lunga ed univoca stringa di lettere e numeri che può essere utilizzata come un ID per una risorsa di storage. Questi ID di solito non hanno una forma particolarmente leggibile ma sono garantiti per essere sostanzialmente univoci, anche attraverso sistemi diversi. In tal modo, potrebbe essere una buona idea usare gli UUID per fare riferimento agli storage che possono migrare tra sistemi dal momento che le collisioni tra i nomi sono meno probabili.
  • by-partlabel e by-partuuid : Le tabelle GPT offrono il proprio insieme di etichette e di UUID che può essere utilizzato anche ai fini dell’identificazione. Ciò funziona in maniera molto simile alle precedenti due directory, ma usa degli identificatori specifici di GPT.
  • by-id : Questa directory contiene i link generati dai numeri di serie dell’hardware e dall’hardware a cui sono collegati. Ciò non è del tutto persistente, perché il modo in cui il dispositivo è collegato al sistema può cambiare il suo nome by-id.
  • by-path : Come by-id , questa directory si basa sulla connessione dei dispositivi di storage al sistema stesso. In questo caso i collegamenti sono costruiti utilizzando l’interpretazione che il sistema fa dell’hardware utilizzato per accedere al dispositivo. Questo ha gli stessi inconvenienti di by-id visto che il collegamento di un dispositivo ad una porta diversa può alterare questo valore.

Di solito, by-label o by-uuid sono le migliori opzioni per l’identificazione persistente di specifici device.

Nota

I volumi degli storage a blocchi di DigitalOcean controllano i numeri di serie dei dispositivi che vengono comunicati al sistema operativo. Questo permette alla categorizzazione by-id di essere persistente in maniera affidabile su tale piattaforma. Questo è il metodo preferibile per riferirsi ai volumi DigitalOcean visto che sono sia persistenti che prevedibili al primo avvio.

Montaggio dei dispositivi a blocchi

I file di dispositivo all’interno di /dev vengono utilizzati per comunicare con il driver del kernel per il dispositivo in questione. Tuttavia, per trattare il dispositivo come un segmento di spazio disponibile è necessaria una astrazione che possa essere di maggiore utilità.

In altri sistemi operativi Unix-like l’intero sistema, indipendentemente dal numero di dispositivi fisici che sono coinvolti, è rappresentato da una singola struttura unificata ad albero. In tal senso, quando un filesystem deve essere utilizzato su un disco o su una partizione, deve essere agganciato all’albero esistente. Il montaggio (mount) è il processo di collegamento di una partizione formattata o di unità ad una directory all’interno del filesystem di Linux. Il contenuto del disco può quindi essere accessibile da quella directory.

I drive sono quasi sempre montati su directory vuote dedicate a questo scopo (il mount su una directory non vuota significa che il normale contenuto della directory sarà inaccessibile finché l’unità non sarà smontata). Ci sono un sacco di diverse possibilità di collegamento che si possono impostare in modo da poter alterare il comportamento del dispositivo montato. Ad esempio, l’unità può essere montata in modalità di sola lettura per garantire che il suo contenuto non verrà modificato.

Il Filesystem Hierarchy Standard raccomanda di usare /mnt o una sottodirectory al di sotto di essa per i filesystem montati temporaneamente. Se ciò corrisponde al vostro caso tale directory è probabilmente il posto migliore per il mount. HFS non fa raccomandazioni sulle directory dove montare uno storage permanente, in modo da poter scegliere quale schema si desidera. In molti casi, le /mnt o le sottodirectory di /mnt vengono usate anch’esse per lo storage fisso.

Mount permanente con /etc/fstab

Per determinare quale filesystem montare durante il processo di avvio, i sistemi Linux controllano un file chiamato /etc/fstab (filesystem table). I filesystem che non hanno una voce in questo file non saranno montati automaticamente (fatta eccezione per quelli definiti dai file di unità systemd .mount, anche se tali file non sono ancora comuni).

Il file /etc/fstab è abbastanza semplice. Ogni linea rappresenta un filesystem diverso che andrà montato. La riga specifica il dispositivo a blocchi, il punto di montaggio a cui associarlo, il formato del disco e le opzioni di mount, assieme ad un paio di altre informazioni.

Storage management più complesso

Mentre la maggior parte degli scenari d’utilizzo sono semplici e non hanno bisogno di strutture di gestione aggiuntive, le maggiori prestazioni, la ridondanza o la flessibilità possono essere ottenute tramite paradigmi di gestione più complessi.

Cos’è il RAID?

RAID sta per Redundant Array Independent Disc [Serie indipendente e ridondante di dischi, NdT]. RAID è una tecnologia di gestione dello storage e della virtualizzazione che permette di raggruppare insieme dei drive e di gestirli come una singola unità che possegga funzionalità aggiuntive.

Le caratteristiche di un array RAID dipendono dal suo livello RAID, che definisce sostanzialmente come i dischi dell’array sono in relazione tra loro. Il livello scelto ha un impatto sulle prestazioni e sulla ridondanza dell’insieme. Alcuni dei livelli più comuni sono:

  • RAID 0: Questo livello indica il drive striping. Ciò significa che, mentre i dati vengono scritti sull’array, vengono divisi e distribuiti tra i dischi dell’insieme. Ciò offre un incremento delle prestazioni visto che i dischi possono essere scritti o letti simultaneamente. Lo svantaggio è che un singolo guasto del disco può far perdere tutti i dati dell’intero array, dal momento che nessun disco contiene abbastanza informazioni sui contenuti ai fini della ricostruzione.
  • RAID 1: RAID 1 è fondamentalmente il mirroring dei drive. Tutto quello che viene scritto in un array RAID 1 viene scritto su più dischi. Il vantaggio principale è la ridondanza dei dati, che consente ai dati di “sopravvivere” alla rottura del disco rigido in entrambi i lati del mirror. Visto che più unità contengono gli stessi dati, la capacità utilizzabile è ridotta della metà.
  • RAID 5: RAID 5 è lo striping dei dati su più dischi simili a RAID 0. Tuttavia, questo livello implementa anche una parità ripartita tra le unità. Ciò significa che, se il disco si rompe, i dischi rimanenti possono ricostruire l’array utilizzando le informazioni di parità condivise tra di loro. Le informazioni di parità sono sufficienti per ricostruire qualsiasi disco, cioè l’array può sopravvivere alla perdita di qualsiasi disco. Le informazioni di parità riducono lo spazio disponibile nell’array pari alla capacità di un disco.
  • RAID 6: RAID 6 ha le stesse proprietà di RAID 5, ma fornisce una doppia parità. Ciò significa che l’array di RAID 6 è in grado di sopportare la perdita di 2 dischi. La capacità dell’array è sempre influenzata dalla quantità della parità, il che significa che la capacità utilizzabile è diminuita dello spazio di due dischi.
  • RAID 10 RAID 10 è una combinazione dei livelli 1 e 0. Per prima cosa vengono fatte due serie di array in mirroring. Poi viene fatto lo striping dei dati tra esse. Ciò crea una matrice che ha alcune caratteristiche di ridondanza e delle buone prestazioni. Tuttavia, tutto ciò richiede un bel po’ di dischi e la capacità totale è la metà dello spazio su disco complessivo.

Cos’è LVM?

LVM, o Logical Volume Management [gestione dei volumi logici, NdT], è un sistema che astrae le caratteristiche fisiche dei dispositivi di memorizzazione sottostanti al fine di fornire una maggiore flessibilità e potenza. LVM consente di creare gruppi di dispositivi fisici e di gestirli come se si trattasse di un unico blocco di spazio. È quindi possibile segmentare lo spazio in volumi logici, a seconda delle necessità, che funzionano come partizioni.

LVM è implementato al di sopra delle partizioni regolari e aggira molte delle limitazioni intrinseche delle partizioni classiche. Ad esempio, utilizzando volumi LVM è possibile espandere facilmente le partizioni, creare partizioni che si estendono su più unità, creare degli snapshot a caldo di partizioni e muovere volumi su dischi fisici differenti. LVM può essere utilizzato in combinazione con RAID per fornire una gestione flessibile assieme alle tradizionali caratteristiche prestazionali di RAID.

Cosa fare ora?

Se disponete di un nuovo dispositivo di archiviazione che desiderate utilizzare nel vostro sistema Linux, questo articolo vi guiderà attraverso i procedimenti di base del partizionamento, formattazione e del montaggio del nuovo filesystem.Ciò dovrebbe essere sufficiente nella maggior parte dei casi in cui è fondamentale aggiungere della capacità di archiviazione aggiuntiva. Per informazioni su come eseguire le attività di base di amministrazione dello storage, date un’occhiata a questo articolo.

Autore: Justin Ellingwood

Traduzione dell’articolo: https://www.digitalocean.com/community/tutorials/an-introduction-to-storage-terminology-and-concepts-in-linux Copyright © 2016 DigitalOcean™ Inc.

 

Facebooktwittergoogle_plusredditpinterestlinkedinmail

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

*