Unindo discos com MergerFS

Opostamente a um sistema RAID 0, utilizando o mergerfs você não perde todos os seus dados caso um dos discos falhe por dano físico!


| Se você apoia nosso site, desative o AdBlock quando visitá-lo, inclusive em Mobile!
Os anúncios são poucos e não invasivos. Se quiser contribuir com nosso trabalho, clique em qualquer banner de sua preferência, exceto dos Parceiros. 
Mais detalhes clicando aqui.


1. Introdução

Já abordamos aqui como funciona a configuração mais comum de sistemas RAID 0 e 1 com mdadm, onde o RAID 0 é dividir os dados entre vários discos para aumentar a velocidade de leitura/gravação; e RAID 1 o modelo espelho, que replica os dados entre os diversos discos.

Mesmo em BTRFS o RAID 0 tem um problema sério: Se 1 dos discos falhar, quase todos os dados perdem-se, pois o propósito maior do RAID 0 é dividir os dados nos discos para multiplicar o tempo de leitura/gravação deles! Quando um disco falha, toda a cadeia RAID 0 se perde. – Substituições nesse tipo de RAID devem ser feitas com comandos feitos na preventiva, antes das falhas ocorrerem.

Porém nos sistemas Linux existe um pequeno programa que faz a união dos discos com o objetivo de multiplicas espaço. Ou seja, quando um dos discos falhar, você perderá os/ dados somente daquele que falhou.

2. MergerFS

O MergerFS é um sistema de arquivos da união, semelhante ao mhddfs, UnionFS e aufs. O MergerFS permite a junção de vários diretórios que aparecem para o usuário como um único diretório. Esse diretório mesclado conterá todos os arquivos e diretórios presentes em cada um dos diretórios ingressados. Além disso, o diretório mesclado será montado em um único ponto no sistema de arquivos, simplificando bastante o acesso e o gerenciamento de arquivos e subdiretórios.

Estrutura de diretórios quando unidos pelo MergerFS

E, quando cada um dos diretórios mesclados são pontos de montagem que representam discos individuais ou matrizes de disco, o mergerFS serve efetivamente como um utilitário de conjunto de discos, permitindo agrupar discos rígidos, matrizes ou qualquer combinação dos dois. 

Opostamente a outros sistemas de montagem que se baseiam em FUSE, o MergerFS possui vários recursos modernos e alguns exclusivos. Mais abaixo na sessão 4.1 e 4.2!

O MergerFS combina diversos discos como se fossem apenas um, seguindo as seguintes características:

  • Os discos são somados como se fossem 1 única partição e/ou pasta. Quando um dado é salvo, ele vai pro primeiro disco do arranjo. Sempre integralmente, sem divisões.
  • Quando o primeiro disco da sequência encher – ou atingir o limite máximo de espaço disponível pré-definido – ele vai começar a usar o segundo disco; e assim sucessivamente.
  • Caso os primeiros discos cheios tenham espaço livre novamente, eles serão usados prioritariamente novamente, antes dos próximos da sequência. A organização dos dados neles segue sempre uma sequência direta.
  • Se um bloco de dados como uma imagem .ISO não couber num disco, ele é simplesmente realocado para os demais que tiverem espaço livre, não sendo jamais dividido.
  • Se um disco falhar, somente os dados naquele disco serão perdidos.
  • Uma característica interessante: Permite unir discos com sistemas de arquivos diferentes! Portanto poderá ter discos em EXT4, outros em BTRFS, ainda alguns em NTFS, todos serão unidos.
    Além disso continuará com os recursos de cada sistema de arquivos, como os snapshots do btrfs, compatibilidade do Windows com NTFS, etc.
  • Você pode agregar discos com dados! Ao inserir, as pastas/dados daquele disco ficarão visíveis no agrupamento total.

Agora a dúvida: Cansei desse arranjo. O que acontece se eu desuni-lo?
Muito simples!

  • Ao desmontar o arranjo os discos voltam a funcionar normalmente como funcionavam antes do arranjo.
    Exemplo: Se o disco possuía partes dos dados de um sistema Windows, basta voltar o disco que ele será reconhecido normalmente, sem perdas. Os dados contidos naquele disco continuarão acessíveis naquele disco.

E claros, temos os Contras:

  • O driver do mergerFS não está embutido em nenhum kernel Linux, nem mesmo no 5.5+.
    Como consequência, você terá problemas se tentar usar esse arranjo como base do sistema de arquivos raíz de um sistema Linux e tentar dar boot por ele. Por via das dúvidas, deixe o sistema e os dados separados.
  • O Windows não reconhece o arranjo total, apenas os discos isoladamente com NTFS.
  • Não há ganho de desempenho; apenas ganha-se otimizando espaço livre em discos de tamanhos e modelos distintos. Pode-se ter SSD e HDD num mesmo arranjo, lembrando a regra: Quando um encher totalmente, o segundo será então utilizado.
  • Caso precise dar manutenção nos sistemas de arquivos do arranjo, por exemplo executar um fsck em uma partição EXT4, desmonte o grupo todo e depois monte-o sem o disco problemático. Somente os dados nele serão inacessíveis temporariamente até a manutenção concluir.

