This is Gentoo's testing wiki. It is a non-operational environment and its textual content is outdated.
Please visit our production wiki at https://wiki.gentoo.org
Btrfs
Btrfs è un filesystem CoW (copy-on-write, copia-in-scrittura) adatto a Linux che mira ad implementare funzionalità avanzate, concentrandosi sulla tolleranza agli errori, la riparazione e la facilità di amministrazione. Sviluppato congiuntamente con Oracle, Red Hat, Fujitsu, Intel, SUSE, STRATO, e molti altri, Btrfs è rilasciato sotto licenza GPL ed è aperto ai contributi di chiunque.
Caratteristiche
Ext4 è sicuro e stabile e può gestire filesystem di grandi dimensioni con estensioni, quindi perché cambiare? Mentre è vero che Btrfs è ancora considerato sperimentale e sta crescendo in stabilità, il momento in cui diventerà il filesystem di default per i sistemi Linux si sta avvicinando. Qualche distribuzione Linux ha già iniziato il passaggio ad esso già sui rilasci correnti. Btrfs ha molte caratteristiche avanzate in comune con ZFS, il che rende il file system ZFS popolare con le distribuzioni BSD e i dispositivi NAS.
- Copy on Write (CoW) e snapshotting - Rende i backup incrementali indolori anche da un filesystem "hot" o da una macchina virtuale (VM).
- File level checksums - Metadata per ogni file include un checksum che è utilizzato per rilevare e correggere gli errori.
- Compression - I files possono essere compressi e decompressi immediatamente, e così vengono migliorate le performance in velocità di lettura.
- Auto deframmentazione - I filesystems sono sintonizzati da un thread di fondo mentre sono in uso.
- Sottovolumi - I filesystems possono condividere un singola parte di spazio del disco invece di essere ripartiti in partizioni.
- RAID - Btrfs esegue la propria implementazione RAID così che non sono necessari né LVM né mdadm per avere il RADI. Ad oggi sono supportati RAID 0 e 1; RAID 5 e 6 sono in fase di sviluppo.
- Le partitioni sono optional - Mentre Btrfs può lavorare con le partizioni, esso ha ANCHE il potenziale di poter utilizzare i dispositivi (/dev/<device>) direttamente.
- Deduplicazione dei dati - C'è un supporto limitato alla deduplicazione dei dati; tuttavia, la deduplicazione diventerà una caratteristica standard di Btrfs. Questa abilita Btrfs a salvare spazio confrontando i file tramite diffrazioni binarie.
Consultare la pagina di stato della wiki per la lista aggiornata e in qualche modo esaustiva delle caratteristiche. Tuttavia, non tutte le funzionalità sono abbastanza mature da poter essere utilizzate in molti usi.
I nuovi filesystem raggruppati sfrutteranno facilmente i vantaggi di Btrfs con il suo copy-on-write e le sue altre caratteristiche avanzate. Ceph è un esempio di filesystem raggruppato che sembra essere promettente, e può trarre vantaggio da Btrfs.
Installazione
Kernel
Attivare le seguenti opzioni del kernel per abilitare il supporto Btrfs:
File systems ---> <*> Btrfs filesystem
Emerge
Il pacchetto sys-fs/btrfs-progs contiene le utilità necessarie per lavorare con il filesystem Btrfs.
root #
emerge --ask sys-fs/btrfs-progs
Utilizzo
Digitare lunghi comandi Btrfs può diventare rapidamente un problema. Ogni comando (oltre al comando iniziale btrfs) può essere ridotto ad una breve serie di istruzioni. Questo metodo è utile quando si lavora da linea di comando per ridurre il numero di caratteri digitati.
Per esempio, per deframmentare un filesystem situato su /, di seguito viene mostrato un comando integrale:
root #
btrfs filesystem defragment -v /
Abbreviare ciascuno dei comandi dopo btrfs riducendoli al loro prefisso unico e più breve. In tale contesto, unico significa che nessun altro comando btrfs corrisponderà a quel comando più breve. La versione breve del comando di cui sopra, quindi, è:
root #
btrfs fi de -v /
Nessun altro comando btrfs inizia con fi
; filesystem
è il solo. La stessa cosa vale per il sotto-comando de
, sotto il comando filesystem
.
Creazione
Il comando mkfs.btrfs distrugge irreversibilmente ogni contenuto della partizione che gli è stato detto di formattare. Assicurarsi di selezionare il disco e la partizione corretti "prima" di eseguire qualsiasi comando mkfs!
Per creare un filesystem Btrfs nella partizione /dev/sdXN:
root #
mkfs.btrfs /dev/sdXN
Nell'esempio sopra, sostituire N
con il numero di partizione e X
con la lettera corrispondente al disco che deve essere formattato. Per esempio, per formattare la terza partizione nel primo disco del sistema con Btrfs, eseguire:
root #
mkfs.btrfs /dev/sda3
L'ultima colonna di numeri in /etc/fstab dovrebbe essere
0
per tutte le partizioni Btrfs. fsck.btrfs e btrfsck non dovrebbero essere eseguiti durante ogni avvio del sistema.Montare i filesystems
Dopo la loro creazione, i filesystems possono essere montati in vari modi:
- mount - Montare manualmente.
- fstab - Definire il mount points in /etc/fstab abilitando il montaggio automatico all'avvio del sistema.
- Removable media - Montaggio automatico a richiesta (utile per i drives USB).
- AutoFS - Montaggio automatico all'accesso del filesystem.
Conversione dei filesystems ext*
E' possibile convertire i filesystems ext2, ext3 e ext4 a Btrfs utilizzando l'utilità btrfs-convert.
Le seguenti istruzioni supportano solamente la conversione di filesystems che non sono montati. Per convertire la partizione di root, avviare con il disco di recupero del sistema (SystemRescueCD è ottimo) ed eseguire i comandi di conversione sulla partizione di root.
Per prima cosa assicurarsi che il mount point sia smontato:
root #
umount <mounted_device>
Verificare l'integrità del filesystem non-root utilizzando il comando fsck appropriato. Nell'esempio seguente, il filesystem è ext4:
root #
fsck.ext4 -f <unmounted_device>
Utilizzare btrfs-convert per convertire il dispositivo ext* formattato dentro il dispositivo Btrfs formattato:
root #
btrfs-convert <unmounted_device>
Assicurarsi di modificare il file /etc/fstab dopo che il dispositivo è stato formattato cambiando la colonna relativa al filesystem da ext4 a Btrfs:
/etc/fstab
Modificare da ext4 a btrfs<device> <mountpoint> btrfs defaults 0 0
Deframmentazione
Un'altra caratteristica di Btrfs è la deframmentazione online. Per deframmentare un filesystem di root Btrfs eseguire:
root #
btrfs filesystem defragment -r -v /
La deframmentazione con le versioni del kernel < 3.9 o ≥ 3.14-rc2 così come con le versione stabili del kernel Linux ≥ 3.10.31, ≥ 3.12.12 o ≥ 3.13.4 rovina la ref-links tra i files e le loro copie COW[1] e ciò potrebbe incrementare notevolmente l'utilizzo dello spazio. Assicurarsi di avere abbastanza spazio libero disponibile e non troppe snapshots nel disco per evitare che le partizioni btrfs siano troppo lente.
Compressione
Btrfs supports transparent compression using the zlib, lzo, and zstd[2] compression algorithms.
E' possibile comprimere files specifici utilizzando gli attributi del file:
user $
chattr +c
The compress
mount option sets the default behavior to compress all the newly created files. To re-compress the whole filesystem, run the following command:
root #
btrfs filesystem defragment -r -v -clzo /
In base alle performance della CPU e del disco, utilizzare la compressione lzo potrebbe migliorare l'intero rendimento.
E' possibile utilizzare anche l'algoritmo di compressione zlib al posto di lzo. Zlib è più lento ma ha un rapporto di compressione più alto:
root #
btrfs filesystem defragment -r -v -czlib /
Compression level
Since kernel version 4.15.0[3], zlib compression can now be set by levels 1-9. For example, to set zlib to maximum compression at mount time:
root #
mount -o compress=zlib:9 /dev/sdXY /path/to/btrfs/mountpoint
Or to set minimal compression:
root #
mount -o compress=zlib:1 /dev/sdXY /path/to/btrfs/mountpoint
Or adjust compression by remounting:
root #
mount -o remount,compress=zlib:3 /path/to/btrfs/mountpoint
The compression level should be visible in /proc/mounts or by checking the most recent output of dmesg |grep -i btrfs
.
root #
dmesg |grep -i btrfs
[ 0.495284] Btrfs loaded, crc32c=crc32c-intel [ 3010.727383] BTRFS: device label My Passport devid 1 transid 31 /dev/sdd1 [ 3111.930960] BTRFS info (device sdd1): disk space caching is enabled [ 3111.930973] BTRFS info (device sdd1): has skinny extents [ 9428.918325] BTRFS info (device sdd1): use zlib compression, level 3
Compression ratio and disk usage
The usual userspace tools for determining used and free space like du
and df
may provide inaccurate results on a Btrfs partition due to inherent design differences in the way files are written compared to ,for example, ext2/3/4[4].
It is therefore advised to use the du/df alternatives provided by the btrfs userspace tool btrfs filesystem
. In Addition to that, The compsize
tool found from the sys-fs/compsize package can be helpful in providing additional information regarding compression ratios and the disk usage of compressed files.
The following are example uses of these tools for a btrfs partition mounted under /media/drive.
user $
btrfs filesystem du -s /media/drive
Total Exclusive Set shared Filename 848.12GiB 848.12GiB 0.00B /media/drive/
user $
btrfs filesystem df /media/drive
Data, single: total=846.00GiB, used=845.61GiB System, DUP: total=8.00MiB, used=112.00KiB Metadata, DUP: total=2.00GiB, used=904.30MiB GlobalReserve, single: total=512.00MiB, used=0.00B
user $
compsize /media/drive
Processed 2262 files, 112115 regular extents (112115 refs), 174 inline. Type Perc Disk Usage Uncompressed Referenced TOTAL 99% 845G 848G 848G none 100% 844G 844G 844G zlib 16% 532M 3.2G 3.2G
Multiple devices (RAID)
Btrfs can be used with multiple devices in order to create RAIDs. Using Btrfs to create filesystems that span multiple devices is much easier than creating using mdadm; there is no initialization time needed for creation.
The simplest method is to use the entirety of the unpartitioned block device to create a filesystem that spans multiple devices. For example, to create a filesystem in RAID1 mode across two devices:
root #
mkfs.btrfs -m raid1 <device1> <device2> -d raid1 <device1> <device2>
Converting between RAID modes is possible with the balance sub-command. For example, say a multiple device RAID 1 is mounted at /srv. It is possible to convert this RAID1 to RAID0 with using the following command:
root #
btrfs balance start -dconvert=raid0 -mconvert=raid0 --force /srv
RAID mode conversion can be performed while the filesystem is online and in use. Possible RAID modes in btrfs include RAID0, RAID1, RAID5, RAID6, and RAID10. See the upstream BTRFS wiki for more information.
Attualmente non è sicuro utilizzare le versioni di RAID 5 o 6[5]. Le versioni di RAID 5 e 6 hanno avuto qualche correzione[6] sulla versione di Linux 4.12, ma lo stato complessivo è ancora marcato come instabile.[7][8]. Gli utenti che vogliono utilizzare le funzionalità RAID5 o RAID6 di btrfs possono andare a vedere la pagina dello stato di btrfs per monitorare lo stato di stabilità di dette modalità prima di utilizzarle.
Sottovolumi
Come detto sopra nell'elenco delle funzioni, Btrfs può creare sottovolumi. I sottovolumi possono essere utilizzati per meglio organizzare ed amministrare i dati. Essi diventano potenti specialmente se combinati con gli snapshots. Va fatta una distinzione importante tra i sottovolumi Btrfs e i sottovolumi creati dal Logical Volume Management (LVM). I sottovolumi Btrfs non sono dispositivi a livello di blocco, essi sono spazi di nomi di file POSIX.[9] Essi possono essere creati in qualsiasi posizione del filesystem ed agiranno come qualsiasi altra directory nel sistema con un avvertimento: i sottovolumi possono essere montati e smontati.I sottovolumi sono nidificati (possono essere creati all'interno di altri sottovolumi), e facilmente creati o rimossi.
Un sottovolume non può essere creato attraverso differenti filesystem Btrfs. Se /dev/sda e /dev/sdb entrambi contengono separatamente filesystem (non-RAID) Btrfs, non è possibile che un sottovolume si possa espandere attraverso i due filesystems. Lo snapshot può essere spostato da un filesystem all'altro, ma non può estendersi attraverso i due. Esso deve essere su /dev/sda oppure su /dev/sdb.
Creazione
Per creare un sottovolume, eseguire il seguente comando all'interno di un filesystem's name space Btrfs:
root #
btrfs subvolume create <dest-name>
Rimpiazzare <dest-name>
con la destinazione desiderata e il nome del sottovolume. Per esempio, se un filesystem Btrfs esiste su /mnt/btrfs, un sottovolume può essere creato al suo interno utilizzando il seguente comando:
root #
btrfs subvolume create /mnt/btrfs/subvolume1
Lista
Per vedere i sottovolumi che sono stati creati, utilizzare il comando subvolume list
seguito dalla posizione del filesystem Btrfs. Se la directory corrente è da qualche parte all'interno di un filesystem Btrfs, il seguente comando mostrerà i sottovolumi che esistono nel filesystem:
root #
btrfs subvolume list .
Se un filesystem Btrfs con sottovolumi esiste nel punto di mount creato nel comando dell'esempio precedente, l'output del comando di elenco sarà simile a quanto segue:
root #
btrfs subvolume list /mnt/btrfs
ID 309 gen 102913 top level 5 path mnt/btrfs/subvolume1
Rimozione
I sottovolumi possono essere opportunamente rimossi utilizzando il comando subvolume delete
seguito dal percorso del sottovolume. Tutti i percorsi dei sottovolumi disponibili in un filesystem Btrfs possono essere elencati utilizzando il comando di elencazione di cui sopra.
root #
btrfs subvolume delete <subvolume-path>
Come spiegato sopra, rimpiazzare <subvolume-path>
con il percorso giusto del sottovolume che deve essere rimosso. Per cancellare il sottovolume utilizzato negli esempi precedenti, dovrà essere eseguito il seguente comando:
root #
btrfs subvolume delete /mnt/btrfs/subvolume1
Delete subvolume (no-commit): '/mnt/btrfs/subvolume1'
Istantanee
Le istantanee (Snapshots) sono sottovolumi che condividono dati e metadati con gli altri sottovolumi. Questo è reso possibile dalla capacità Copy on Write (CoW) di Btrfs.[9] Gli Snapshots possono essere utilizzati per svariati scopi, uno dei quali è quello di creare backups di strutture di filesystem a punti specifici nel tempo.
Se il filesystem root è Btrfs, è possibile creare una snapshot utilizzando i comandi subvolume snapshot
:
root #
mkdir -p /mnt/backup/rootfs
root #
btrfs subvolume snapshot / /mnt/backup/rootfs/
Il seguente breve script da shell può essere aggiunto al lavoro sincronizzato di cron per creare un backup di snapshot sincronizzato del filesystem Btrfs di root. Tali backup sincronizzati possono essere regolati in base a quello che preferisce l'utente.
btrfs_snapshot.sh
Esempio di lavoro di cron per snapshot di rootfs di Btrfs#!/bin/bash NOW=$(date +"%Y-%m-%d_%H:%M:%S") if [ ! -e /mnt/backup ]; then mkdir -p /mnt/backup fi cd / /sbin/btrfs subvolume snapshot / "/mnt/backup/backup_${NOW}"
Montaggio
Un sottovolume può essere montato in una posizione diversa da quella in cui è stato creato, oppure gli utenti possono scegliere di non montarlo affatto. Per esempio, l'utente può creare un filesystem Btrfs su /mnt/btrfs e creare i sottovolumi /mnt/btrfs/home e /mnt/btrfs/portage . I sottovolumi potrebbero così essere montati su /home e su /usr/portage, con il livello superiore originale lasciato smontato. Ciò si traduce in una configurazione dove il percorso relativo dei sottovolumi è diverso dal percorso effettivo del sottovolume di livello superiore.
Per montare un sottovolume, eseguire il comando seguente, in cui <rel-path>
è il percorso relativo del sottovolume dal sottovolume di livello superiore, percorso ottenibile attraverso il comando subvolume list
:
root #
mount -o subvol=<rel-path> <device> <mountpoint>
Similmente, si può aggiornare la tabella del filesystem per montare i propri sottovolumi Btrfs facendo così:
/etc/fstab
Montare i Sottovolumi<device> <mountpoint> btrfs subvol=<rel-path> 0 2
Risoluzione dei problemi
Using with VM disk images
When using Btrfs with virtual machine disk images, it is best to disable copy-on-write on the disk images in order to speed up IO performance. This can only be performed on files that are newly created. It also possible to disable CoW on all files created within a certain directory. For example, using the chattr command:
root #
chattr +C /var/lib/libvirt/images
Cancellare lo spazio libero della cache
E' possibile cancellare lo spazio libero della cache di Btrfs montando tale filesystem con l'opzione di mount clear_cache
. Per esempio:
root #
mount -o clear_cache /path/to/device /path/to/mountpoint
Consumo eccessivo di memoria (cache del disco) da parte di Btrfs
Quando si utilizza qualche speciale abilità di Btrfs (ad esempio facendo molte copie --reflink
oppure creando un numero considerevole di snapshot), può essere utilizzata molta memoria che non viene però liberata abbastanza velocemente dalla cache inode del kernel. Questo può non essere scoperto se la memoria dedicata alla cache del disco non è visibile tramite le utilità di monitoraggio tradizionali. Per esempio l'utilità slabtop (disponibile come parte del pacchetto sys-process/procps) è stata creata specificatamente per determinare quanta memoria kernel viene consumata:
root #
slabtop
Se la cache inode sta consumando troppa memoria, il kernel può essere istruito manualmente di far cadere la cache ripetendo un valore intero sul file /proc/sys/vm/drop_caches[10].
Per stare sicuri, e per aiutare il kernel a determinare il valore massimo di memoria utilizzabile, eseguire un sync "prima" dei seguenti comandi echo:
user $
sync
Molte volte gli utenti Btrfs avranno bisogno probabilmente di echo 2 per recuperare solo gli oggetti lastra (dentries e btrfs_inodes):
root #
echo 2 > /proc/sys/vm/drop_caches
Per cancellare interamente la cache del disco (oggetti lastra "e" la pagina cache), invece, utilizzare echo 3:
root #
echo 3 > /proc/sys/vm/drop_caches
Mentre i comandi di cui sopra non sono distruttivi (sempre che un sync sia stato eseguito prima di tali comandi), essi possono seriamente, ma temporaneamente, rallentare il sistema mentre il kernel carica solo gli elementi necessari indietro nella memoria. Pensate due volte prima di eseguire i comandi di cui sopra su sitemi sotto pesanti carichi di lavoro!
Maggiori informazioni sulle lastre del kernel possono essere trovate in questo voce del blog dedoimedo.
Errori di montaggio Btrfs, ritorno di mount: filesystem di tipo 'btrfs' sconosciuto
La soluzione originale di Tim su Stack Exchange ha inspirato la seguente soluzione: costruire il kernel manualmente invece di utilizzare genkernel:
#
cd /usr/src/linux
#
make menuconfig
#
make && make modules_install
#
cp arch/x86_64/boot/bzImage /boot
#
mv /boot/bzImage /boot/whatever_kernel_filename
#
genkernel --install initramfs
Btrfs root non si avvia
L'initramfs Genkernel creata con il comando di cui sotto non carica btrfs:
root #
genkernel --btrfs initramfs
Compilare il supporto per btrfs nel kernel come modulo, oppure utilizzare genkernel-next o Dracut per generare l'initramfs.
Vedere anche
- Btrfs snapshots - Script che crea istantanee (snapshots) quando i files vengono variati
- Btrfs/System Root Guide - Utilizza il filesystem Btrfs come una collezione di sottovolumi includendone uno come system root.
- Btrfs native system root guide - Una guida alternativa per l'utilizzo del sottovolume in un filesystem Btrfs come il system's root.
- ext4 - Il filesystem di default per molte distribuzioni Linux.
- Samba shadow copies - Utilizzare Samba per esporre le Copie Shadow come "Versioni Precedenti" dei clients Windows.
- Snapper - Un programma a riga di comando in grado di gestire le istantanee del filesystem Btrfs.
- ZFS - Un filesystem che ha molto in comune con Btrfs, ma ha problemi di licenza.
Risorse esterne
- https://wiki.debian.org/Btrfs - Guida del wiki Debian.
- https://wiki.archlinux.org/index.php/Btrfs Btrfs article - Guida del wiki Arch Linux.
- http://www.funtoo.org/BTRFS_Fun - BTRFS Fun dal wiki di Funtoo.
- http://marc.merlins.org/perso/btrfs/post_2014-05-04_Fixing-Btrfs-Filesystem-Full-Problems.html - Suggerimenti e trucchi su come risolvere i problemi del filesystem di Btrfs in alcune situazioni.
Riferimenti
- ↑ man page for btrfs-filesystem(8), Btrfs wiki. Retrieved on 6th February, 2017.
- ↑ https://btrfs.wiki.kernel.org/index.php/Compression#Can_I_set_the_compression_level.3F
- ↑ https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=f51d2b59120ff364a5e612a594ed358767e1cd09
- ↑ https://btrfs.wiki.kernel.org/index.php/Compression#How_can_I_determine_compressed_size_of_a_file.3F
- ↑ Article mentioning that parity RAID code has multiple serious data-loss bugs, Btrfs wiki. Retrieved on January 1st, 2017.
- ↑ Michael Larabel, Btrfs RAID56 "Mostly OK", Phoronix. July 8, 2017.
- ↑ btrfs: scrub: Fix RAID56 recovery race condition, source commit, April 18th 2017.
- ↑ GIT PULL Btrfs from Chris Mason, Linux kernel mailinglist, May 9th 2017.
- ↑ Jump up to: 9.0 9.1 Section explaining the differences between subvolumes and logical volumes in LVM, Btrfs wiki.Retrieved on January 1st, 2017.
- ↑ Documentation for /proc/sys/vm/*, Kernel.org. Retrieved on January 1st, 2017.