NFS : Network File System

NFS – Network File System

Introdução

Em uma rede, sempre é desejável ter um servidor para compartilhar arquivos pois é basicamente através dos arquivos que usuários e máquinas trocam informações pela rede.
Quando se trata de compartilhamento de arquivos em ambientes mistos (Linux e Windows, por exemplo), geralmente a escolha é utilizar o Samba, e costuma-se utilizar o NFS – Network File System para compartilhar arquivos em ambientes Linux.
O NFS foi desenvolvido para permitir uma máquina compartilhar seus arquivos e diretórios com outros sistemas através da rede. Dessa forma, os usuários e programas podem acessar arquivos em sistemas remotos como se fossem arquivos locais.

Configuração do Servidor

Para instalar o NFS no Debian, são necessários os pacotes listados no comando abaixo:
# apt-get install nfs-kernel-server nfs-common portmap
Onde:
  • nfs-kernel-server – Responsável por iniciar o serviço NFS.
  • nfs-common – utilitários e arquivos comuns ao lado servidor e cliente do NFS.
  • portmapDaemon de porta dinâmica para serviços RPC – Remote Procedure Call – é um protocolo que permite a um host utilizar uma função localizada em um outro host remoto.
Algumas informações adicionais sobre o portmap. Ele permite a troca de mensagens, na qual a origem (cliente) envia parâmetros a um servidor e fica esperando um retorno, que fornecerá o resultado da função remota.
Por padrão, portmap escuta na porta 111/tcp, onde a conexão inicial é feita; em seguida ele negocia negocia um intervalo de portas TCP (geralmente acima de 1024) que será utilizada para transferências posteriores de dados; deve ser executado tanto no lado servidor como cliente.
Após realizar a instalação, para compartilhar diretórios através da rede, é necessário editar o arquivo /etc/exports. Ao configurar o arquivo, tenha em mente as seguintes regras:
  1. Apenas exporte diretórios abaixo do /.
  2. Não exporte um subdiretório de um diretório que já foi exportado, exceto se o subdiretório reside em uma partição diferente.
  3. Exporte apenas sistemas de arquivos locais.

Arquivo /etc/exports

O arquivo /etc/exports atua como lista de controle de acesso para sistemas de arquivos que podem ser exportados para clientes NFS e possui a seguinte estrutura:
<diretório a ser exportado> host(opções)
Por padrão, definimos o diretório a ser compartilhado e depois quais hosts poderão acessar esse diretório, podendo ainda utilizar as seguintes opções:
  • ro – compartilhar apenas para leitura (read only)
  • rw – compartilhar para leitura e gravação (read write)
  • root_squash – Opção padrão, proíbe o root ter acesso privilegiado no compartilhamento, isto é, o root será um usuário com privilégios limitados.
  • no_root_squash – Contrário da opção acima, root é utilizado com todos seus privilégios.
  • async – Permite que o NFS transfira arquivos de forma assíncrona, sem precisar esperar pela resposta do cliente a cada pacote enviado. Essa opção aumenta um pouco a velocidade de transferência de dados, porém aumenta a possibilidade de perda destes em caso de queda de conexão.
  • sync – Mais lento em relação à opção async, garante que os dados do arquivo em cache na memória é automaticamente gravado em disco após a conclusão da transferência dos mesmos.
  • subtree_check – Utilizado quando um subdiretório do sistema de arquivo local é exportado, mas os demais não. Com essa opção, o NFS verifica se cada requisição do cliente é para um arquivo que está na área exportada ou não. Porém, se o arquivo for renomeado ou movido de lugar, essa opção pode causar perda de desempenho no acesso dos clientes. Utilize essa opção se você precisa ter certeza de que ninguém pode acessar arquivos fora da parte exportada de um sistema de arquivos local. De preferência, crie partições de modo a exportar o sistema de arquivos inteiros. A opção padrão utilizada no NFS é no_subtree_check.
