Sistema de arquivos BTRFS para vários dispositivos com disco de tamanho diferente

14

Eu tenho um sistema de arquivos BTRFS existente composto por um disco de 500 GB e acabei de comprar um disco de 2 TB para aumentar a capacidade de armazenamento do meu servidor doméstico e quero adicionar o novo disco ao sistema de arquivos existente. Pelo que li, parece que nenhuma configuração de BTRFS pode lidar com discos de tamanhos diferentes sem desperdiçar a diferença de tamanho entre o disco maior e o menor, mas eu sou novo no BTRFS e posso ter perdido alguma coisa, então existe uma configuração que pode me permitir combinar dois discos em um sistema de arquivos sem desperdiçar espaço?

fokenrute
fonte
Como você está lidando com os discos subjacentes? Com LVM?
Andy Smith
@ Andy, o btrfs lida com vários discos no estilo LVM / RAID, verifique isso .
OneOfOne
Opa ... meu mal. Felicidades por isso ;-) #
Andy Smith

Respostas:

4

O Btrfs pode usar diferentes níveis de invasão para dados e metadados:

o padrão (mesmo para um disco) é raid1 para os metadados (diretórios etc) e raid0 para os dados.

Se você não alterou isso, provavelmente não terá problemas para adicionar o segundo disco e executar o reequilíbrio. porque apenas os metadados serão copiados para os dois discos (você pode ver o tamanho dos metadados btrfs filesystem df /). Lembre-se de que, se um dos seus discos falhar, você perderá dados.

porque o disco de 2 TB é muuuito mais alto do que os 500 g, talvez lhe daria melhores chances se você adicionar o novo e remover o antigo (as chances de uma unidade específica falhar são muito menores que as chances de qualquer uma das unidades falhando).

se você planeja ter uma matriz de incursões mais tarde (com unidades de tamanho semelhante), recrie o sistema de arquivos na nova unidade com raid1 para dados e metadados e, em seguida, copie tudo. depois, quando você tiver mais dinheiro, compre o segundo drive de 2 TB.

ps: usar raid1 em uma unidade única significa que os dados serão armazenados em dois locais nessa unidade (para proteger contra corrupção) e reduzirão seu espaço de armazenamento (é realmente uma boa ideia para os metadados).

pss: sério, não fique tentado a não usar o raid1 para metadados. psss: há uma chance muito boa de que o btrfs ganhe a capacidade de alterar os níveis de raide dinamicamente.

Arthur Ulfeldt
fonte
Pessoalmente, estou pensando em recriar meus btrfs fs / matrizes / o que fazer-assim-chamar assim que o btrfs tiver suporte a raid5 e raid6.
Arthur Ulfeldt
12

Depende de qual perfil você usa para os blocos de dados do sistema de arquivos Btrfs para vários dispositivos.

  • Quando você usa RAID0 (o padrão para blocos de dados), cada disco pode ser preenchido apenas com a capacidade do menor disco da matriz.

  • Quando você usa o perfil "único" para os blocos de dados, cada disco será preenchido até sua capacidade total. por exemplomkfs.btrfs -d single /dev/sda /dev/sdb

Eu tenho um servidor de arquivos com um disco de 2 TB e 3 TB. Ele inicializa o Ubuntu 12.10 a partir de uma unidade flash USB. Primeiro, criei o sistema de arquivos Btrfs sem a -d singleopção:

mkfs.btrfs /dev/sda /dev/sdb

O resultado foi que eu só consegui armazenar cerca de 4 TB (dados de arquivos binários de 3,45 TB).

# 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

Observe o used 1.82TBda unidade de 3 TB.

Então eu usei o comando "balance" para converter os blocos de dados de RAID0 para o perfil "single":

btrfs balance start -dconvert=single /mnt/btrfs1

Demorou muito tempo (cerca de 30 horas) para equilibrar os dados de 4 TB. Mas, após a conclusão, eu poderia usar os 5 TB completos (dados binários do arquivo de TB de 4,36).

# 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
Christian d'Heureuse
fonte
2

Eu usei vários dispositivos com btrfs no Ubuntu, e funcionou muito bem. Lembre-se de que o btrfs não implementa realmente os níveis padrão de RAID. Implementa distribuição e espelhamento opcionais, mas não RAID verdadeiro.

Michael Trausch
fonte
1

É possível combinar unidades com tamanhos diferentes em btrfs.
Mas atualmente o btrfs não suporta muito bem o ENOSPC (não há espaço no dispositivo).

Por exemplo, eu instalei 3 unidades em uma matriz RAID0 (listrada). 1x500GB, 1x250GB, 1x160GB.
Você supõe que terá um espaço em disco entre 800 e 900 GB.

Isto é o que df -hmostra:
/ dev / sdf 848G 615G 234G 73% / media / btrfs

Mas não consigo armazenar mais dados na matriz. (Não há espaço disponível)

