In questi giorni mi sono ritrovato con la necessità di avere a disposizione 2 TB di spazio SSD sul mio sistema con Ubuntu, senza la possibilità di separare tale requisito sui 2 SSD da 1 TB che già possedevo. Fortunatamente, grazie alle funzionalità native del file system Btrfs, è possibile creare uno "storage pool" e raggiungere il risultato cercato, cioè un'unica "partizione" che si estende su diversi dischi fisici. Vediamo allora come unire 2 o 3 SSD o HDD e creare un unico disco ad alta capacità
Per questa guida ho utilizzato Ubuntu 20.04. La procedura è comunque analoga anche con Ubuntu 22.04 (la nuova versione). I comandi sono gli stessi sia per Ubuntu Desktop (la comune edizione da PC, dotata di interfaccia grafica) sia per Ubuntu Server.
Il risultato finale è esattamente quello che ci aspettiamo: avendo a disposizione 2 SSD "fisici" da 1 TB ognuno, ad esempio, la configurazione proposta di seguito permette di aggregarli, ed esporre al sistema operativo un'unica, grande partizione con capacità pari a 2 TB
Affidabilità, prestazioni e pericoli
Prima di proseguire, è bene capire che ci sono alcune importanti implicazioni legate all'affidabilità dell'area di archiviazione che andremo a creare seguendo questa procedura.In particolare: nella configurazione composta da 2 SSD o HDD uniti insieme, viene attivata una configurazione "RAID0" via software, cioè non è necessario il supporto RAID da parte scheda madre. Questo implica che ogni file scritto viene suddiviso fra i due dischi: grossomodo metà bit vengono scritti sul primo disco e metà sul secondo disco. Ne derivano importanti miglioramenti alla velocità di lettura e scritta dei dati, poiché i due dischi lavorano sempre in parallelo.
Il rovescio della medaglia è che, in caso uno qualsiasi dei due dischi smettesse di funzionare, anche i dati del disco superstite diverranno illeggibili, senza possibilità di recuperare. Per questo motivo, è importante creare backup periodici su unità esterna dei dati conservati sul nostro "disco unito", oppure utilizzarlo solo per parcheggiare informazioni temporanee o non-importanti.
L'altra soluzione prevede di unire insieme 3 SSD o HDD. In questo caso, viene attivata una configurazione RAID 5 che continua a funzionare e garantisce i dati anche in caso si rompa 1 dei 3 dischi. Nelle configurazioni RAID5, però, la capacità totale è pari alla somma di 2 dischi, non di 3
Dischi uguali o diversi?
La soluzione proposta di seguito consente sia di unire dischi di capacità uguale (ad esempio: unire 2 SSD da 1 TB l'uno uniti per ricavare 2 TB di spazio), sia di unire dischi di capacità diversa. Se però la capacità è diversa, lo spazio a disposizione che otterremo va calcolato a partire dal disco più "piccolo": ipotizzando, per estremizzare, di unire 1 disco da 250 GB e 1 disco da 1 TB si otterrà una capacità pari a 500 GB, cioè il disco di capacità inferiore moltiplicato per due. Di conseguenza, dal punto di vista "pratico", è vivamente raccomandabile utilizzare dischi dalla stessa capacità, oppure con differenze, in termini di gigabyte, minime.
Non importa invece utilizzare la stessa marca e/o modello: siamo liberi di unire, ad esempio, un SSD di Samsung ad un SSD di Corsair. Per assurdo, possiamo persino unire un SSD ad un disco fisso meccanico. È però importante ricordare che, così facendo, la velocità massima raggiungibile sarà dettata dal disco più lento: se dunque uniremo un disco fisso meccanico ad un SSD, lettura e scrittura avverranno con tutta l'insopportabile lentezza del vecchio disco meccanico.
Unire dischi Linux, Passo 1: Collegamento fisico
Per prima cosa, dobbiamo ovviamente collegare i dischi al PC. Per realizzare questa guida mi sono basato sulla mia esperienza diretta. Il PC sul quale ho svolto la procedura è stato dunque equipaggiato con:
- un SSD da 127 GB sul quale era già installato il sistema operativo
- un SSD da 1 TB (nel mio caso: Samsung SSD 860 EVO 1TB)
- un SSD da 1 TB (nel mio caso: Samsung SSD 860 QVO 1TB)
In una situazione come questa, lavoreremo sui due SSD da 1 TB, unendoli in uno spazio contiguo che verrà esposto al sistema operativo come un'unica, grande "partizione" da 2 TB.
Unire dischi Linux, Passo 2: Identificare i dischi
È ora di importanza critica identificare i dischi con la massima chiarezza. Lancia quindi il comando seguente per ottenere una lista di tutti i dischi connessi al sistema:
lsblk | grep -v loop
Vogliamo scoprire il "nome Linux" dei dischi da unire. Aiutandoci confrontando il valore riportato dalla colonna SIZE
(indica la capacità nominale dei vari dischi), dovremmo trovare una situazione simile alla seguente:
/dev/sda
: è il "nome Linux" del disco da 127 GB che contiene il sistema operativo/dev/sdb
: è il "nome Linux" del primo SSD da 1 TB/dev/sdc
: è il "nome Linux" del secondo SSD da 1 TB
Da notare che ogni disco potrebbe avere (non sempre) alcuni "rami" (ad esempio: sdb1
, sdb2
, sdb3
, sdb4
sotto al primo SSD da 1 TB): sono le partizioni attualmente presenti. Nel caso specifico: i due SSD da 1 TB erano precedentemente inseriti su PC funzionanti, e quello è il partizionamento standard applicato da Windows 11.
Nel prosieguo della guida lavoreremo dunque per unire i due SSD da 1TB chiamandoli /dev/sdb
e /dev/sdc
, come da figura. È importante però che presti la massima attenzione, e sostituisci questi nomi con quelli che hai appena scoperto sul tuo PC.
Unire dischi Linux, Passo 3: Verificare che i dischi non siano montati
Dalla stessa schermata precedente, verifichiamo che le partizioni eventualmente presenti sui dischi che vogliamo unire non siano montate. L'indicazione è riportata nella colonna MOUNTPOINT
.
In caso lo fossero, innanzitutto assicuriamoci di NON essere posizionati nel percorso in questione impartendo
cd $HOME
Ora possiamo smontare la partizione impartendo qualcosa di simile a
umount /media/dati
Chiaramente, sostituiamo a /media/dati
il percorso indicato nella colonna MOUNTPOINT
.
Per essere assolutamente chiari: il disco che contiene il sistema operativo NON deve essere smontato. È quindi normale che rimangano presenti mountpoint come /boot/efi
e /
relativi al disco che nello screenshot precedente è denominato /dev/sda
e che contiene Linux.
Unire dischi Linux, Passo 4: Pulire i dischi
Dobbiamo ora ripulire i dischi che vogliamo unire da ogni partizione preesistente. Questo, naturalmente, eliminerà tutti i dati presenti: è dunque importante assicurarsi di aver copiato altrove eventuali file importanti prima di proseguire. Non toccheremo il disco che contiene il sistema operativo: possiamo dunque spostare lì i dati.
Non appena siamo pronti, possiamo rimuovere tutte le partizioni dai due dischi /dev/sdb
e /dev/sdc
con il seguente comando concatenato. ATTENZIONE! Non c'è alcuna conferma! Assicurati, ancora una volta!, di sostituire /dev/sdb
e /dev/sdc
con i "nomi Linux" dei tuoi dischi, così come scoperti al Passo precedente
sudo dd if=/dev/zero of=/dev/sdb bs=512 count=1 && sudo dd if=/dev/zero of=/dev/sdc bs=512 count=1
Ovviamente, in caso stessimo unendo anche un terzo (o quarto!) disco, dovremo ripulire anche quello. Il comando di base è
sudo dd if=/dev/zero of=/dev/sdX bs=512 count=1
A questo punto possiamo verificare nuovamente lo stato dei dischi impartendo
lsblk | grep -v loop
Questa volta, i dischi che andremo ad unire non mostrano alcun "ramo", ovvero non contengono più nessuna partizione.
Unire dischi Linux, Passo 5: Creare le partizioni
Procediamo ora a creare le partizioni sui dischi desideriamo unire. Partiamo dal primo impartendo:
sudo cfdisk /dev/sdb
Non appena richiesto, utilizza le frecce direzionali della tastiera per selezionare gpt
come tipo di etichetta, quindi batti Invio
» Leggi anche: Differenza MBR e GPT: qual è il migliore? Quale scegliere per hard disk e SSD? Meglio MBR o GPT?
Dalla schermata successiva, assicurati che sia selezionato [New]
in basso e poi batti Invio
per creare una nuova partizione
Batti di nuovo Invio
per confermare la volontà di utilizzare tutto lo spazio a disposizione
Ora selezionata [Write]
e batti Invio
Ti verrà così richiesto di digitare yes
, seguito da Invio
, per confermare
Non ti resta ora altro da fare se non selezionare [Quit]
per uscire.
Impartisci ora per l'ennesima volta il solito comando per visualizzare lo stato dei dischi:
lsblk | grep -v loop
Noterai che il disco sul quale hai appena lavorato, /dev/sdb
nel mio caso, ha ora una partizione. Nello screenshot seguente, si chiama sdb1
Devi ora ripetere la stessa, identica procedura per creare una partizione anche sul secondo disco. Schematicamente:
sudo cfdisk /dev/sdc
gpt
[New]
- battere direttamente
Invio
quando viene richiesta la dimensione [Write]
- digitare
yes
quando richiesto [Quit]
lsblk | grep -v loop
Entrambi i dischi che vogliamo unire devono ora avere una partizione definita
In caso volessi aggiungere unire altri dischi, devi ripetere la stessa procedura. Lo scopo è di definire una, e una sola, partizione per ogni disco, grande quanto il disco intero.
Da qui in avanti lavoreremo sulle partizioni e non più sui dischi. È dunque importante prendere nota dei "nomi Linux" assegnati alle partizioni appena create. Nel mio caso, sono /dev/sdb1
e /dev/sdc1
, come da figura precedente. È importante però che presti la massima attenzione e sostituisci questi nomi con quelli che hai appena scoperto sul tuo PC.
[nota per smanettoni: è teoricamente possibile utilizzare Btrfs anche senza definire alcuna partizione. In questo caso, Btrfs sostituisce lo schema di partizionamento MBR o GPT con uno proprio. Ma, oltre ad essere una soluzione non-standard, è vivamente sconsigliata da più fonti]
Unire dischi Linux, Passo 6: Formattare in Btrfs
Ora che abbiamo definito le partizioni, dobbiamo formattarle con il filesystem Btrfs: è l'acronimo di B-tree file system, ma generalmente si legge "beter eff ess" oppure "bater eff ess".
Il comando da usare è simile al seguente:
sudo mkfs.btrfs -f -L ssd_dati_1 /dev/sdb1
Dove:
-f
: serve a forzare l'operazione. È necessario per sovrascrivere il file system sulla partizione che abbiamo appena creato-L ssd_dati_1
: è un nome a piacere, utile solo per identificare il disco/dev/sdb1
: è il "nome Linux" della partizione che vogliamo formattare, cioè la prima che abbiamo creato al Passo precedente
Devi quindi ripetere, impartendo il comando per formattare anche la partizione del secondo disco. Nel mio caso:
sudo mkfs.btrfs -f -L ssd_dati_2 /dev/sdc1
(fai attenzione a cambiare sia il nome a piacere indicato dopo il parametro -L
, sia il "nome Linux" della partizione da formattare!)
Procedi in maniera analoga per eventuali altri dischi che vuoi unire.
Unire dischi Linux, Passo 7: Creare lo storage pool
Entriamo ora nel vivo della trattazione e procediamo ad unire i due dischi da 1 TB in un unico disco da 2 TB! Tecnicamente andremo ad unire le partizioni che risiedono sui due dischi, ma il risultato è analogo. Sembra una cosa complicata, ma basta specificare TUTTI i "nomi Linux" delle partizioni che desideriamo unire in un unico comando simile al seguente:
sudo mkfs.btrfs -f -L ssd_dati_pool /dev/sdb1 /dev/sdc1
Dal messaggio di risposta, nota la riga Filesystem size
. Il risultato esatto varia a seconda del taglio di disco che hai usato nella tua specifica situazione, ma nel mio caso si legge 2.00TiB
: poiché ho unito 2 SSD da 1 TB l'uno, ho ottenuto appunto un'unico spazio di archiviazione da 2 TB, esattamente come volevo.
Unire dischi Linux, Passo 8: Montare e auto-montare il pool
Per accedere allo spazio d'archiviazione dobbiamo "montarlo". Nello specifico, basta montare una qualsiasi delle partizioni che abbiamo appena unito per rendere disponibile lo spazio totale.
Per la guida dettagliata al montaggio dei dischi puoi fare riferimento a quest'altro approfondimento:
Schematicamente:
blkid | grep /dev/sdb1
per scoprire loUUID
della partizionesudo mkdir /media/ssd_pool_dati
per creare la cartella nella quale andremo poi a montare la nostra "mega-partizione" (mountpoint)sudo touch "/media/ssd_pool_dati/Se mi vedi, il disco non è montato"
per scrivere il file di avvisosudo nano /etc/fstab
per aprire il file dedicato
Incolla ora queste due righe alla fine del file:
## TurboLab.it - mount storage pool
UUID="fb....fa5" /media/ssd_pool_dati auto nodev 0 2
Naturalmente, devi:
- indicare lo specifico
UUID
che hai scoperto un attimo fa - sostituire a
/media/ssd_pool_dati
il percorso del mountpoint che hai appena creato
Raccomando di nuovo la consultazione del già citato articolo completo per maggiori info sul mount tramite fstab.
Ripeto per la massima chiarezza: è necessario e sufficiente montare solo una qualsiasi delle partizioni che abbiamo appena unito. In altre parole: poiché, nella mia esperienza, ho unito /dev/sdb1
e /dev/sdc1
, mi sono limitato a scrivere qui lo UUID
di /dev/sdb1
per montare quella.
Al termine, premere la combinazione da tastiera Ctrl+O
seguita da Invio
per salvare il file e poi Ctrl+X
per uscire.
Da qui in avanti, la tua "maxi-partizione" che si estende sui vari dischi del pool verrà montata ad ogni avvio del PC. Se però vuoi vederla subito, senza bisogno di riavviare, ti basta impartire
sudo mount -a
Se non ottieni alcun messaggio di errore in risposta, l'operazione è andata a buon fine: il disco è stato montato nel mountpoint che hai indicato, che nel mio caso è /media/ssd_pool_dati
.
Unire dischi Linux, Passo 9: Impostare i permessi
Nella situazione attuale, il disco è montato e pronto, ma solo root può accedervi. A me piace questa configurazione e preferisco mantenerla così, per poi creare singole cartelle alle quali concedere l'accesso agli utenti standard. Ad esempio: puoi creare una cartella "pubblica", nella quale possono leggere e scrivere tutti gli utenti del sistema:
sudo mkdir /media/ssd_pool_dati/public && sudo chmod ugo=rwX /media/ssd_pool_dati/public -R
Ora puoi scrivere un file con il utente utente regolare ("senza sudo") e vederlo all'interno della cartella:
touch "/media/ssd_pool_dati/public/PROVA_POOL" && ls -la "/media/ssd_pool_dati/public/"
Da qui in poi, lo spazio erogato dal nostro "storage pool" funziona come una qualsiasi altro disco. Puoi quindi regolare i permessi, creare cartelle e file proprio come faresti di solito.
Unire dischi Linux, Passo 10: Visualizzare lo spazio libero
Visualizzare lo spazio libero e quello utilizzato sullo storage pool è.... più difficile di quanto possa sembrare. Non è "colpa" dello storage pool in sé, ma della modalità con cui il file system Btrfs alloca lo spazio su disco. Il discorso è piuttosto complesso (maggiori info qui e qui), e mi è chiaro solo in parte.
Nella maggior parte dei casi, comunque, possiamo farci un'idea di massima circa lo spazio libero impartendo questo comando:
sudo btrfs fi usage /media/ssd_pool_dati/
(sostituendo /media/ssd_pool_dati
con il mountpoint scelto ai Passi precedenti)
Le informazioni che cerchiamo sono:
Device size
: è la dimensione totale dello storage poolUsed
: è la quantità di spazio attualmente occupatoFree (estimated)
: è un'approssimazione dello spazio libero disponibile
In alcuni casi, poi provare anche il solito df -h
, per poi cercare nella lista la partizione che hai montato oppure il mountpoint
Nell'immagine precedente si vede che il mio pool, di cui fa parte la partizione con il "nome Linux" /dev/sdb1
e disponibile a partire dal mountpoint /media/ssd_pool_dati
, ha una capacità totale di 2.0T
(ovvero 2 TB, poichè ho usato 2 SSD da 1 TB l'uno) di cui ne sono stati usati pochi megabyte.
Unire dischi Linux, Passo 11: Controllare lo stato del pool
Trascorso qualche tempo, avremo sicuramente bisogno di controllare lo stato del nostro storage pool. Il comando indicato sopra, sudo btrfs fi usage /media/ssd_pool_dati/
, riporta anche altre informazioni utili
Nota, in particolare, la riga Data,
: nel caso dello screenshot precedente, ci segnala che lo storage pool è in modalità RAID0
. Significa che, come spiegavamo in apertura, la rottura di un solo disco causerà la perdita completa di tutti i dati, su entrambi i dischi che fanno parte del pool.
Un altro comando utile è:
sudo btrfs filesystem show
Da qui, si vede bene quali unità fanno parte del pool
Conclusioni
In questo articolo abbiamo visto come unire 2 o 3 SSD o HDD e creare un unico disco ad alta capacità, ovvero uno "storage pool", tramite la funzionalità dedicata del file system Btrfs. La procedura è davvero interessante e nemmeno troppo complicata per chi abbia un minimo di esperienza con la linea di comando. Io stesso la sto utilizzando in pratica su uno dei miei sistemi e, per il momento, funziona tutto come mi aspetto.
Il principale pericolo è costituito dalla modalità RAID0 che, nonostante permetta di unire i dischi e velocizzare gli accessi, espone al pericolo della perdita completa di dati in caso anche solo una delle unità coinvolte smettesse di funzionare. Tramite una buona procedura di backup periodico -che dovrebbe essere attuata a prescindere- ci si può comunque tutelare senza rinunciare ai benefici.