3. Instalação

Para instalar o mhddfs, faça o seguinte em seu sistema Debian, Ubuntu ou derivados:

$ sudo apt install mergerfs

Se for CentOS/RHEL, você deve habilitar o repositório EPEL e executar o seguinte comando em seguida:

# yum install mergerfs

Já para o Fedora 22+, este comando:

# dnf install mergerfs

4. Configuração

A essa altura, você já deve ter os HDDs plugado em portas SATA de seu computador. Para ficar interessante, tenha +1 HDD. O sistema de arquivos não importa muito, podem ser diferentes; e você pode ter arquivos nestes HDDs.

Primeiro, crie diretórios para estes HDDs serem montados. Eu preferi assim:

$ sudo mkdir /mnt/sata1
$ sudo mkdir /mnt/sata2

Etc, para quantos mais você utilizar. E crie uma pasta para ser nosso ponto de montagem “raid” com todos os discos unidos. Sugiro que seja:

$ sudo mkdir /mnt/backup

Encontre os diretórios destes discos com:

$ sudo blkid

Anote quem é /dev/sdXY, /dev/sdAB, etc, onde XY e AB podem ser b1, c1, etc. Monte-os respectivamente em cada subdiretório anteriormente criado:

$ sudo mount /dev/sdXY /mnt/sata1
$ sudo mount /dev/sdAB /mnt/sata2

Se tudo deu certo, confirme com:

$ df -h

Para tornar a mudança permanente, adicione da seguinte forma ao /etc/fstab (tudo na mesma linha!):

/dev/disk/by-uuid/XXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXX /mnt/sata1 btrfs defaults,allow_other 0 2

Onde o X em negrito é o UUID do disco, dado este que pode ser visto com “sudo blkid” também. Lembre-se de definir o tipo de sistema de arquivos (NTFS, BTRFS, EXT4, etc), e atentos a parâmetros adicionais que podem ser adicionados ao final após defaults, separando por vírgula.

Ou seja, você pode usar discos com btrfs para ter snapshots ou compactação nativa; pode usar discos ntfs que são acessíveis pelo Windows; ou discos comuns em EXT4.

Você verá todos montados em suas respectivas pastas, com tamanho total e tamanho em uso! Em seguida, monte-os com MergerFS, lembrando que o usuário deve ser root ou membro do grupo FUSE:

/mnt/sata1:/mnt/sata2:/mnt/sata3:/mnt/sata4 /mnt/backup fuse.mergerfs defaults,fsname=mergerfs,allow_other 0 0

Note o padrão: Separe todos os subdiretórios montados com dois pontos e o último terá apenas um espaço delimitando aonde o disco final será montado.

Ao concluir, dê df -h novamente, e note que você terá uma disposição semelhante a essa:

Aqui no exemplo, note vários /dev, de /dev/sda até /dev/sde, sendo /dev/sdf meu sistema operacional; E perto do fim da lista, o somatório com mergerfs totalizando 5.5 Tb!

5. Opções Extras e/ou Exclusivas