btrfs filesystem df /media/btrfsmostra-me isto:
Dados: total = 612,51GB, usado = 612,51GB
Metadados: total = 1,62GB, usado = 990,73MB
Sistema: total = 12,00MB, usado = 48,00KB

Até o reequilíbrio não ajudou.

Em uma lista de discussão, vi esta citação:
tamanho da menor unidade * número de unidades na matriz
(embora eu tenha mais espaço: 612GB em vez de 160GB * 3 = 480GB)

Portanto, no estado atual de desenvolvimento, as chances são de que você não poderá usar todo o espaço disponível, embora o btrfs suporte tamanhos diferentes em uma matriz.

Estou usando o Ubuntu 10.10 com o kernel 2.6.35-22-genérico.

torusJKL
fonte
Acho que nunca suportará o que você deseja, pelo menos até que suporte diferentes níveis de invasão por arquivo / por diretório. Para raid0 (faixa), o btrfs é necessário para manter partes de tamanhos iguais de cada arquivo nos três dispositivos. Como isso pode ser permitido se você usar todos os 500 GB de um dispositivo? Se em vez de "raid0" você usou "single" (não tendo certeza de que esta opção estava disponível quando você postou), o btrfs não tenta duplicar arquivos em nenhum lugar e permite que você use todo o espaço em todos os dispositivos. Mas para os níveis de ataque, não faz sentido: você está tentando violar a definição do nível de ataque.
bobpaul
Deixa pra lá, eu estou errado. O btrfs raid0 / 1 distribui / espelha apenas um outro dispositivo, nem todos os dispositivos, portanto, 1TB + 500GB + 500GB funciona exatamente como 1TB + 1TB para raid0 e raid1 (pelo menos no Linux 3.0). Antes do Linux 3.0, havia o problema que você descreveu.
bobpaul
1

update: a resposta abaixo foi escrita antes do lançamento do Linux 3.0. O Linux 3.0 inclui o patch quase-round-robin.

Quando você faz o espelhamento ou distribuição de dados, o segundo pedaço de espelho ou faixa precisa ser alocado em outro dispositivo com espaço livre. O BTRFS aloca pedaços para dispositivos de maneira round-robin, o que pode causar perda de espaço se você tiver dispositivos de tamanhos diferentes.

Há um patch quase-round-robin no pipeline para melhorar isso. Obviamente, ainda é impossível emparelhar todos os pedaços em dispositivos diferentes se você tiver um disco de 500 GB e 2 TB. O patch destina-se mais a situações como 1 x 1 TB + 2 x 500 GB, em que cada disco pequeno deve preferir espelhar / distribuir o disco grande em vez do outro disco pequeno.

Na sua situação, eu usaria apenas o modo "único" para seus dados ( mkfs.btrfs -d single). Os pedaços não são pareados nesse modo, então acho que não haveria problema com dispositivos de tamanhos diferentes. Eu ainda não testei.

Wim Coenen
fonte
0

Esse problema se aplica apenas às configurações do btrfs-raid1, na página Gotchas :

  • A alocação é feita em rodízio. Se você tiver uma estratégia raid1 em um volume composto por unidades incompatíveis (volumes de tamanhos diferentes), seu volume menor poderá ser preenchido, deixando muito espaço livre em sua única unidade maior. Você pode verificar se isso é um problema se houver alguma discrepância entre 'df' e 'btrfs filesystem df [mountpoint]' E se o último comando também mostrar que "total" e "usado" são iguais na linha "Dados" . Um reequilíbrio pode atenuar esse problema. (2.6.33)
    • Se o volume aumentar dessa maneira, um reequilíbrio poderá causar rapidamente um ENOSPC ("Erro no espaço de espaço deixado no dispositivo"). Pode ser necessário excluir um arquivo relativamente grande para resolver esse impasse, e um reequilíbrio será bem-sucedido. (2.6.33)
    • O reequilíbrio pode causar um uso muito intenso da CPU por períodos prolongados. (2.6.34 e 2.6.35)
OneOfOne
fonte
Desculpe fazer você se repetir, mas estou prestes a adicionar o novo dispositivo e preciso ter certeza. Todas as fontes verificadas quanto ao RAID0 afirmam que os discos precisam ter o mesmo tamanho (por exemplo, o freebsd geom doc: "Cada disco em uma faixa RAID0 deve ter o mesmo tamanho, pois as solicitações de E / S são intercaladas para leitura ou gravação para vários discos em paralelo. "). Você pode confirmar que funciona com o Btrfs, por favor?
fokenrute
Sinto muito, não tenho btrfs para vários dispositivos que não posso confirmar, mas nada que eu possa encontrar diz algo sobre ter o mesmo tamanho de dispositivo para raid0 + btrfs; no entanto, se você tiver tempo suficiente, divida o novo disco para 1tb / 1tb, faça backup do disco antigo em uma das partições, acrescente o 1tb vazio, se funcionar, adicione a 2ª partição.
OneOfOne