Btrfs

Da Guide@Debianizzati.Org.
Vai alla navigazione Vai alla ricerca
File System e dispositivi fisici
Arrow left.png

Generalità

Locali

Remoti

Strumenti

Arrow right.png


Debian-swirl.png Versioni Compatibili

Tutte le versioni supportate di Debian

Introduzione

Dall'omonima pagina di wikipedia:

Btrfs (pronounced as "better F S", "butter F S", "b-tree F S", or B.T.R.F.S.) is a computer storage format that combines a file system based on the copy-on-write (COW) principle with a logical volume manager (distinct from Linux's LVM), developed together.
[...]
Btrfs is intended to address the lack of pooling, snapshots, checksums, and integral multi-device spanning in Linux file systems.

In poche parole questo filesystem incorpora alcune funzionalità avanzate come:

  • controllo dell'integrità dei dati per rilevare ed eventualmente correggere automaticamente alterazioni dei dati dovuti per esempio al semplice scorrere del tempo (Data degradation);
  • possibilità di creare volumi dati in modo simile ad LVM e quindi possibilità di variare facilmente le dimensioni di una "partizione";
  • possibilità di avere ridondanza dei dati in modo simile al RAID 1.

Btrfs è funzionalmente simile al ben più famoso ZFS, ma a differenza di quest'ultimo beneficia di un'integrazione nel kernel di linux.

Warning.png ATTENZIONE
Per quanto btrfs sia stato inserito nel kernel di linux da più di 15 anni esistono ancora configurazioni/funzionalità che sono da considerarsi sperimentali o addirittura problematiche, per tanto si consiglia caldamente di leggere questa pagina del wiki di debian per maggiori informazioni sull'argomento.


Info.png Volumi, dischi e partizioni
Nel seguito della guida si scriverà sempre genericamente di volume a prescindere che questo sia composto da un solo disco/partizione oppure più di uno. Dal punto di vista pratico infatti non fa alcuna differenza perché l'utente vedrà sempre e soltanto una "partizione" (ma lo spazio totale usabile ovviamente cambierà).
Bulb.png Suggerimento
Alcune operazioni (come la copia dei dati dai vecchi dischi/partizioni) possono richiedere molto tempo, pertanto si consiglia di eseguire dette operazioni all'interno di una sessione di GNU/Screen (o altro applicativo che permetta di "scollegarsi" dalla sessione di terminale senza terminarla).


Installazione

Tutti gli strumenti necessari a creare e manipolare un filesystem btrfs sono contenuti in un solo pacchetto:

# apt install btrfs-progs

Si consiglia di installare anche un pacchetto per l'automazione della manutenzione dei volumi btrfs, che per la loro complessità sono soggetti nel tempo a degradazione delle prestazioni se non manutenuti:

# apt install btrfsmaintenance

Utilizzo

Warning.png ATTENZIONE
LASCIARE SEMPRE almeno 10GB di spazio libero su ogni volume btrfs per permettere le operazioni di manutenzione.


Per formattare una nuova partizione il comando generale è:

# mkfs.btrfs -L mia_etichetta /dev/sdX1

dove

  • /dev/sdX1 è la partizione da formattare;
  • -L è l'opzione che permette di assegnare l'etichetta alla partizione da formattare.

Altre opzioni utili sono:

  • -f per forzare il sistema a formattare una partizione che non sia vuota, cioè che abbia già un suo filesystem.
  • -d per specificare il profilo dati da usare. Il valore predefinito è single.
  • -m per specificare il profilo metadati da usare. Il valore predefinito è dup nel caso di disco singolo oppure raid1 nel caso di due o più.

Profili (meta)dati

Per definire se si vuole ridondanza sia di dati che metadati si usano i profili, selezionabili come già scritto sopra con le opzioni rispettivamente -d e -m. La scelta dei profili e il loro significato è il medesimo sia per i dati che per i metadati, ovvero non esistono profili dedicati per i soli dati o metadati.

Bulb.png Suggerimento
Nel caso di disco singolo non c'è alcuna ragione di scegliere un profilo metadati diverso da quello predefinito.


  • single: implica nessuna ridondanza dei (meta)dati e quindi permette di sfruttare il 100% dello spazio disponibile di un volume. Nel caso di più dischi/partizioni lo spazio totale disponibile sarà semplicemente la somma dei dischi/partizioni che lo compongono.
  • dup: da usare nel solo caso di volume composto da disco/partizione singolo, implica appunto la duplicazione dei (meta)dati. Nel caso dei dati lo spazio totale disponibile sarà quindi la metà di quello teorico (la duplicazione dei metadati invece comporta un consumo di spazio molto meno rilevante). Questo profilo protegge contro il degrado del tempo, ma non contro eventuali guasti hardware.
Attention.png Avvertimento
Nel caso di disco singolo se si sceglie profilo single per i dati e dup per i metadati si sarà solo informati di un eventuale danneggiamento dei dati, ma non sarà possibile una riparazione degli stessi. L'unico modo per proteggere i dati in questo caso è scegliere il profilo dup sia per i dati che metadati.
  • raid1: da usare solo nel caso di volume composto da due o più dischi/partizioni. Funziona in modo simile al raid1 di mdadm, ma con due differenze importanti
  • lo spazio totale disponibile è sempre (somma dei dischi/partizioni che compongono il volume)/2, e non (somma dei dischi/partizioni che compongono il volume)/N (con N = n. totale dischi/partizioni);
  • i dischi/partizioni che compongono il volume non devono necessariamente avere la stesse dimensioni, ma la capacità di nessuno di essi può essere superiore alla somma delle capacità di tutti gli altri, ad esempio nel caso di tre dischi sarebbe accettabile avere 4TB, 3TB e 1TB, ma non 6TB e 2x1TB. È comunque consigliato avere dischi/partizioni di pari dimensioni.
Quando il volume è composto da due dischi/partizioni di dimensioni identiche allora si ha in pratica coincidenza con un volume raid 1 classico composto da due dischi.
  • raid1c3, raid1c4: ancora poco testati e quindi sconsigliati, sono inclusi al solo scopo di chiarire meglio le differenze tra il raid di btrfs e quello classico. Entrambi i profili richiedono che il volume sia composto da almeno tre e quattro dischi/partizioni rispettivamente. Il primo crea tre copie dei (meta)dati e il secondo quattro, ergo lo spazio totale disponibile sarà rispettivamente 1/3 ed 1/4 della somma teorica totale. Questi due profili funzionano esattamente come quello di raid1, eccetto appunto il numero di copie, inoltre quando i volumi sono composti rispettivamente da 3 e 4 dischi/partizioni di dimensioni identiche coincidono a livello pratico con un volume raid 1 classico composto dallo stesso numero di dischi.

Spazio libero/occupato

Per sapere quant'è lo spazio libero e/o occupato si consiglia l'uso di

btrfs filesystem usage -T /punto/di/mount/desiderato/

invece del solito df poiché querst'ultimo quando utilizzato su volumi btrfs potrebbe potenzialmente restituire valori significativamente diversi dal vero.
Altri comandi utili in tal senso sono btrfs filesystem show e btrfs device usage.

Manutenzione volumi

Bulb.png Suggerimento
Leggere attentamente sia il manuale di btrfsmaintenance che il documento /usr/share/doc/btrfsmaintenance/README.Debian.


Al momento l'unico script raccomandato è quello per l'esecuzione delle operazioni di scrub, lasciare quindi disattivati gli altri.
La configurazione base di questo strumento considera come volume predefinito da controllare la radice, cioè /, se però questo non è il vostro caso allora è necessario

  • editare il file /etc/default/btrfsmaintenance
  • cercare la riga contenente il parametro BTRFS_SCRUB_MOUNTPOINTS e modificare il valore predefinito col punto di mount del proprio volume (è possibile specificare più percorsi separandoli con il carattere :).

Fatto ciò è necessario attivare due servizi, ovvero btrfsmaintenance-refresh e btrfs-scrub. Se si usa systemd:

# systemctl enable btrfsmaintenance-refresh.service
# systemctl enable btrfs-scrub.timer

Se si preferisse usare CRON fare riferimento al manuale di btrfsmaintenance.

Esempi

Raid1 dati e metadati, sei dischi

Ipotesi

  • si hanno a disposizione sei dischi a due a due di identiche dimensioni e precisamente pari rispettivamente a 3TB, 2TB ed 1,5TB;
  • i dischi siano identificati come /dev/sdU (3TB), /dev/sdV (2TB), /dev/sdW (1,5TB), /dev/sdX (3TB), /dev/sdY (2TB), /dev/sdZ (1,5TB);
  • i dischi non sono nuovi e contengono dati;
  • ciascun disco contiene gli stessi dati dell'altro avente pari dimensioni, ad es. il i due dischi da 3TB contengono ciascuno una copia degli stessi dati;

Obiettivo
Creare un volume btrfs raid1 da 6,5TB di spazio totale composto da tutti e sei i dischi, ma senza dover necessariamente copiare prima i dati già presenti altrove.

Warning.png ATTENZIONE
Si consiglia caldamente di fare una copia di backup dei dati presenti sui dischi che andranno a comporre il volume btrfs prima di iniziare le operazioni.


Passo 1
Selezionare tre dischi tutti di differente capacità e pulirli

Warning.png ATTENZIONE
Quest'operazione implica la cancellazione permanente di tutti i dati dai dischi puliti.


# wipefs -a /dev/sdU /dev/sdV /dev/sdW

Passo 2
Ripartizionare i tre dischi

# parted /dev/sdU mklabel gpt mkpart nome_desiderato1 btrfs 0% 100%
# parted /dev/sdV mklabel gpt mkpart nome_desiderato2 btrfs 0% 100%
# parted /dev/sdW mklabel gpt mkpart nome_desiderato3 btrfs 0% 100%

Passo 3
Formattare i 3 dischi e contestualmente creare il volume btrfs

mkfs.btrfs -f -L nome_etichetta -d single -m raid1 /dev/sdU1 /dev/sdV1 /dev/sdW1

A questo punto digitando il comando # lsblk -f si vedrà che l'UUID di tutte e tre le partizioni è il medesimo.

Passo 4
Montare il volume btrfs appena creato o specificando il primo disco dei tre o l'UUID (visibile tramite lsblk -f per esempio) del volume btrfs:

# mount /dev/sdU1 /punto/di/mount/desiderato/

Passo 5
Copiare tutti i dati dai dischi /dev/sdX /dev/sdY /dev/sdZ sul nuovo volume btrfs.

Attention.png Avvertimento
Se i dati da copiare sono molti, ad esempio qualche TB, l'operazione potrebbe richiedere anche uno o più giorni.


Passo 6
Pulire anche i tre dischi rimanenti.

Warning.png ATTENZIONE
Quest'operazione implica la cancellazione permanente di tutti i dati dai dischi puliti.


# wipefs -a /dev/sdX /dev/sdY /dev/sdZ

Passo 7
Ripartizionare anche i tre dischi rimanenti

# parted /dev/sdX mklabel gpt mkpart nome_desiderato4 btrfs 0% 100%
# parted /dev/sdY mklabel gpt mkpart nome_desiderato5 btrfs 0% 100%
# parted /dev/sdZ mklabel gpt mkpart nome_desiderato6 btrfs 0% 100%

Passo 8
Aggiungere i tre dischi appena puliti al nostro volume btfrs (che DEVE essere montato)

# btrfs device add -f /dev/sdX1 /dev/sdY1 /dev/sdZ1 /punto/di/mount/desiderato/

Passo 9
Convertire i dati del volume btrfs da single a raid1.

Attention.png Avvertimento
Se i dati da copiare sono molti, ad esempio qualche TB, l'operazione potrebbe richiedere anche uno o più giorni.
# btrfs balance start -v -dconvert=raid1 /punto/di/mount/desiderato/

Qualora inizialmente non si fosse scelto il profilo raid1 per i metadati sarebbe possibile convertire al volo anche gli stessi semplicemente aggiungendo l'opzione -mconvert=raid1 al precedente comando.

Passo 10
Al termine dell'operazione di bilanciamento verrà stampato a video

Done, had to relocate ABC out of DEF chunks

e il prompt del terminale sarà di nuovo usabile.
Il volume è ora pronto e il suo stato può essere indagato con tre comandi di cui il primo è:

# btrfs filesystem show /punto/di/mount/desiderato/

che restituirà una sintesi simile a

Label: 'nome_etichetta'  uuid: ABCDEFGH-...
	Total devices 6 FS bytes used 4.05TiB
	devid    1 size 1.82TiB used 1.23TiB path /dev/sdV1
	devid    2 size 2.73TiB used 1.96TiB path /dev/sdU1
	devid    3 size 1.36TiB used 793.01GiB path /dev/sdW1
	devid    4 size 1.82TiB used 1.23TiB path /dev/sdY1
	devid    5 size 2.73TiB used 2.14TiB path /dev/sdX1
	devid    6 size 1.36TiB used 793.00GiB path /dev/sdZ1

Il secondo comando è invece

# btrfs filesystem usage -T /punto/di/mount/desiderato/

e stamperà a video qualcosa di simile a:

Overall:
    Device size:               11.83TiB
    Device allocated:          8.10TiB
    Device unallocated:        3.72TiB
    Device missing:            0.00B
    Device slack:              0.00B
    Used:                      8.09TiB
    Free (estimated):          1.87TiB      (min: 1.87TiB)
    Free (statfs, df):         1.77TiB
    Data ratio:                2.00
    Metadata ratio:            2.00
    Global reserve:            512.00MiB    (used: 0.00B)
    Multiple profiles:         no

             Data      Metadata System                              
Id Path      RAID1     RAID1    RAID1     Unallocated Total    Slack
-- --------- --------- -------- --------- ----------- -------- -----
 1 /dev/sdV1   1.22TiB    5.00GiB         -   605.02GiB  1.82TiB   -
 2 /dev/sdU1   1.95TiB    6.00GiB   8.00MiB   790.51GiB  2.73TiB   -
 3 /dev/sdW1   792.00GiB  1.00GiB   8.00MiB   604.26GiB  1.36TiB   -
 4 /dev/sdY1   1.23TiB          -         -   605.02GiB  1.82TiB   -
 5 /dev/sdX1   2.14TiB          -         -   604.52GiB  2.73TiB   -
 6 /dev/sdZ1   793.00GiB        -         -   604.26GiB  1.36TiB   -
-- --------- --------- -------- --------- ----------- -------- -----
   Total       4.04TiB  6.00GiB   8.00MiB     3.72TiB 11.83TiB 0.00B
   Used        4.04TiB  4.36GiB 608.00KiB

Infine il terzo è

# btrfs device usage /punto/di/mount/desiderato/

che resituirà qualcosa di simile a:

/dev/sdV1, ID: 1
   Device size:             1.82TiB
   Device slack:              0.00B
   Data,RAID1:              1.22TiB
   Metadata,RAID1:          5.00GiB
   Unallocated:           605.02GiB

/dev/sdU1, ID: 2
   Device size:             2.73TiB
   Device slack:              0.00B
   Data,RAID1:              1.95TiB
   Metadata,RAID1:          6.00GiB
   System,RAID1:            8.00MiB
   Unallocated:           790.51GiB

/dev/sdW1, ID: 3
   Device size:             1.36TiB
   Device slack:              0.00B
   Data,RAID1:            792.00GiB
   Metadata,RAID1:          1.00GiB
   System,RAID1:            8.00MiB
   Unallocated:           604.26GiB

/dev/sdY1, ID: 4
   Device size:             1.82TiB
   Device slack:              0.00B
   Data,RAID1:              1.23TiB
   Unallocated:           605.02GiB

/dev/sdX1, ID: 5
   Device size:             2.73TiB
   Device slack:              0.00B
   Data,RAID1:              2.14TiB
   Unallocated:           604.52GiB

/dev/sdZ1, ID: 6
   Device size:             1.36TiB
   Device slack:              0.00B
   Data,RAID1:            793.00GiB
   Unallocated:           604.26GiB

Passo 11
Editare il file /etc/default/btrfsmaintenance sostituendo al valore predefinito di BTRFS_SCRUB_MOUNTPOINTS quello scelto (/punto/di/mount/desiderato/ in questo esempio) e infine attivare i servizi btrfsmaintenance-refresh.service e btrfs-scrub.timer come descritto nell'apposita sezione di questa guida.

Approfondimenti

Manpages

  • man btrfs, HTML
  • man mkfs.btrfs, HTML
  • man btrfsmaintenance, HTML

Sitografia




Guida scritta da: Wtf (discussioni) 17:58, 25 dic 2024 (UTC) Swirl-auth20.png Debianized 20%
Estesa da:
Verificata da:

Verificare ed estendere la guida | Cos'è una guida Debianized