5.1 Opções de Montagem

  • defaults:
    Adicionam os parâmetros atomic_o_trunc, auto_cache, big_writes, default_permissions, splice_move, splice_read, e splice_write.
    O objetivo é melhorar a performance geral do arranjo.
  • allow_other:
    Essa opção permite que qualquer usuário crie e edite dados nas partições montadas com o MergerFS. Coloque se quiser que a partição apareça no “df -h” do seu usuario!
  • minfreespace=SIZE:
    O valor de espaço mínimo para as políticas de criação, caso cada disco atinja esse limite de espaço livre, o próximo na sequencia será usado. Enquanto que ‘K’, ‘M’, e ‘G’ representam kilobyte, megabyte, e gigabyte respectivamente. (Padrão: 4G)
  • moveonenospc=BOOL:
    Se habilitado, caso uma escrita falhe com saída de comando ENOSPC ou EDQUOT, o MergerFS vai escanear todos os discos pra encontrar aquele que tenha no minimo o tamanho total do arquivo + o tamanho dele quando falhou no meio da escrita. Haverá uma tentativa de move-lo, mantendo os metadados, e se for bem sucedido, o dado da primeira tentativa é desvinculado e a escrita reiniciada. (padrão: false)
  • use_ino:
    Diz ao mergerfs para usar os inodos dos diretórios e arquivos em vez do libfuse. Isso permite que links simbólicos de arquivos e pastas não percam seu valor nem corrompam. Ausente por padrão, é preferível que você use.
  • dropcacheonclose=BOOL:
    Recomendado por quem utiliza cache.files=partial|full|auto-full para limitar, evitando duplo cache. (padrão: false)
  • ignorepponrename=BOOL:
    Ignora o caminho, preservando-o em caso de renomeio. Normalmente o comando renomear e um link, agem diferente dependendo da política de criação (mais abaixo em 5.2). Habilitar isso vai fazer renomear ou criar links pra sempre usarem um esquema que não utiliza caminhos brutos. Significa que um arquivo renomeado ou linkado vai continuar no mesmo disco. (default: false)
  • xattr=passthrough|noattr|nosys:
    Controle de xattrs. Padrão sempre permite xattr ser aplicado aos dados. noattr fingirá que nada existe. nosys reporta como ENOSYS que o xattr não é suportado ou desativado. (default: passthrough)
  • link_cow=BOOL:
    Quando habilitado, qualquer arquivo duplicado com contagem >1 será tenporariamente copiado e renomeado sobre o original. Aplica uma função similar ao COW do BTRFS. (default: false)
  • posix_acl=BOOL:
    Habilita POSIX ACL (se suportado pelo kernel e pelo sistema de arquivos abaixo). (default: false)
  • async_read=BOOL:
    Performa leituras assíncronas. Se desabilitado ou ausente, o kernel vai garantir que pelo menos um requerimento de leitura pendente fique disponivel por arquivo e vai organiza-los apropriadamente. (default: true)
  • threads=INT:
    Número de threads para usar em um modo multithreaded. Quando delimitado em zero, vai tentar procurar e usar núcleos lógicos da CPU. Se falhar, voltará a usar os núcleos fisicos. Se o número for negativo, ele vai olhar o número total de núcleos e dividir pelo valor negativado. Exemplo: threads=-2 numa máquina octa core vai resultar em 8 / 2 = 4 threads. Deve haver no mínimo 1 thread. NOTE: Um valor muito alto de threads melhora o paralelismo mas diminui o throughput. (default: 0)
  • fsname=STR:
    Define um nome para o sistema de arquivos a ser exibido no df, etc. Por padrão, ele exibe uma lista dos diretórios concatenados na montagem.
  • category.CATEGORY=POLICY:
    Define uma política para todas as funções do FUSE na categoria provida. Examplo: category.create=mfs

Mais parâmetros citados no GitHub

5.2 Filtros de Politicas de Uso dos Discos mais relevantes

Uma política de preservação de caminho (todos que começam com EP abaixo) considerará apenas unidades onde o caminho relativo que está sendo acessado já existe. – Isso significa que, ao somar os discos, se houverem dados duplicados, eles serão aproveitados e unidos.

Ao usar políticas que não preservam o caminho, os caminhos serão clonados para direcionar as unidades conforme necessário. – Isso significa que, ao somar os discos, se houverem dados duplicados, eles não serão “aproveitados”: links serão criados entre as pastas. (ideal para a maioria dos cenários)

  • ff (first found) ou epff (existing path, first found)
    Dentro da lista de discos definida em /etc/fstab, utiliza o primeiro da lista.
  • lfs (least free space) ou eplfs 
    Utiliza o disco com menos espaço livre, dentre todos, pra preencher antes dos demais. (lfs sendo ideal para a maioria dos usuários)
  • lus (least used space) ou eplus
    Utiliza o disco menos utilizado, dentre todos, pra preencher antes dos demais.
  • mfs (most free space) ou epmfs
    Utiliza o disco com mais espaço livre, dentre todos, pra preencher antes dos demais.
  • newest
    Pega o arquivo/diretorio recém agregado.
  • rand (random) ou eprand:
    Chama todos os discos e aleatoriza o uso deles. Os dados serão gravados no disco que for sorteado; possuindo pouco espaço restante, aleatoriza novamente.

Mais filtros citados no GitHub

5.3 Uso

Os parâmetros são adicionados ao /etc/fstab. Um exemplo: (tudo na mesma linha)

/mnt/sata1:/mnt/sata2:/mnt/sata3:/mnt/sata4 /mnt/backup fuse.mergerfs defaults,allow_other,direct_io,use_ino,category.create=lfs,moveonenospc=true,minfreespace=10G,fsname=mergerfs 0 0

Atento para não adicionar parâmetros conflitantes entre si!

6. Conclusão

Ao fim, você pode utilizar o diretório final em /mnt/backup para acessar, gravar ou apagar dados de todos os discos.

Após isso, a linha de montagem do mergerfs ficará assim ao final de /etc/fstab (tudo na mesma linha!):

/mnt/sata1:/mnt/sata2:/mnt/sata3:/mnt/sata4 /mnt/backup fuse.mergerfs allow_other,direct_io,use_ino,category.create=lfs,moveonenospc=true,minfreespace=10G,fsname=mergerfs 0 0

Siga o padrão de nomenclatura e não terá problemas!

Para montar sem reiniciar, basta digitar:

$ sudo mount -a

Se não houverem erros, a pasta estará disponível imediatamente.

Fontes:
teknophiles

2 comentários em “Unindo discos com MergerFS”

  1. Muito bom este artigo mude a cara do site deixe algo mais clean menos aparencia de dificultoso terá um publico maior eu gosto muito de seus artigos.

    Responder

Deixe um comentário