O NFS (Network File System) é um sistema de arquivos distribuídos utilizado para compartilhar arquivos e diretórios entre computadores conectados em rede, formando assim um diretório virtual. Para que os clientes tenham acesso aos arquivos, é feita uma requisição ao servidor que, dependendo das permissões do cliente, responde confirmando a requisição. A partir desse ponto a hierarquia de diretórios e arquivos remotos passa a fazer parte do sistema de arquivos local da máquina.
O RPC (Remote Procedure Call) é um padrão Unix para serviços remotos, sendo o NFS um desses serviços. Eles registram-se em um diretório conhecido como portmapper. Um cliente querendo realizar uma consulta NFS primeiro consulta o portmapper (na porta 111, seja TCP ou UDP), e pergunta pelo servidor NFS; a resposta geralmente vem pela porta 2049 (a padrão para o NFS).
Primeiramente, deve-se ter certeza que o Kernel tem suporte a NFS e que os serviços estejam funcionando em ambos os computadores, o que é possível através do comando:
$ cat /proc/filesystems | grep nfs
Se aparecer algo como “nodev nfs”, o kernel tem suporte. A instalação se dá através do seguinte comando:
$ sudo apt-get install nfs-kernel-server
Agora deverá ser realizada a configuração do serviço no servidor. Para isso, edite o arquivo “/etc/exports” incluindo uma linha com a sintaxe “diretorio_a_ser_liberado host(permissao)”. Por exemplo, pode-se dar permissão de leitura (r) e escrita (w) do diretório /dados/teste_nfs para o host 192.168.0.12 da seguinte forma:
/dados/teste_nfs 192.168.0.12(rw,sync,root_squash,no_subtree_check)
As outras opções estão relacionadas à sincronicidade e permissões – veja mais detalhes no final do post. Caso a liberação seja para qualquer computador, utiliza-se asterisco (*) no lugar do host.
Depois de configurado, reinicie o servidor NFS através do comando:
$ sudo service nfs-kernel-server restart
Ou também exporte através do seguinte comando (sem reiniciar):
$ exportfs -av
No computador cliente, para montar um diretório liberado do servidor, uma maneira é utilizar o seguinte comando (especificando o host, diretorio_a_ser_montado e diretorio_destino):
$ sudo mount -t nfs host:diretorio_a_ser_montado diretorio_destino
O servidor irá verificar se a máquina tem permissão para acessar os dados daquele diretório, caso tenha, e isto deve estar especificado no arquivo “/etc/exports” do servidor, retorna um descritor de arquivos. Quando é acessado o NFS, o kernel envia uma chamada RPC ao servidor nfsd na máquina servidora, nesta são enviados os parâmetros, descritor de arquivos, o nome do arquivo, o identificador de usuário e grupo, usados para controle. As funcionalidades do NFS no Linux são implementadas em nível kernel, o VFS (sistema de arquivo virtual) é integrado no kernel.
Uma outra maneira de montar um compartilhamento NFS de uma outra máquina é adicionar uma linha ao arquivo “/etc/fstab” no computador cliente com a seguinte sintaxe (veja o exemplo abaixo):
host:diretorio_a_ser_montado diretorio_destino nfs opções verificação 192.168.0.112:/dados/teste_nfs/ /home/user/teste_nfs/ nfs rw,vers=3,nointr,lock,hard,proto=tcp,rsize=524288,wsize=524288 0 0
Depois de salvar o arquivo, digite o comando “mount diretorio_destino” no computador cliente e o ponto de montagem será montado pelo servidor (ou digite “mount -a” para montar tudo o que está na tabela de partições do fstab). A vantagem desse método é que, se o computador reiniciar, a montagem se dará automaticamente (caso não tenha configurado o contrário). Veja mais sobre o fstab no final do post Particionamento de disco e inicialização de sistema e sobre as opções no artigo abaixo do LNCC.
Importante: o UID e o GID do usuário do servidor deve ser o mesmo do usuário da máquina cliente. Para visualizar esses números, abra o arquivo “/etc/passwd” e para alterar são os seguintes comandos:
$ sudo usermod -u <NOVOUID> <NOMEUSUÁRIO> $ sudo usermod -g <NOVOGID> <NOMEUSUÁRIO>
Veja um exemplo de como incluir um novo diretório compartilhado em uma servidora de disco (pc_hd) em uma máquina virtual servidora de web e ftp (pc_web) com tudo já instalado configurado:
- Criar diretório no pc_hd; mudar usuário e permissões de acesso se for o caso
- Criar diretório no pc_web; mudar usuário e permissões de acesso se for o caso
- Incluir no “/etc/fstab” do pc_web: ip_pc_hd:/path_pc_hd/ftp/dir_compartilhado /path_pc_web/ftp/dir_compartilhado nfs rw,vers=3,nointr,lock,hard,proto=tcp,rsize=524288,wsize=524288 0 0
- Incluir diretório na lista “/etc/exports” do pc_hd dos que serão exportados (incluir porta se for o caso, copiar o comando na mesma linha para compartilhar a mesma pasta se mais IPs): /path_pc_hd/ftp/dir_compartilhado ip_pc_web/porta(rw,sync,root_squash,no_subtree_check)
- Exportar do pc_hd: exportfs -av
- Montar diretório no pc_web: mount -a
Caso apareça um erro do tipo “Stale file handle” ao manipular um diretório montado remotamente (estando no computador cliente), ele indica que o compartilhamento NFS não pode ser montado por ter mudado alguma coisa desde a última configuração conhecida. Para restabelecer a normalidade, reinicie o serviço no servidor (service nfs-kernel-server restart), e no computador cliente, force a desmontagem desse diretório (umount -f /caminho/nome_do_diretorio) e remonte (mount /caminho/nome_do_diretorio).
Dica: monitore I/O e outros parâmetros instalando o programa “apt-get install sysstat” e usando o comando “iostat número_de_segundos”.
Fontes
- MagusCode
- Documentação Debian
- Conectiva Linux