Manual

do

Maker

.

com

Como unir 2 HDs/SSDs com UnionFS

Como unir 2 HDs/SSDs com UnionFS

Às vezes é difícil definir um bom título. Acho que é o caso agora, porque de fato o que vamos fazer não é exatamente "unir", mas disponibilizar simultaneamente em um diretório 2 ou mais HDs/SSDs diferentes usando unionfs.

O que é unionfs

O unionfs faz "overlays" de diretórios em um único ponto de montagem. O que isso quer dizer?

Dispositivos no Linux

No Linux os dispositivos são arquivos descritores que ficam em /dev. Quando conectamos qualquer dispositivo, um evento é disparado e o kernel se encarrega de de tratar essa entrada, gerando um arquivo descritor para ele. Isso é um resumo ruim, mas pense nisso: Conectou um pendrive, o kernel cria o dispositivo em /dev/, normalmente algo como sdb, mas tem outros tipos de "dispositivos de bloco" também, que geram outras nomenclaturas de dispositivos.

Agora, um parágrafo extra, mas fique com a ideia acima, se não tiver muita intimidade com o sistema.

Quando um dispositivo como um pendrive é conectado à USB, um evento do controlador USB é disparado e, o kernel, que é o responsável por gerir a interface do hardware com o resto do sistema, carrega o driver (quando não se tratar de um kernel estático, onde os drivers são parte integral do kernel). Após carregada a interface que dá acesso à manipulação do dispositivo, ele é criado no sistema pelo udev.

Essa explicação ainda é grosseira e muito pior para entendimento daqueles que não tem intimidade com as entranhas do sistema, mas é um resumo para evitar críticas pela "abstração". O primeiro parágrafo fica para quem quer entender basicamente o funcionamento.

Seguindo a ideia de que temos um arquivo descritor de um pendrive em /dev/sda e um arquivo descritor para outro pendrive em /dev/sdb. Temos agora as partições. Ou seja, temos as mídias de armazenamento sd A e a mídia de armazendo sd B. As partições são numéricas. Supondo que cada pendrive tenha apenas uma partição, teremos /dev/sda1 e /dev/sdb1. Esses serão os arquivos descritores dos respectivos dispositivos.

Você não precisa adivinhar o dispositivo, basta digitar dmesg no terminal e ver a saída de logs do sistema. Lá estarão os dispositivos e os descritores criados.

Ponto de montagem

Os arquivos descritores em si não dão acesso direto ao conteúdo. Ele é um arquivo que precisa agora ser "montado" para dar acesso ao conteúdo da partição.

Torne-se root, crie os diretórios de destino e monte os dispositivos nesses diretórios:

sudo su
mkdir /mnt/{pendrive_1,pendrive_2}
mount /dev/sda1 /mnt/pendrive_1
mount /dev/sdb1 /mnt/pendrive_2

Agora podemos acessar os dados dos pendrives dentro dos respectivos diretórios montados. Mas e se quiséssemos apenas que os dois dispositivos se comportassem com 1, para disponibilizá-lo em rede, como se fosse um storage? - Dá pra fazer, mas não é 100%. Explico.

RAID e LVM

Não vou entrar em detalhes agora porque ambos são extensos e com características muito específicas. Já trabalhei muito com ambos e basicamente, ambos tem uma característica em comum, que é unir dispositivos em um único sistema de arquivos. Mas para isso, é necessário que uma camada lógica seja criada nas mídias de armazenamento e nesse caso, os dispositivos serão formatados.

UnionFS

O unionfs é uma das diversas formas de "juntar" diferentes dispositivos como se fosse apenas um, com algumas limitações. No caso dos pendrives, podemos fazer com que ambos apareçam como se fosse apenas 1 dispositivo, porém ao gravar, apenas um deles poderá receber o novo arquivo, por razões óbvias: Duplicidade.

Se quiser experimentar sem colocar pendrives para o teste (ou se não tiver os pendrives e quiser experimentar o recurso), siga os procedimentos abaixo.

Instalar unionfs

Em Debian e suas variantes (como Ubuntu, Mint etc) comece instalando o recurso:

sudo apt-get install unionfs-fuse

Se for OpenSuSE, instale assim:

sudo su
zypper install unionfs-fuse

Agora vamos criar um ambiente de teste. Isso será um ambiente fictício, mas com pendrives o comportamento deve ser o mesmo.

mkdir -p LAB/{pendrive_1,pendrive_2,union_dir}
touch LAB/{pendrive_1/{arquivo_1,arquivo_2},pendrive_2/{arquivo_3,arquivo_4}}
cd LAB

O que fizemos nas 3 linhas anteriores foi criar o diretório LAB com seus subdiretórios. Em seguida, criamos os arquivos nos diretórios correspondentes aos pendrive_1 e pendrive_2. Assim, populamos os diretórios de modo a parecerem dispositivos reais. Por último, acessamos o diretório LAB.

union-structure-dir.png

Para fazer a união dos diretórios, usaremos como destino o union_dir .

 unionfs -o cow,allow_other,use_ino,suid,dev,nonempty pendrive_1=RO:pendrive_2=RW union_dir/

Com esse comando (cheio de parâmetros) dissemos que o pendrive_1 é leitura e o pendrive_2 é leitura e escrita. Então, quando criarmos um arquivo dentro de union_dir, o destino real será pendrive_2 (no caso desse comando, que especificou o pendrive_2 como RW).

Para "desmontar" quando não for usar mais, usa-se o comando umount passando o diretório alvo como parâmetro:

umount union_dir

É fundamental ter esse cuidado para não corromper nada. Do mesmo modo, antes de remover os dispositivos reais da porta USB (ou qualquer dispositivo hot swap), deve-se desmontá-los:

umount /mnt/{pendrive_1,pendrive_2}

Mais uma vez, o comando de desmontagem acima é para o caso de dispositivos reais. Como usamos diretórios no sistema de arquivos para mostrar o uso de unionfs, desmontar o union_dir é tudo o que precisa ser feito.

Existem outras opções, com algumas variantes. Em outro artigo apresento mais sobre o tema, mas o que queria explicar nesse artigo já está feito.

Compartilhamento em rede

Daí você poderá querer criar um diretório de rede compartilhado usando o unionfs para juntar seus dispositivos. Nesse caso, o próximo passo é configurar um serviço de rede como SAMBA ou NFS. Procure por samba e/ou nfs na caixa de busca rápida, já tem artigo sobre o tema há algum tempo.

Nome do Autor

Djames Suhanko

Autor do blog "Do bit Ao Byte / Manual do Maker".

Viciado em embarcados desde 2006.
LinuxUser 158.760, desde 1997.