File system BTRFS multi-dispositivo con disco di dimensioni diverse


14

Ho un filesystem BTRFS esistente composto da un disco da 500 GB e ho appena acquistato un disco da 2 TB per aumentare la capacità di archiviazione del mio server di casa e voglio aggiungere il nuovo disco al filesystem esistente. Da quello che ho letto, sembra che nessuna installazione di BTRFS sia in grado di gestire dischi di dimensioni diverse senza sprecare la differenza di dimensioni tra il disco più grande e quello più piccolo, ma sono nuovo su BTRFS e potrei aver perso qualcosa, quindi c'è un'installazione che può permettermi di combinare due dischi in un filesystem senza sprecare spazio?


Come gestite i dischi sottostanti? Con LVM?
Andy Smith,

@Andy, btrfs gestisce più dischi in stile LVM / RAID, controlla questo .
OneOfOne,

Whoops ... il mio male. Saluti per questo ;-)
Andy Smith il

Risposte:


4

Btrfs può utilizzare diversi livelli di raid per dati e metadati:

il valore predefinito (anche per un disco) è raid1 per i metadati (directory ecc.) e raid0 per i dati.

Se non lo hai modificato, probabilmente non avrai problemi ad aggiungere il secondo disco e eseguire il riequilibrio. perché solo i metadati verranno copiati su entrambi i dischi (puoi vedere le dimensioni dei metadati con btrfs filesystem df /). Basta essere consapevoli del fatto che se uno dei tuoi dischi fallisce perdi i dati.