Para conhecer mais opções do arquivo, consulte a página do manual:
# man 5 exports
Agora que já conhecemos o arquivo de configuração, apresento aqui um cenário para demonstrar exemplo de uso do NFS.

Cenário

Pequena empresa que possui um servidor Linux que concentra os arquivos dos usuários e que já está chegando ao seu limite de espaço em disco. Foi adquirido um novo servidor com maior capacidade de armazenamento.
O esquema de particionamento para o compartilhamento de arquivos será da seguinte forma:
  • /data/backup – diretório de backup
  • /data/homolog – arquivos de homologação que os programadores disponibilizam para os clientes realizarem seus testes
  • /data/reports – contém relatórios que os usuários baixam para análise
  • /home – home dos usuários
Permissões de acesso aos diretórios compartilhados:
  • /data/backup – Acesso de leitura e escrita somente para a máquina 192.168.0.254
  • /data/homolog – Acesso de leitura e escrita para máquinas que estão no domínio nixi.org
  • /data/reports – Acesso somente de leitura para a rede 192.168.0/24
  • /home – Acesso de leitura e escrita para todas máquinas que estão na rede 192.168.0.0/24
Agora vamos inserir as informações no arquivo /etc/exports:
# vim /etc/exports
/data/backup    192.168.0.254(rw,sync,no_subtree_check)
/data/homolog    *.nixi.org(rw,sync,no_subtree_check)
/data/reports    192.168.0.0/24(ro,async,no_subtree_check)
/home        192.168.0.0/24(rw,sync,no_subtree_check)
Após realizar as configurações, é necessário iniciar o serviço na seguinte ordem:
  1. portmap – Primeiro a ser iniciado porque o NFS não possui uma porta padrão e será ele que irá receber as solicitações dos clientes e redirecioná-las.
  2. nfs-kernel-server – Serviço NFS
Iniciando o serviço:
# /etc/init.d/portmap stop
# /etc/init.d/portmap start
# /etc/init.d/nfs-kernel-server stop
# /etc/init.d/nfs-kernel-server start
Checando se o serviço subiu corretamente:
# rpcinfo -p localhost
program vers proto   port
100000    2   tcp    111  portmapper
100024    1   udp  59202  status
100024    1   tcp  56870  status
100000    2   udp    111  portmapper
100021    1   udp  54393  nlockmgr
100021    3   udp  54393  nlockmgr
100021    4   udp  54393  nlockmgr
100021    1   tcp  60789  nlockmgr
100021    3   tcp  60789  nlockmgr
100021    4   tcp  60789  nlockmgr
100003    2   tcp   2049  nfs
100003    3   tcp   2049  nfs
100003    4   tcp   2049  nfs
100003    2   udp   2049  nfs
100003    3   udp   2049  nfs
100003    4   udp   2049  nfs
Nota: O portmap O NFS é registrado através do portmap com o código 100003. Para mais informações sobre códigos que o portmap utiliza, consultar:
# cat /etc/rpc
# man 5 rpc
Com o serviço no ar, criar os diretórios que serão exportados para o cliente:
# mkdir -p /data/{backup,homolog,reports}

Configuração do Cliente

