Ubuntu 15.10 - Installazione in btrfs - un po' di gioco

Da un paio di anni circa sto tenendo d'occhio btrfs senza un particolare obiettivo di produzione, ma semplicemente per familiarizzare coi concetti di base.

Recentemente poi mi sono imbattuto in questo bellissimo pezzo descrittivo di arstechinca che mi ha dato l'input necessario per rifare alcune prove.
http://arstechnica.com/information-technology/2014/01/bitrot-and-atomic-cows-inside-next-gen-filesystems/

Di seguito vado a installare Ubuntu 15.10 su un file system btrfs, creando un po' di subvolume e giocando poi con le quote.

L'installar di Ubuntu non vede i subvolume di btrfs, per cui è inutile preimpostare il file system, sperando poi che installi il sistema operativo e i suoi pacchetti nei giusti subvolume. L'idea migliore che ho trovato è stata quella di far creare a lui un file system btrfs e poi andarci a lavorare.
Questo il partizionamento iniziale che sono andato a fare.

part1

Ci sono 2 dischi, sda da 16GB e sdb da 10GB, entrambi con schema di partizione gpt. Creo boot in ext4 (sda1) , la partizione efi che monta in automatico in /boot/efi (sda3) e lo swap (sda2). Dico di installare il boot loader nella partizione efi (sda3) e poi dal bios efi del computer (vabbè, è una macchina virtuale) farò partire grub.
Il resto dello spazio di sda (sda4) lo dedico a btrfs e gli dico di montarci la root (/). sdb non lo tocco in questa fase.

Al primo avvio della macchina il file system è  fatto così.

 

C'è il top level volume (quello con id=5, io ero rimasto che doveva avere id=0 ma penso sia la stessa cosa) e 2 subvolume, @ e @home.
@ è montato in /
@home è montato in /home

La filosofia mi sembra quindi quella dei "flat subvolume"
https://btrfs.wiki.kernel.org/index.php/SysadminGuide

Riparto dal live cd che mi è servito per fare l'installazione e guardo il file system btrfs "dall'esterno".

Vedrò ovviamente lo stesso file system.

Vado in /mnt e mi creo una directory (container) per montare il top level volume (il file system btrfs contenuto in sda4) e tutti i subvolume che contiene.

vedo @ e @home che sono i 2 subvolume del container (che ha id 5).

Creo con gparted una partizione vuota in sdb (sdb1) e la aggiungo al file system btrfs già presente in sda4.

(-f va a forzare la creazione di un file system btrfs in /dev/sdb1: nel caso ci fosse già un altro file system lo sovrascriverebbe).

Vado ora a bilanciare il file system volendo un raid1 per i metadati e nessun raid per i dati (single mode, che è poi quello di default).

Ora verifico che, montando sdb1, io veda la stessa cosa che vedevo montando sda4 (visto che sono lo stesso file system btrfs)

e così è.

Vado a creare altri subvolume del top level.

Eccoli

Sposto il contenuto di var (nel mio caso /mnt/contaier/@/var) nel subvolume @var (id=266). Stessa cosa con opt

Ora devo modificare l'fstab del sistema installato in modo che monti i subvolume appena creati nei giusti punti di montaggio.

Queste le righe aggiunte in fstab

L'UUID è sempre lo stesso, ed è lo stesso anche per sda4 e sdb1, visto che contengono lo stesso file system btrfs. Ciò che cambia è il subvolume che vado a montare nei vari punti.

Riparto ora con Ubuntu installato e vado a vedere gli effetti di quanto modificato dalla live.

Per capire l'output dei vari comandi che vanno a guardare lo spazio libero e occupato bisogna un po' studiarsi queste faq https://btrfs.wiki.kernel.org/index.php/FAQ

Ora voglio andare a creare delle quote sui vari subvolume in modo che non si intralcino troppo a vicenda.

Abilito le quote per tutti i subvolume del file system btrfs e vado a definirle nei subvolume presenti.

(se le abilito per il subvolume /, vengono abilitate per tutti, visto che enable si applica all'intero file system).

Vado a guardare i consumi attuali.

Mi sposto in /repo e creo un file da 1.5GB.

"df" e "btrfs fi df" mostreranno che lo spazio disponibile sull'interno file system btrfs è diminuito di 1.5GB (un po' di più visto che i metadati sono in raid1)

Ora vado a riguardare le quote e, correttamente, il subvolume /repo (id 267) è occupato per 1.5GB.

Se ora provo a scrivere un file da 2.5GB in /repo supero il limite che avevo fissato in 3GB (1.5GB erano già occupati da prima).

Ora cancello tutto e provo uno strano effetto di btrfs.

Mi porto in /repo, con quota limite di 3GB e scrivo un file da 3GB.

(bisogna sempre avere un po' di pazienza quando si vanno a controllare le quota con btrfs qgroup in quanto possono passare dei secondi prima che vengano correttamente aggiornate).

Ora provo a cancellare il file prova da 3GB appena creato in /repo.

Non riesco a cancellarlo perchè coi file system COW (copy on write) come btrfs l'atto di cancellare un oggetto occupa dello spazio che poi viene liberato subito dopo se non ci sono snapshot. In questo caso quindi, con la quota completamente occupata non si riesce a eliminare. Per farlo biosogna disabilitare le quote sul filesystem o aumentare quelle del subvolume temporaneamente.


Ora scrivo un po' di file a caso nei vari subvolume e provo ad esaminare l'output dei comandi che controllano l'occupazione di spazio.
Sono in single per i dati e in raid1 per i metadati.

Questo vuol dire che lo spazio totale disponibile è
10.41GiB+10GiB = 20.41GiB

Lo spazio allocato per i dati è
6.54GiB + 6.53GiB = 13.07GiB
(solo allocato, non del tutto utilizzato per i dati).

Questo dato (lo spazio allocato) lo troviamo anche in btrfs fi df
12.01+(0.03+0.5)*2 = 13.07GiB
dove però dobbiamo anche contare il raid1 e fare questo calcolo del valore total (escluso GlobalReserv) per ottenre 13.07GiB.

Le informazioni realmente memorizzate occupano invece
7.58+(0.016+0.21)*2=8.032GiB
(devo sommare gli used di btrs fi df, raddoppiando i valori in raid1).


Questo l'articolo di base che ho sempre usato nel corso degli anni per studiare btrfs. Non è aggiornato da un po' ma è perfetto

http://www.funtoo.org/BTRFS_Fun

 

 

Print Friendly, PDF & Email