Compartilhando com NFS

Quando precisamos compartilhar um diretório entre maquinas Linux usamos o NFS, um protocolo que em sua versão 4 está sendo usado até pela Microsoft para interoperabilidade com Linux/Unix.

A função do NFS é permitir que de forma transparente diretórios possam ser usados via rede, utilizando o modelo cliente/servidor onde uma máquina disponibiliza um diretório via rede e as outras recebem e montam este diretório em sua árvore de diretórios local. O NFS utiliza alguns daemons para poder funcionar, e eles são:

- nfsd - Daemon de montagem e autenticação;
- portmap - Daemon das requisições RPC;
- mountd - Daemon das montagens;
- lockd - Daemon de lock de arquivos;

O NFS exporta um diretório, ou ponto de montagem, através do arquivo /etc/exports e passa as informações ao kernel que quando recebe uma chamada de sistema via RPC entrega aos daemons do NFS.

O RPC é o serviço utilizado para implementar o modelo cliente/servidor para realizar chamadas de processos em dispositivos remotos. O portmap é responsável pelas requisições RPC (Remote Procedure Call), ou seja, ele utiliza a porta 111/tcp para “escutar” as requisições e as encaminha para o serviço correspondente, por medida de segurança recomenda-se a utilizar as RPC apenas se forem necessárias, já que as RPC podem ser exploradas remotamente.

O sistema de arquivos NFS foi implementado usando RPC (Remote Procedure Call), cujos protocolos são descritos usando XDR (eXternal Data Representation), que define um padrão de codificação e decodificação, criando uma identificação independente da máquina. A External Data Representation (XDR) é a linguagem que permite definir tipos de dados de maneira consistente, propiciando a troca de dados entre computadores com diferentes métodos de armazenamento de dados (sistemas de arquivos) utilizando NFS.

O NFS é um protocolo que reside na camada de aplicação do modelo TCP/IP. A operação do NFS é definida na forma de três componentes principais que podem ser vistos logicamente situados em cada uma das três camadas do modelo OSI, correspondendo a camada de aplicação TCP/IP.

Os processos e operações do NFS especificam tarefas a serem executadas em arquivos na rede, usando o XDR para representação e o RPC para transmitir os comandos.

Alguns dos benefícios mais notáveis que o NFS pode oferecer são:

– Estações locais usam menos espaço em disco porque dados freqüentemente usados podem ser armazenados em uma única máquina e ainda permanecerem acessíveis a outras pela rede.
– Não há necessidade de usuários terem diretórios pessoais separados em cada máquina da rede. Diretórios pessoais podem ser configurados no servidor NFS e serem disponibilizados através da rede.
– Dispositivos de armazenamento como leitores de CD-ROM e drives USB podem ser usados por outras máquinas na rede, reduzindo o número de leitores de mídia removível em toda a rede e centralizando o controle de mídias.

Servidor NFS
A configuração do servidor NFS é relativamente simples, o arquivo /etc/exports é onde configuramos os diretórios que serão exportados, para quais redes e com quais opções. A estrutura do arquivo é a seguinte:

Diretório IP ou Rede(Opções de Exportação)

Para instalarmos os pacotes de NFS, caso não estejam instalados, usamos os seguintes comandos:

Em sistemas Debian:
debian:~# apt-get install nfs-kernel-server

Em sistemas Red Hat:
red-hat:~# yum install nfs-server

Dependendo das opções utilizadas na configuração do NFS o acesso aos arquivos será feito com permissão de outros, já que mesmo que o usuário tenha o mesmo nome ou mesma UID o banco de dados de contas é diferente de máquina para máquina, exceto no caso da existência de um controlador de domínio.

Algumas das opções de exportação do NFS:
ro – somente leitura, mesmo que o diretório tenha permissão local 777 ele será exportado sem direito de escrita.
rw – se o diretório local tiver permissão de escrita o NFS irá respeitar isso se possível.
sync – forçar a escrita síncrona em disco.
async – escrita assíncrona em disco.
root_squash – todas as requisições do usuário root na máquina cliente sobre o diretório exportado serão mapeadas como se feitas pelo usuário anônimo, geralmente nobody.
no_root_squash – não serão mapeadas como usuário anônimo as requisições de root da máquina cliente no diretório exportado.
subtree_check – faz a checagem de toda a árvore de subdiretório que foi exportada e não somente do diretório principal.
no_subtree_check – faz a checagem de toda a árvore de subdiretório que foi exportada e não somente do diretório principal, está opção é mais recomendada.
sec=krb5 – atribui o serviço de ticket ao kerberos.
lock – utiliza o controle travas de acesso a arquivos, impedindo assim que dois ou mais clientes ao acessar o mesmo arquivo ao mesmo tempo possam corrompê-lo.
nolock – desabilita o uso do controle travas de acesso a arquivos, utilizado por exemplo ao exportar o /var, já que o /var já possui o NLM implementado em sua estrutura.

Exemplo de arquivo de NFS:

Após configurarmos o arquivo do NFS devemos exportar para o kernel o arquivo /etc/exports com o seguinte comando:

red-hat:~# exportfs -var

Onde:
-a = Fazer export ou unexport para todos os diretórios
-r = Reexportar todos os diretórios
-v = verbose

Configurando o Cliente:
A configuração de um cliente de NFS é simples. Tanto para montagens manuais quanto para as automáticas. Para montar um compartilhamento /home/Suporte vindo de 10.20.1.200, por exemplo, no seu diretório /mnt/dados um cliente faria da seguinte forma:

debian:~# mount -t nfs 10.20.1.200:/home/Suporte /mnt/dados

Basta consultar com o comando df para ver o diretório montado. Para garantir que a montagem ocorra automaticamente na hora do boot utilizamoso fstab, as opções de fstab para NFS são as seguintes:
hard – tenta fazer a montagem até que seja possível, em caso de não haver no momento do boot conexão com o servidor, o boot da máquina cliente pode não ser concluído.
soft – tenta fazer a montagem se receber mensagem de erro, ele retorna o erro para aplicação responsável e geralmente cancela a montagem.
bg – após uma tentativa de montagem malsucedida, ele vai continuar as tentativas de montagem em background.
intr – permite interromper uma montagem pendente, mas é obsoleta em kernel de 2.6.25 para cima, pois nestes kernels só é possível interromper a montagem utilizando o SIGKILL.

Exemplo de linha de fstab para montar um compartilhamento:
10.20.1.200:/home/Suporte /mnt/dados nfs hard,rw,bg 0 0

Não se esqueça de assinar e divulgar nosso Portal, e esteja atento a nova série de artigos que estaremos lançando em breve sobre outros Linux customizados para servidor de Gateway/Firewall/Serviços.