31 de julho de 2021

Do bit Ao Byte

Embarcados, Linux e programação

Network File System: NFS

NFS

Resolvi escrever uns artigos rápidos sobre compartilhamento em rede e vou abrir essa curta série com NFS, que já utilizei em grandes storages de telecom, até usando RAID por software no começo (eca). O interessante é que serve pra qualquer sistema; Linux, Windows, Mac etc. Se não conhece, a leitura deve ser mais interessante ainda!

A propósito, gostou da imagem de destaque? Fiz uma sátira, incluindo todos os elementos que costumam usar pra remeter a um hacker; o rubber duck (pra executar comandos automatizados), o inexplicável HTML, algo colado na tela do laptop, o brinquedo nerd e a tradicional chuva matrix. Opa, e claro, outro fato inexplicável: Um “hacker” de capuz e óculos escuros na frente do laptop com tampa na câmera. Não por acaso, a foto é minha. Não sei ainda se dará certo, mas pretendo incluir no vídeo. Não é promessa, mas de qualquer modo, inscreva-se em nosso canal DobitaobyteBrasil no Youtube.

NFS – Sistema de arquivos em rede

Digamos que minha criatividade está acima da capacidade do meu SSD. Tem vídeos de 3 minutos que subo no canal DobitaobyteBrasil no Youtube que chegam a consumir quase 40GB antes da compilação final. Minha GPU é uma 1080Ti – muito guerreira por sinal, mas com mais memória certamente eu ampliaria o consumo no SDD. Por essa razão resolvi transportar minhas bibliotecas de áudio e vídeo, efeitos e configurações para “fora” do menu laptop. Como tinha aqui um computador pequeno (em tamanho e capacidade), decidi transformá-lo em storage. Daí me deu esse insight de criar artigos relacionados, principalmente para quem usa Raspberry e quer poupar o micro-SD.

Configuração do server side

Esse é um serviço cliente-servidor. O lado server pode ser qualquer computador, inclusive um Raspberry com um HD na USB, por exemplo. Como já citei acima, estou usando um computador x86 com Ubuntu. Qualquer distribuição baseada em Debian deve funcionar de forma igual ou semelhante.

Instalar pacotes NFS

Algumas dependências vem a partir da instalação do pacote nfs-kernel-server.

sudo su
apt-get update
apt-get install nfs-kernel-server

Crie o diretório que deseja compartilhar

O diretório pode ter qualquer nome e estar em qualquer lugar. Ele precisa existir porque será o ponto visível na rede. Normalmente os mount points são colocados em /mnt, mas eu preferi criar no home do meu usuário nesse storage.

Podemos fazer acesso com usuário e senha, por exemplo. Nesse compartilhamento eu deixei tão inseguro quanto possível; não preciso de usuário, senha nem nada, só acessar. Para fazer isso, adote esses procedimentos:

sudo su #assim se torna root e não precisa ficar digitando 'sudo' toda a vez
mkdir /home/$USER/nfs #eu chamei de nfs no storage
sudo chown -R nobody:nogroup /home/$USER/nfs
chmod 0777 /home/$USER/nfs

Configure o serviço

Agora precisamos editar o arquivo /etc/exports. Nele estão dispostos alguns exemplos bem objetivos. O que vamos fazer é o método de compartilhamento para NFSv2 e V3. Costumo editar arquivos de console com um editor de linha de comando. experimente editar com o editor pico, nano ou mc. Inclua a seguinte linha:

/home/djames/nfs 192.168.1.0/24(rw,sync,no_subtree_check)

Troque djames pelo seu usuário, ou troque todo o caminho pelo caminho que tiver escolhido para seu compartilhamento.

Do jeito que está disposto na linha acima, o diretório ~/nfs será compartilhado com toda a rede 192.168.1.0, com máscara 24 (255.255.255.0), ou seja, dos hosts 1 ao 254 (porque 0 é reserva de rede e 255 é o broadcast). Em seguida estão os parâmetros de compartilhamento, que são permissão de leitura e escrita, sincronismo da transferência para não perder dados e sem verificação da árvore de arquivos na escrita.