poiché il disco da 2 TB è molto più grande dei 500 g, potrebbe darti delle probabilità migliori se aggiungi quello nuovo e poi rimuovi quello vecchio (le probabilità di guasto di un'unità specifica sono molto inferiori rispetto alle probabilità di una delle unità in mancanza).

se prevedi di avere un array raid in seguito (con unità di dimensioni più simili), potresti voler ricreare il filesystem sulla nuova unità con raid1 sia per i dati che per i metadati e quindi copiare tutto. poi, quando avrai più soldi, acquista la seconda unità da 2 TB.

ps: l'utilizzo di raid1 su un'unità singl significa che i dati verranno archiviati in due posizioni su quell'unità (per proteggersi dalla corruzione) e ridurrà lo spazio di archiviazione (è davvero una buona idea per i metadati).

pss: seriamente, non essere tentato di non usare raid1 per i metadati. psss: ci sono ottime possibilità che btrfs acquisisca la capacità di cambiare i livelli di raid in modo dinamico.


personalmente sto pianificando di ricreare i miei btrfs fs / array / what-do-i-call-this non appena btrfs ha il supporto raid5 e raid6.
Arthur Ulfeldt,

12

Dipende dal profilo utilizzato per i blocchi di dati del filesystem Btrfs multi-dispositivo.

  • Quando si utilizza RAID0 (impostazione predefinita per i blocchi di dati), ogni disco può essere riempito solo fino alla capacità del disco più piccolo dell'array.

  • Quando si utilizza il profilo "singolo" per i blocchi di dati, ciascun disco verrà riempito fino alla sua piena capacità. per esempiomkfs.btrfs -d single /dev/sda /dev/sdb

Ho un file server con un disco da 2 TB e un disco da 3 TB. Avvia Ubuntu 12.10 da un'unità flash USB. Per prima cosa ho creato il filesystem Btrfs senza l' -d singleopzione:

mkfs.btrfs /dev/sda /dev/sdb

Il risultato è stato che sono riuscito a memorizzare solo circa 4 TB (3,45 dati di file TB binari).

# btrfs fi show
Label: none  uuid: 3a63a407-dd3c-46b6-8902-ede4b2b79465
 Total devices 2 FS bytes used 3.22TB
 devid    2 size 2.73TB used 1.82TB path /dev/sdb
 devid    1 size 1.82TB used 1.82TB path /dev/sda
# btrfs fi df /mnt/btrfs1/
Data, RAID0: total=3.45TB, used=3.22TB
Data: total=8.00MB, used=0.00
System, RAID1: total=8.00MB, used=264.00KB
System: total=4.00MB, used=0.00
Metadata, RAID1: total=94.00GB, used=4.29GB
Metadata: total=8.00MB, used=0.00
# df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sdb        4.6T  3.3T  241G  94% /mnt/btrfs1

Nota used 1.82TBper l'unità da 3 TB.

Quindi ho usato il comando "balance" per convertire i blocchi di dati da RAID0 nel profilo "singolo":

btrfs balance start -dconvert=single /mnt/btrfs1

Ci sono voluti molto tempo (circa 30 ore) per bilanciare i dati da 4 TB. Ma dopo averlo completato, ho potuto usare l'intero 5 TB (4,36 dati binari di file TB).

# btrfs fi show
Label: none  uuid: 3a63a407-dd3c-46b6-8902-ede4b2b79465
 Total devices 2 FS bytes used 4.34TB
 devid    2 size 2.73TB used 2.73TB path /dev/sdb
 devid    1 size 1.82TB used 1.82TB path /dev/sda
# btrfs fi df /mnt/btrfs1/
Data: total=4.36TB, used=4.34TB
System, RAID1: total=40.00MB, used=500.00KB
System: total=4.00MB, used=0.00
Metadata, RAID1: total=94.00GB, used=4.01GB
Metadata: total=8.00MB, used=0.00
# df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sdb        4.6T  4.4T   27G 100% /mnt/btrfs1

2

Ho usato più dispositivi con btrfs in Ubuntu e ha funzionato bene. Tieni presente che btrfs non implementa effettivamente i livelli RAID standard. Implementa lo striping e il mirroring opzionali, ma non il vero RAID.


1

È possibile combinare unità con dimensioni diverse in btrfs.
Ma attualmente btrfs non gestisce molto bene ENOSPC (nessuno spazio sul dispositivo).

Ad esempio, ho installato 3 unità in un array RAID0 (con striping). 1x500GB, 1x250GB, 1x160GB.
Supponresti che avrai uno spazio su disco tra 800-900 GB.

Questo è ciò che df -hmostra:
/ dev / sdf 848G 615G 234G 73% / media / btrfs

Ma non sono in grado di memorizzare altri dati sull'array. (Nessuno spazio lasciato)

btrfs filesystem df /media/btrfsmi mostra questo:
Dati: totale = 612,51 GB, usato = 612,51 GB
Metadati: totale = 1,62 GB, usato = 990,73 MB
Sistema: totale = 12,00 MB, usato = 48,00 KB

Anche il riequilibrio non ha aiutato.

In una mailing list ho visto questa callculation:
dimensione dell'unità più piccola * numero di unità nell'array
(anche se ho un po 'più di spazio: 612 GB anziché 160 GB * 3 = 480 GB)

Quindi, nello stato attuale dello sviluppo, è probabile che non sarai in grado di utilizzare tutto lo spazio che hai anche se btrfs supporta diverse dimensioni in un array.

Sto usando Ubuntu 10.10 con kernel generico 2.6.35-22.


Non credo che supporterà mai quello che vuoi, almeno fino a quando non supporta diversi livelli di raid su base per file / per directory. Per raid0 (striscia), è necessario btrfs per mantenere parti di dimensioni uguali di ciascun file su tutti e 3 i dispositivi. Come può farlo se ti consente di utilizzare tutti i 500 GB di un dispositivo? Se invece di "raid0" hai usato "single" (non sei sicuro che questa opzione fosse disponibile quando hai pubblicato), allora btrfs non prova a duplicare i file da nessuna parte e ti consente di utilizzare tutto lo spazio su tutti i dispositivi. Ma per i livelli di incursione, non ha senso: stai cercando di violare la definizione del livello di incursione.
bobpaul

Non importa, mi sbaglio. btrfs raid0 / 1 esegue solo il striping / mirroring su 1 altro dispositivo, non su tutti i dispositivi, quindi 1 TB + 500 GB + 500 GB funziona esattamente come 1 TB + 1 TB per raid0 e raid1 (almeno come da Linux 3.0). Prima di Linux 3.0, aveva il problema che hai descritto.
bobpaul

1

aggiornamento: la risposta di seguito è stata scritta prima del rilascio di Linux 3.0. Linux 3.0 include la patch quasi round round.

Quando si esegue il mirroring o lo striping dei dati, è necessario allocare il secondo mirror o stripe su un altro dispositivo con spazio libero. BTRFS alloca blocchi ai dispositivi in ​​modo round robin, il che può causare perdita di spazio se si dispone di dispositivi di dimensioni diverse.

C'è una patch quasi-round-robin in cantiere per migliorare questo. Naturalmente, è ancora impossibile accoppiare tutti i blocchi su dispositivi diversi se si dispone di un disco da 500 GB e 2 TB. La patch è destinata più a situazioni come 1 x 1 TB + 2 x 500 GB in cui ogni piccolo disco dovrebbe preferire il mirroring / striping con il disco grande anziché l'altro disco piccolo.

Nella tua situazione, userò semplicemente la modalità "single" per i tuoi dati ( mkfs.btrfs -d single). I blocchi non sono associati in quella modalità, quindi penso che non ci sarebbero problemi con dispositivi di dimensioni diverse. Non l'ho provato però.


0

Questo problema si applica solo alle configurazioni di btrfs-raid1, dalla pagina di Gotchas :

  • L'allocazione avviene su base round robin. Se disponi di una strategia raid1 su un volume composto da unità non corrispondenti (volumi di dimensioni diverse), il tuo volume più piccolo potrebbe riempire lasciando molto spazio libero sul tuo singolo disco più grande. Puoi verificare che questo sia un problema se c'è qualche discrepanza tra 'df' e 'btrfs filesystem df [mountpoint]' E se quest'ultimo comando mostra anche che "total" e "used" sono gli stessi sulla riga "Data" . Un riequilibrio può mitigare questo problema. (2.6.33)
    • Se il volume si riempie in questo modo, un ribilanciamento può causare rapidamente un errore ENOSPC ("Errore NESSUNA SPAZZA sul dispositivo"). Potrebbe essere necessario eliminare un file relativamente grande per risolvere questo impasse, quindi un riequilibrio avrà esito positivo. (2.6.33)
    • Il riequilibrio può causare un utilizzo molto intenso della CPU per periodi di tempo prolungati. (2.6.34 e 2.6.35)

Mi dispiace farti ripetere, ma sto per aggiungere il nuovo dispositivo e devo esserne sicuro. Tutte le fonti su cui è stato verificato RAID0 indicano che i dischi devono avere le stesse dimensioni (ad esempio il documento geom di freebsd: "Ogni disco in una striscia RAID0 deve avere le stesse dimensioni, poiché le richieste I / O sono intercalate per leggere o scrivere a più dischi in parallelo. "). Puoi confermare che funziona con Btrfs per favore?
fokenrute,

Mi dispiace, non ho btrfs multi-dispositivo che non posso confermare, tuttavia nulla di ciò che trovo dice nulla sulla stessa dimensione del dispositivo per raid0 + btrfs, tuttavia se hai abbastanza tempo, dividi il nuovo disco in 1 TB / 1 TB, eseguire il backup del vecchio disco su una delle partizioni, aggiungere 1 TB vuoto, se funziona aggiungere la 2a partizione.
OneOfOne, il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.