A configuração do cliente, é feita através da instalação do pacote nfs-common:
# apt-get install nfs-common
Após instalar, checar os diretórios compartilhados no servidor:
# showmount -e 192.168.0.104
Export list for 192.168.0.104:
/data/homolog *.nixi.org
/home         192.168.0.0/24
/data/reports 192.168.0.0/24
/data/backup  192.168.0.254
Vamos criar os pontos de montagem dos diretórios no cliente:
# mkdir -p /srv/nfs/{homolog,reports,home,backup}
Montando o diretório compartilhado:
# mount -t nfs 192.168.0.104:/data/homolog /srv/nfs/homolog
Checando o compartilhamento montado:
# showmount -a 192.168.0.104
All mount points on 192.168.0.104:
192.168.0.103:/data/homolog
Também podemos usar o comando mount para visualizar os pontos de montagem:
# mount
192.168.0.104:/data/homolog on /srv/nfs/homolog type nfs (rw,addr=192.168.0.104)
Acima, montamos o compartilhamento via linha de comando. Porém, ao reiniciar a máquina, essa configuração será perdida, o que não é ideal para o nosso cenário.
Para que diretórios remotos fiquem disponíveis no boot, é necessário editar o arquivo /etc/fstab e inserir as seguintes entradas:
# vim /etc/fstab
192.168.0.104:/data/homolog /srv/nfs/homolog  nfs defaults  0 0
192.168.0.104:/home /srv/nfs/home  nfs defaults  0 0
192.168.0.104:/data/reports /srv/nfs/reports  nfs defaults  0 0
192.168.0.104:/data/backup /srv/nfs/backup  nfs defaults  0 0
Lembrando que no cenário, o diretório /data/backup deverá ser montado somente pela máquina com IP 192.168.0.254, conforme definido no arquivo /etc/exports do servidor.

Comandos interesssantes

O comando exportfs é usado para manter a tabela dos sistemas de arquivos exportados via NFS. Essa tabela é armazenada no arquivo /var/lib/nfs/etab que é lido pelo daemon mountd quando um cliente solicita acesso para montar o sistema de arquivos exportado.
Algumas opções:
✔ Exportar todos os diretórios compartilhados – ao acrescentar novo diretório, não é necessário reiniciar o serviço NFS, basta utilizar o comando abaixo:
# exportfs -a -r
✔ Remover um compartilhamento sem parar o NFS:
# exportfs -u *:/mnt/public
O comando nfsstat exibe várias informações de estatística sobre o NFS.
✔ Processos do servidor NFS:
# nfsstat -s
✔ Operações relativas à cliente:
# nfsstat -c
O comando netstat também pode produzir estatísticas de rede, que podem ser utilizadas para verificar se há pacotes perdidos, fragmentos e outras coisas que podem afetar o desempenho do NFS na rede:
# netstat -s
Para conhecer mais sobre os comandos mencionados:
# man exportfs
# man nfsstat
# man netstat

Conclusão

Bem, esse post foi resultado de muitas leituras e anotações que fiz ao montar um servidor NFS, onde foi possível relembrar e aprender mais sobre esse serviço.
Entre os benefícios que o NFS oferece, podemos destacar:
  • Estações locais usam menos espaço em disco porque dados frequentemente 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 pois podem podem ser configurados no servidor NFS e serem disponibilizados através da rede.
O cenário utilizado foi para uma pequena empresa que buscou uma alternativa mais em conta para criar seu servidor de arquivos, porém existem outras soluções como NAS – Network-Attached Server. Ter um servidor de arquivos dedicado oferecem vantagens como fácil administração, melhores recursos de backup e verificação.
Mas ao escolher uma solução, sempre levar em conta o ambiente e a necessidade do serviço. Alguns exemplos de servidores de arquivos dedicados:
Nesse post, não entrei na parte de segurança do NFS, porém como outros serviços, esse é um item que deve ser observado. Na web encontramos diversos materiais sobre como fazer isso, porém selecionei alguns que podem servir como ponto de partida:
É isso aí, até o próximo post !

Referências

Manual Completo do Linux (Guia do Administrador)
Autor: Evi Nemeth, Garth Snyder, Trent R. Hein – Editora: Pearson Books
Projeto NFS
http://nfs.sourceforge.net/
Quick HOWTO : Ch29 : Remote Disk Access with NFS
http://www.linuxhomenetworking.com/wiki/index.php/Quick_HOWTO_:_Ch29_:_Remote_Disk_Access_with_NFS
http://www.linuxinfor.com/portuguese/NFS/nfs.howto.pt_BR-636.html
Close Menu