O arquivo /etc/exports é bastante flexível. Se quiser especificar o host que pode acessar o compartilhamento, basta mudar um pouco a linha, como assim:

/home/djames/nfs 192.168.1.2 (rw,sync,no_subtree_check

E pode ter múltiplas linhas, para quantos hosts independentes desejar.

Configuração final do serviço

Após esses comandos já poderemos ir ao outro computador – por exemplo, um Raspberry. Digite:

exportfs -a
systemctl restart nfs-kernel-server

Concluída essa etapa, podemos partir para o client.

Configuração do client side

Como se trata de outro computador, vou repetir minha recomendação para evitar o uso de sudo continuamente:

sudo su
apt-get update && apt-get install nfs-common

Agora crie um diretório que hospedará o acesso. Eu criei o diretório STORAGE no home do meu usuário – olha que coincidência – também é djames:

#não precisa ser mais root:
exit
mkdir /home/$USER/STORAGE
chmod 0777 /home/$USER/STORAGE

Tudo pronto, só que pra fazer a montagem vai ter que usar sudo porque o usuário não tem permissão administrativa. Supondo que o IP do seu storage seja 192.168.1.100, faça isso:

sudo mount 192.168.1.100:/home/djames/nfs /home/djames/STORAGE -o user,rw

O comando acima faz a montagem do diretório que está em 192.168.1.100:/home/djames/nfs no diretório local /home/djames/STORAGE. A flag -o é para citar as opções usuário e leitura-escrita.

Esse comando é óbvio para quem está habituado com linha de comando, mas se não for o seu caso e quiser facilitar, edite o arquivo .bashrc e na última linha adicione:

alias storage='sudo mount 192.168.1.207:/home/djames/nfs /home/djames/STORAGE/ -o user,rw'

Mas troque o caminho para os caminhos corretos. Feito isso, abra outro terminal ou digite: source ~/.bashrc. Sempre que precisar montar bastará digitar storage. Outra opção é criar um alias para montar e um alias para desmontar, invés de só montar:

alias storage_on='sudo mount 192.168.1.207:/home/djames/nfs /home/djames/STORAGE/ -o user,rw'
alias storage_off='sudo umount /home/djames/STORAGE'

Porém, se desejar desmontar manualmente é só digitar: umount /home/djames/STORAGE – mas claro, troque o caminho do diretório para o seu.

Se quiser automatizar de maneira limpa, faça a montagem pelo próprio sistema operacional. O problema é que assim ele vai tentar montar no boot, o que pode não ser desejado. Edite o arquivo /etc/fstab e inclua uma linha semelhante a essa no final do arquivo:

192.168.1.100:/home/djames/nfs /home/djames/STORAGE  nfs      defaults,user,rw    0       0

Se não deseja que monte no boot, adicione ,noauto após o rw. Depois bastará fazer mount STORAGE ou umount STORAGE.

NFS no Windows

No Windows podemos usar o SWL e instalar o bash, um Linux e fazer o acesso de forma transparente. Para configuração nativa, o NFS só funciona no Windows 10 Enterprise.

Não meça o diretório pela rede

Se tentar ver as propriedades de pasta remota vai obter um número estranho qualquer. Se quiser ver o tamanho consumido em seu storage, faça um acesso por SSH. Se não sabe como fazê-lo, basta instalar no storage o ssh da seguinte maneira:

sudo apt install openssh-server

Depois acesse com o ip e usuário de qualquer computador da rede que tiver o client ssh instalado:

ssh usuario@192.168.1.100

Troque o usuário e IP por dados reais, claro.

Outro artigo dessa série é o SSHFS, um sistema de arquivos em rede usando o SSH, que já demonstrei a configuração nesse artigo com Raspberry.