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.
- portmap – Daemon 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:
- Apenas exporte diretórios abaixo do /.
- 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.
- 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:
- 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.
- 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
Social