Indice
- Introduzione
- Installare Ubuntu con filesystem Btrfs
- Presentazione subvolume
- Gestione subvolume
- Compressione
- Opzioni di montaggio
- Riparare il filesystem
- Strumento Scrub
- Strumento Balance
- Manutenzione
- Btrfs send receive
- Ottimizzazione subvolume su Ubuntu
- Comandi principali di Btrfs
- FAQ
- Ulteriori risorse
Guida verificata con Ubuntu: 20.04
Problemi in questa pagina? Segnalali in questa discussione
Introduzione
Btrfs è un moderno filesystem copy on write (CoW) per Linux che mira a implementare funzionalità avanzate con particolare attenzione sulla tolleranza agli errori, sulla riparazione e sulla facile amministrazione.
Sviluppato congiuntamente da più società, Btrfs è concesso in licenza ai sensi della licenza GPL e aperto al contributo di chiunque.
- Snapshot: Offre la possibilità di creare istantanee per ogni subvolume, inizialmente non occupando spazio, con strumenti già esistenti come Timeshift e un facile ripristino del il sistema in caso di problemi.
Compressione: Possibilità di abilitare la compressione trasparente zlib|lzo|zstd utile al risparmio di spazio a incrementare la durata dell'hardware, in alcuni casi a migliorare le prestazioni.
- Checksumming su dati e metadati: garantisce l'integrità dei dati e verificato ad ogni lettura, possibilità di avviare un scrub per un ulteriore verifica.
- Gestione multi disco: Possibilità di aumentare lo spazio a disposizione aggiungendo un disco al filesystem, convertire a sistema montato da single a raid1 etc...
Per approfondire l'argomento leggere la relativa guida (in inglese).
Installare Ubuntu con filesystem Btrfs
Installare Ubuntu scegliendo come tipo di partizionamento btrfs al posto di ext4.
Consigli post installazione
Per ottimizzare la gestione degli snapshot e le prestazioni, leggere questo capitolo.
Se la partizione swap è assente, per abilitare lo swapfile in Btrfs leggere la seguente guida.
Presentazione subvolume
I Subvolumi si comportano come le directory in termini di navigazione sia la GUI e CLI, ad esempio cp, mv, du, proprietario / i permessi. Condividono anche lo spazio, proprio come una directory. Ma è una risposta incompleta. Un subvolume è un albero di file indipendente, con il proprio spazio dei nomi POSIX e ha il proprio pool di inode. Ciò significa che i numeri di inode si ripetono su un volume Btrfs. Gli Inode sono unici solo all'interno di un dato subvolume. Un subvolume ha il proprio st_dev, quindi se usi stat FILE riporta un valore di dispositivo che fa riferimento al subvolume in cui si trova il file. E significa anche che non è possibile creare collegamenti fisici tra subvolumi. Da questa prospettiva, i subvolumi iniziano ad apparire più come un filesystem separato. Ma i subvolumi condividono la maggior parte degli altri alberi, quindi non sono filesystem veramente indipendenti. Inoltre non sono dispositivi a blocchi. Fonte
Il Btrfs ha una radice montabile indipendente per il volume @ (subvolume di livello superiore) e una per ciascun subvolume @<nomesubvolume>; un volume Btrfs può contenere da un singolo albero dei file a una foresta di alberi dei file.
Per approfondire l'argomento leggere la relativa guida (in inglese)
L'installer di Ubuntu di default crea due subvolumi:
@: È la radice di Ubuntu /@/file di sistema, che contiene tutte le directory e i file di sistema.
@home: È la home degli utente /@home/utenti.
Per creare ed eliminare i subvolumi flat sul toplevel, il filesystem radice /dev/sdxy deve essere montato su /mnt. In /dev/sdxy le lettere xy rappresentano la lettera e il numero della partizione radice dove è installato Ubuntu.
Il nome del subvolume @<nomesubvolume> può essere scelto a piacere, il consiglio è di nominarlo in modo da richiamarne la cartella.
Esempio: per la cartella /var/log è buona norma dare il nome @varlog; la @ iniziale per lo standard di Ubuntu indica che è un subvolume Btrfs, varlog richiama il nome della cartella /var/log.
Gestione subvolume
Subvolume flat
Il subvolume flat è un subvolume secondario del subvolume di livello superiore, top level (ID 5).
Per creare e/o eliminare un subvolume flat, la radice dell'albero dei file deve essere montata in modo che i subvolumi siano visibili. È consigliato creare un subvolume flat su cartelle fisse di sistema.
Ad esempio:/var/cache. Per montare un subvolume flat deve essere specificato nelle opzioni di fstab.
Montare la radice su /mnt:
sudo mount -t btrfs -o noatime,compress=zstd,autodefrag /dev/sdxy /mnt
Creare un subvolume:
sudo btrfs subvolume create /mnt/@<nomesubvolume>
Lista subvolumi:
sudo btrfs subvolume list /mnt
Eliminare un subvolume:
sudo btrfs subvolume delete /mnt/@<nomesubvolume>
Mount di un subvolume:
sudo mount -t btrfs -o subvol=@<nomesubvolume> /dev/sdYN /mnt
Subvolume nested
Il subvolume nested è un subvolume dentro un altro subvolume di qualsiasi livello.
Per creare e/o eliminare un subvolume nested, basta specificare il percorso sul filesystem. È consigliato creare un subvolume nested su cartelle che potrebbero essere rimosse.
Ad esempio: /var/lib/@flatpak. Un subvolume nested può essere rimosso come una semplice cartella.
Non dobbiamo specificare nessuna opzione di montaggio in /etc/fstab poiché si montano in automatico.
Un subvolume nested viene escluso dagli snapshot del subvolume superiore, gli snapshot non sono ricorsivi su altri subvolumi.
Creare un subvolume:
sudo btrfs subvolume create /percorso/nomesubvolume
Creare un subvolume sulla home dell'utente:
sudo btrfs subvolume create /home/nomeutente/nomesubvolume
Lista subvolumi:
sudo btrfs subvolume list /
Eliminare un subvolume:
sudo btrfs subvolume delete /percorso/nomesubvolume
Compressione
Btrfs supporta la compressione trasparente e automatica riducendo la dimensione dei file e migliorando le prestazioni.
In alcuni casi d'uso specifici, ad esempio thread singolo con I/O di file pesanti, in altri casi riducendo le prestazioni, ad esempio attività multithread e/o cpu con grandi attività file I/O.
Le prestazioni migliori si ottengono generalmente con gli algoritmi di compressione zstd e lzo .
Utile ad aumentare la durata dei dischi SSD/NVME, poiché riduce il numero di operazioni di lettura e scrittura.
Ad esempio è il caso di Facebook, che usa Btrfs, in cui hanno riscontrato un aumento della durata degli SSD con Btrfs + compress.
Per approfondire l'argomento leggere la relativa guida (in inglese)
Supporto compressione
lzo non supporta nessun livello di compressione su btrfs.
zlib supporta i livelli di compressione da 1 a 9, predefinito è 3.
zstd supporta i livelli di compressione da 1 a 15 come da seguente tabella, predefinito è 3.
Livelli di compressione per zstd |
|||
Livello |
Rapporto |
Compressione (MB/s) |
Decompressione (MB/s) |
1 |
2.658 |
438.47 |
910.51 |
2 |
2.744 |
364.86 |
886.55 |
3 |
2.801 |
336.33 |
828.41 |
4 |
2.858 |
286.71 |
886.55 |
5 |
2.916 |
212.77 |
556.84 |
6 |
2.363 |
119.82 |
990.85 |
7 |
3.000 |
154.06 |
849.30 |
8 |
3.011 |
159.54 |
875.03 |
9 |
3.025 |
100.51 |
940.15 |
10 |
3.033 |
118.97 |
616.26 |
11 |
3.036 |
94.19 |
802.11 |
12 |
3.037 |
73.45 |
931.49 |
13 |
3.041 |
55.17 |
835.26 |
14 |
3.087 |
44.70 |
716.78 |
15 |
3.126 |
37.30 |
878.84 |
Dati estrapolati da questa fonte.
Per usare la compressione zstd sulla radice di Ubuntu /@ il requisito minmo è d'usare Ubuntu 19.10 o superiore con la versione di GRUB 2.04, dove è stato implementato il supporto a zstd.
Ad oggi non è possibile impostare i livelli di compressione con il comando in spazio utente btrfs filesystem defragment -r -v -czstd, ma ci sono degli sviluppi in corso, e dovrebbe essere resi disponibili in una nuova versione di btrfs-progs.
La compressione lzo comprime meno rispetto a zstd con prestazioni vicini a zstd livello 1.
Benchmark orientativo delle differenze di compressione tra lzo, zstd e zlib.
Esempi di compressione
Comprimere un subvolume con zstd:
sudo btrfs filesystem defragment -r -v -czstd /mnt/@subvolume
Comprimere un file o cartella con zstd:
sudo btrfs filesystem defragment -r -v -czstd /percorso
Aprire coi privilegi di amministrazione e con un editor di testo il file /etc/fstab e scriverci le opzioni di montaggio con zstd livello 1:
UUID=UUID / btrfs noatime,compress=zstd:1,autodefrag,subvol=@
La compressione di livello 1 zstd:1 potrebbe essere utile in tutti quei casi dove si ha una CPU moderna o un disco rigido a stato solido di tipo SSD/NVME.
La compressione zstd a livelli più alti può aiutare in tutti quei casi in cui si hanno dei dati di backup grandi da gestire, a discapito delle prestazioni in base al livello usato, ma a favore del risparmio di spazio.
Opzioni di montaggio
L'opzione di montaggio consigliata per un uso desktop generico da scrivere inel file /etc/fstab è noatime,compress=zstd:1,autodefrag.
Per tutte le altre opzioni di montaggio e maggiori dettagli leggere il wiki di Btrfs MOUNT_OPTIONS
Riparare il filesystem
In caso di problemi col filesystem, evitare di dare comandi a caso ma seguire attentamente le istruzioni dalla wiki di openSUSE qui.
SUSE è il maggior contributore al progetto Btrfs.
Strumento Scrub
Scrub è lo strumento per verificare il checksum dei dati e metadati e cerca di ripararli automaticamente se c'è una ridondanza (raid 1, dup etc...).
È consigliato un controllo periodico, sul come farlo leggere la sezione Manutenzione.
Per approfondire l'argomento leggere la relativa guida (in inglese)
Strumento Balance
Balance è lo strumento che serve a liberare spazio sul filesystem in presenza di carichi di lavoro pesanti.
Generalmente per un uso desktop con disco singolo non c'è bisogno di fare un bilanciamento periodico.
Utile invece in caso di cambio disco o livello raid per distribuire i gruppi di blocchi su tutti i dispositivi, in modo che corrispondano ai vincoli definiti dai rispettivi profili.
Per approfondire l'argomento leggere la relativa guida (in inglese)
Manutenzione
Per eseguire la manutenzione periodica di balance e scrub installare il pacchetto btrfsmaintenance.
Non abilitare trim poiché viene abilitato in automatico su Ubuntu tramite service systemd quando rileva un disco SSD/NVME, è neppure defrag poiché rompe il collegamento con gli snapshot occupando tutto lo spazio sul disco, è un buon compromesso l'opzione di montaggio autodefrag.
autodefrag abilita la deframmentazione automatica dei file. Se abilitato, piccole scritture casuali in file, in un intervallo di alcune decine di kilobyte attualmente predefiniti a 64 KB, vengono rilevate e messe in coda per il processo di deframmentazione. Non adatto per carichi di lavoro di database di grandi dimensioni.
Non abilitare la manutenzione se non si ha un carico di lavoro pesante, o si usa un disco singolo (no raid), principalmente questo è pensato per server dove si ha un carico di lavoro pesante. Per uso desktop il consiglio è di non abilitarlo.
Abilitare il timer per aggiornare la configurazione all'avvio del sistema (consigliato):
sudo systemctl enable btrfsmaintenance-refresh.service
Abilitare il timer per balance, di default impostato settimanalmente:
sudo systemctl enable btrfs-balance.timer
Abilitare il timer per scrub, di default impostato mensilmente:
sudo systemctl enable btrfs-scrub.timer
Per modificare la configurazione aprire coi privilegi di amministrazione e con un editor di testo il file /etc/default/btrfsmaintenance.
Durante l'esecuzione di balance potreste notare un rallentamento per il carico IO generato dal bilanciamento.
Pagina ufficiale del progetto btrfsmaintenance.
Btrfs send receive
Btrfs ha alcune funzionalità chiave che consentono soluzioni di backup efficienti.
Atomic COW Snapshots, poiché gli snapshot sono atomici, quando viene ripristinato uno snapshot, questo appare alle applicazioni come se si fosse verificata una perdita di potenza mentre il filesystem è tornato a uno stato precedente. Pertanto è possibile eseguire il backup dei database senza arrestarli in anticipo.
Trasferimento incrementale dello snapshot, determinazione dei flussi più efficienti delle differenze tra due snapshot, se sono snapshot dello stesso subvolume o hanno una relazione genitore-figlio. Questo è molto più veloce di quanto potrebbe fare rsync, specialmente su file system di grandi dimensioni.
Per approfondire l'argomento leggere la relativa guida (in inglese)
Ottimizzazione subvolume su Ubuntu
Creare vari subvolumi può portare ad alcuni vantaggi.
Possibilità di escluderli dagli snapshot. Ad esempio sulla cartella di sistema /var/cache del subvolume @, ovvero /@/var/cache, si crea un subvolume della cartella /var/cache, questa cartella viene escluda dagli snapshot del subvolume di sistema @ quando usiamo strumenti come timeshift
Possibilità di disabilitare COW, per impostare un diverso algoritmo di compressione o disabilitare la compressione.
Inviare l'intero subvolume su un disco esterno o di rete per un backup con Btrfs send, l'unico requisito per usarlo è che la destinazione sia in Btrfs.
Subvolume cartella /tmp
Montare la radice su /mnt(La cartella montata è di esempio, si può scegliere o creare altre cartelle per il montaggio):
sudo mount -t btrfs -o --options-source /dev/sdYN /mnt
Creare il subvolume della cartella:
sudo btrfs subvolume create /mnt/@tmp
Impostare i permessi della cartella tramite ilbit sticky):
sudo chmod 777 /mnt/@tmp
Disattivare il COW della cartella:
sudo chattr +C /mnt/@tmp
Copiare il contenuto della cartella nel subvolume:
sudo cp -a /mnt/@/tmp/* /mnt/@tmp/
Aprire coi privilegi di amministrazione e con un editor di testo il file /etc/fstab e scriverci le opzioni di montaggio:
UUID=UUID /tmp btrfs noatime,autodefrag,subvol=@tmp
Fare clic su Ctrl+S per salvare e su Ctrl+Q per chiudere l'editor.
Smontare il filesystem:
sudo umount /mnt
Subvolume cartella /var/tmp
Montare la radice su /mnt (La cartella montata è di esempio, si può scegliere o creare altre cartelle per il montaggio):
sudo mount -t btrfs -o --options-source /dev/sdYN /mnt
Creare subvolume della cartella:
sudo btrfs subvolume create /mnt/@vartmp
Impostare i permessi della cartella tramite ilbit sticky):
sudo chmod 777 /mnt/@vartmp
Disattivare il COW della cartella:
sudo chattr +C /mnt/@vartmp
Copiare il contenuto della cartella nel subvolume:
sudo cp -a /mnt/@/var/tmp/* /mnt/@vartmp/
Aprire coi privilegi di amministrazione e con un editor di testo il file /etc/fstab e scriverci le opzioni di montaggio:
UUID=UUID /var/tmp btrfs noatime,autodefrag,subvol=@vartmp
Fare clic su Ctrl+S per salvare e su Ctrl+Q per chiudere l'editor.
Smontare il filesystem:
sudo umount /mnt
Subvolume cartella /var/cache
Montare la radice su /mnt (La cartella montata è di esempio, si può scegliere o creare altre cartelle per il montaggio):
sudo mount -t btrfs -o --options-source /dev/sdYN /mnt
Creare subvolume della cartella:
sudo btrfs subvolume create /mnt/@varcache
Impostare i permessi della cartella tramite ilbit sticky):
sudo chmod 777 /mnt/@varcache
Disattivare il COW della cartella:
sudo chattr +C /mnt/@varcache
Copia il contenuto della cartella nel subvolume:
sudo cp -a /mnt/@/var/cache/* /mnt/@varcache/
Aprire coi privilegi di amministrazione e con un editor di testo il file /etc/fstab e scriverci le opzioni di montaggio:{{{:
UUID=UUID /var/cache '''Btrfs''' noatime,autodefrag,subvol=@varcache
Fare clic su Ctrl+S per salvare e su Ctrl+Q per chiudere l'editor.
Smontare il filesystem:
sudo umount /mnt
Subvolume cartella /var/log
Montare la radice su /mnt (La cartella montata è di esempio, si può scegliere o creare altre cartelle per il montaggio):
sudo mount -t btrfs -o --options-source /dev/sdYN /mnt
Creare subvolume della cartella:
sudo btrfs subvolume create /mnt/@varlog
Impostare i permessi della cartella tramite ilbit sticky):
sudo chmod 777 /mnt/@varlog
Disattivare il COW:
sudo chattr +C /mnt/@varlog
Copiare il contenuto della cartella nel subvolume:
sudo cp -a /mnt/@/var/log/* /mnt/@varlog/
Aprire con i privilegi di amministrazione e con un editor di testo il file /etc/fstab e scriverci le opzioni di montaggio:
UUID=UUID /var/log btrfs noatime,autodefrag,subvol=@varlog
Fare clic su Ctrl+S per salvare e su Ctrl+Q per chiudere l'editor.
Smontare il filesystem:
sudo umount /mnt
Subvolume flatpak
È utile in caso di ripristino di sistema da uno snapshot, poiché le applicazioni flatpak non vengono ripristinate.
Con flatpak già installato seguire i seguenti passaggi.
Chiudere tutte le applicazioni flatpak eventualmente avviate.
Creare la cartella temporanea:
sudo mkdir /flatpaktmp
Copiare il contenuto della cartella:
sudo cp -a /var/lib/flatpak/* /flatpaktmp/
Eliminare la cartella `/flatpak/ per creare il subvolume:
sudo rm -r /var/lib/flatpak
Creare subvolume della cartella:
sudo btrfs subvolume create /var/lib/flatpak
Ripristinare il contenuto della cartella /flatpak:
sudo cp -a /flatpaktmp/* /var/lib/flatpak/
Se flatpak non è già installato, prima d'installarlo creare il subvolume /@var/lib/flatpak e successivamente installare flatpak.
Subvolume immagini di VirtManager
Col VirtManager già installato seguire i seguenti passaggi.
Creare la cartella temporanea:
sudo mkdir /virttmp
Copiare il contenuto della cartella:
sudo cp -a /var/lib/flibvirt/images/* /virttmp/
Eliminare la cartella /images per creare il subvolume:
sudo rm -r /var/lib/libvirt/images
Creare subvolume della cartella:
sudo btrfs subvolume create /var/lib/libvirt/images
Ripristinare il contenuto della cartella /images:
sudo cp -a /virttmp/* /var/lib/libvirt/images/
Se VirtManager non è già installato, prima d'installarlo creare il subvolume /var/lib/libvirt/@images e successivamente installare VirtManager.
Subvolume immagini di GNOME-Boxes
Se usa la versione di flatpak che si trova sullo store flathub, il percorso alle immagini VM è /.var/app/org.gnome.Boxes/data/gnome-boxes/images.
Con GNOME-Boxes già installato seguire i seguenti passaggi.
Creare la cartella temporanea:
sudo mkdir /home/utente/boxtmp
Copiare il contenuto della cartella:
sudo cp -a /home/username/.local/share/gnome-boxes/images/* /home/username/boxtmp/
Elimina la cartella /images per creare il subvolume:
sudo rm -r /home/username/.local/share/gnome-boxes/images
Creare subvolume della cartella:
sudo btrfs subvolume create /home/username/.local/share/gnome-boxes/images
Ripristinare il contenuto della cartella /images:
sudo cp -a /home/username/boxtmp/* /home/username/.local/share/gnome-boxes/images/
Se GNOME-Boxes non è già installato, prima d'installarlo creare il subvolume /home/username/.local/share/gnome-boxes/@images e successivamente installare GNOME-Boxes.
Comandi principali di Btrfs
Leggere e stampare le statistiche di errore IO del dispositivo:
sudo btrfs device stats /
Mostrare informazioni dettagliate sulle allocazioni interne nei dispositivi:
sudo btrfs device usage /
Mostrare informazioni dettagliate sull'uso del filesystem interno:
sudo btrfs filesystem usage /
FAQ
Alcune della domande e risposte più comuni su Btrfs.
- D. Come funziona la compressione file incomprimibili?
S. Esiste una semplice logica decisionale: se la prima porzione di dati da comprimere non è più piccola dell'originale, la compressione del file è disabilitata, a meno che non ci sia l'opzione di montaggio compress-force=algoritmo.
In tal caso, la compressione viene sempre tentata sul file, per poi essere successivamente scartata, con maggior cicli di lavoro per la CPU. Questo non è ottimale e soggetto a ottimizzazioni e ulteriori sviluppi.
- D. Cosa succede se abilito la compressione a dei file già scritti?
S. Solo i file creati, modificati e montati con l'opzione compress=algoritmo verranno compressi. Per applicare la compressione ai file esistenti usare il comando:
btrfs filesystem defragment -c <algoritmo>
D. Posso impostare la compressione di un file, cartella o subvolume senza usare l'opzione di montaggio?S. Sì, l'utilità chattr supporta l'impostazione dell'attributo del file c, che contrassegna l'inode per comprimere i nuovi dati scritti. Per impostare la proprietà di compressione di un file usare il comando:
btrfs property set <file> compression <zlib|lzo|zstd>
Ciò forza la compressione da usare su quel file, cartella o subvolume usando l'algoritmo specificato.
- D. Come posso disattivare la compressione ?
S. Per disattivare la compressione usare il comando:
btrfs property set <file> compression none
Notare che la disattivazione comporta un notevole aumento di uso dello spazio sul disco.
Ulteriori risorse