NFS, ou Network File System, é um protocolo de sistema distribuído de arquivos que permite a montagem de diretórios remotos no seu servidor. Isso permite que você gerencie o espaço de armazenamento em um local diferente e grave nesse espaço a partir de vários clientes. O NFS fornece uma maneira relativamente padronizada e de bom desempenho para acessar sistemas remotos através de uma rede e funciona bem em situações onde os recursos compartilhados precisam ser acessados regularmente.
Neste guia, vamos analisar como instalar os softwares necessários para a funcionalidade NFS no Ubuntu 20.04. Além disso, vamos configurar duas montagens NFS em um servidor e cliente, e montar e desmontar os compartilhamentos remotos.
Usaremos dois servidores neste tutorial, com um deles compartilhando seu sistema de arquivos com o outro. Para acompanhar, você precisará de:
Dois servidores Ubuntu 20.04. Cada um deles deve possuir um usuário não root com privilégios sudo
, um firewall configurado com o UFW e uma rede privada, se estiver disponível para você.
Para ajudar a configurar um usuário não root com privilégios sudo
e um firewall, siga nosso guia Configuração inicial de servidor com o Ubuntu 20.04.
Se estiver usando os Droplets da DigitalOcean para seu servidor e cliente, leia mais sobre a configuração de uma rede privada em nossa documentação sobre Como criar um VPC.
Ao longo deste tutorial, chamaremos o servidor que compartilha seus diretórios de host e o servidor que monta esses diretórios de cliente. Você precisará saber o endereço IP de ambos. Certifique-se de usar o endereço de rede privado, se estiver disponível.
Ao longo deste tutorial, vamos nos referir a esses endereços IP pelos seus espaços reservados host_ip
e client_ip
. Por favor, substitua-os conforme necessário.
Vamos começar instalando os componentes necessários em cada servidor.
No servidor host, instale o pacote nfs-kernel-server
, o qual permitirá que você compartilhe seus diretórios. Como esta é a primeira operação que você está executando com o apt
nesta sessão, atualize seu índice de pacotes local antes da instalação:
- sudo apt update
- sudo apt install nfs-kernel-server
Assim que esses pacotes estiverem instalados, vá para o servidor cliente.
No servidor cliente, precisamos instalar um pacote chamado nfs-common
, que proporciona funcionalidade NFS sem incluir nenhum componente de servidor. Novamente, atualize o índice de pacotes local antes da instalação para garantir que tenha informações atualizadas:
- sudo apt update
- sudo apt install nfs-common
Agora que os dois servidores possuem os pacotes necessários, podemos começar a configurá-los.
Vamos compartilhar dois diretórios separados, com diferentes configurações. Faremos isso para ilustrar duas maneiras importantes com as quais montagens NFS podem ser configuradas em relação ao acesso de superusuário.
Os superusuários podem fazer qualquer coisa no sistema deles. No entanto, os diretórios montados via NFS não fazem parte do sistema no qual eles estão montados. Sendo assim, por padrão, o servidor NFS recusa a executar operações que requerem privilégios de superusuário. Esta restrição padrão significa que os superusuários no cliente não podem gravar arquivos como root, reatribuir a posse, ou executar quaisquer outras tarefas de superusuário na montagem NFS.
Algumas vezes, no entanto, existem usuários confiáveis no sistema cliente que precisam realizar essas ações no sistema de arquivos montado, mas não precisam de acesso de superusuário no host. Você pode configurar o servidor NFS para que permita isso, embora essa ação introduza um elemento de risco, pois esse usuário poderia obter acesso root todo o sistema de host.
No primeiro exemplo, criaremos uma montagem NFS de uso geral que usa o comportamento NFS padrão para dificultar a interação de um usuário com privilégios de root na máquina cliente com o host usando esses privilégios de superusuário do cliente. Você pode usar algo parecido para armazenar arquivos que foram armazenados usando um sistema de gerenciamento de conteúdo ou para criar espaço para os usuários compartilharem arquivos de projeto com facilidade.
Primeiro, crie o diretório de compartilhamento:
- sudo mkdir /var/nfs/general -p
Como estamos criando-o com o sudo
, o diretório é propriedade do usuário root do host:
- ls -la /var/nfs/general
Outputdrwxr-xr-x 2 root root 4096 May 14 18:36 .
O NFS traduzirá toda operação root no cliente para as credenciais nobody:nogroup
como uma medida de segurança. Portanto, precisamos alterar a posse do diretório para que corresponda a essas credenciais.
- sudo chown nobody:nogroup /var/nfs/general
Agora, você está pronto para exportar este diretório.
Em nosso segundo exemplo, o objetivo é tornar os diretórios home armazenados no host disponíveis nos servidores cliente, ao mesmo tempo em que permite administradores confiáveis desses servidores cliente o acesso que eles precisam para gerenciar os usuários de maneira conveniente.
Para fazer isso, vamos exportar o diretório /home
. Como ele já existe, não precisamos criá-lo. Também não vamos alterar as permissões. Se tivéssemos feito isso, uma variedade de problemas poderia ocorrer para qualquer um com um diretório home na máquina de host.
Em seguida, vamos nos aprofundar no arquivo de configuração do NFS para configurar o compartilhamento desses recursos.
Na máquina host, abra o arquivo /etc/exports
em seu editor de texto com privilégios root:
- sudo nano /etc/exports
O arquivo possui comentários mostrando a estrutura geral de cada linha de configuração. A sintaxe é a seguinte:
directory_to_share client(share_option1,...,share_optionN)
Vamos precisar criar uma linha para cada um dos diretórios que planejamos compartilhar. Certifique-se de trocar o espaço reservado client_ip
mostrado pelo seu endereço IP:
/var/nfs/general client_ip(rw,sync,no_subtree_check)
/home client_ip(rw,sync,no_root_squash,no_subtree_check)
Aqui, estamos usando as mesmas opções de configuração para ambos os diretórios, exceto a no_root_squash
. Vamos dar uma olhada no que cada uma dessas opções significa:
rw
: essa opção fornece ao computador do cliente tanto o acesso à leitura quanto gravação no volume.sync
: essa opção obriga o NFS a gravar alterações no disco antes de responder. Isso resulta em um ambiente mais estável e consistente, uma vez que a resposta reflete o estado real do volume remoto. No entanto, isso também reduz a velocidade das operações de arquivos.no_subtree_check
: essa opção impede a verificação de subárvore, que é um processo onde o host deve verificar se o arquivo está de fato disponível na árvore exportada para cada pedido. Isso pode causar muitos problemas quando um arquivo é renomeado enquanto o cliente tem ele aberto. Em quase todos os casos, é melhor desativar a verificação de subárvore.no_root_squash
: por padrão, o NFS traduz as solicitações de um usuário root remotamente como um usuário sem privilégios no servidor. Isso foi usado como medida de segurança para evitar que uma conta root no cliente utilize o sistema de arquivos do host como root. A opção no_root_squash
desativa esse comportamento para certos compartilhamentos.Quando terminar de fazer suas alterações, salve e feche o arquivo. Em seguida, para tornar os compartilhamentos disponíveis nos clientes que você configurou, reinicie o servidor NFS com o seguinte comando:
- sudo systemctl restart nfs-kernel-server
Antes de usar os novos compartilhamentos, no entanto, você precisará garantir que o tráfego neles seja permitido pelas regras de firewall.
Primeiro, vamos verificar o status do firewall para ver se ele está habilitado e, caso esteja, para ver o que está atualmente sendo permitido:
- sudo ufw status
OutputStatus: active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)
Em nosso sistema, apenas o tráfego SSH está sendo permitido. Dessa forma, precisaremos adicionar uma regra para o tráfego NFS.
Para muitos aplicativos, é possível utilizar sudo ufw app list
para habilitá-los pelo nome, mas o nfs
não é um desses casos. No entanto, como o ufw
também verifica o /etc/services
para a porta e o protocolo de um serviço, ainda podemos adicionar o NFS pelo nome. É recomendado que você habilite a regra mais restritiva que ainda permitirá o tráfego que deseja. Dessa forma, ao invés de habilitar o tráfego vindo de qualquer lugar, seremos específicos.
Use o seguinte comando para abrir a porta 2049
no host, certificando-se de colocar seu endereço IP do cliente:
- sudo ufw allow from client_ip to any port nfs
Você pode verificar a mudança digitando:
- sudo ufw status
Você deve ver que o tráfego está sendo permitido da porta 2049
no resultado:
OutputStatus: active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
2049 ALLOW 203.0.113.24
OpenSSH (v6) ALLOW Anywhere (v6)
Isso confirma que o UFW permitirá apenas o tráfego NFS na porta 2049
a partir da nossa máquina cliente.
Agora que o servidor host está configurado e está servindo seus compartilhamentos, vamos preparar nosso cliente.
Para tornar os compartilhamentos remotos disponíveis no cliente, precisamos montar os diretórios que queremos compartilhar no host em diretórios vazios no cliente.
Nota: se houver arquivos e diretórios em seu ponto de montagem, eles se tornarão ocultos assim que você montar o compartilhamento NFS. Para evitar a perda de arquivos importantes, certifique-se de que o diretório esteja vazio, caso esteja montando em um diretório que já exista.
Criaremos dois diretórios para nossas montagens:
- sudo mkdir -p /nfs/general
- sudo mkdir -p /nfs/home
Agora que temos um local para colocar os compartilhamentos remotos e que abrimos o firewall, podemos montar os compartilhamentos usando o endereço IP do nosso servidor host:
- sudo mount host_ip:/var/nfs/general /nfs/general
- sudo mount host_ip:/home /nfs/home
Esses comandos montarão os compartilhamentos do computador host na máquina cliente. Você pode verificar novamente se eles foram montados com sucesso de diversas maneiras. Faça isso com um comando mount
ou findmnt
, mas o df -h
fornece um resultado mais legível:
- df -h
OutputFilesystem Size Used Avail Use% Mounted on
udev 474M 0 474M 0% /dev
tmpfs 99M 936K 98M 1% /run
/dev/vda1 25G 1.8G 23G 8% /
tmpfs 491M 0 491M 0% /dev/shm
tmpfs 5.0M 0 5.0M 0% /run/lock
tmpfs 491M 0 491M 0% /sys/fs/cgroup
/dev/vda15 105M 3.9M 101M 4% /boot/efi
tmpfs 99M 0 99M 0% /run/user/1000
10.132.212.247:/var/nfs/general 25G 1.8G 23G 8% /nfs/general
10.132.212.247:/home 25G 1.8G 23G 8% /nfs/home
Ambos os compartilhamentos que montamos aparecem no final. Como eles foram montados do mesmo sistema de arquivos, eles exibem o mesmo uso de disco. Para ver quanto espaço está sendo efetivamente usado em cada ponto de montagem, utilize o comando de uso de disco du
e o caminho da montagem. O sinalizador -s
fornece um resumo de uso em vez de exibir o uso para cada arquivo. O -h
imprime um resultado que pode ser lido por um humano.
Por exemplo:
- du -sh /nfs/home
Output36K /nfs/home
Isso nos mostra que todo o conteúdo do diretório home está usando apenas 36K do espaço disponível.
Em seguida, vamos testar o acesso aos compartilhamentos, gravando algo em cada um deles.
Primeiro, escreva um arquivo de teste no compartilhamento /var/nfs/general
:
- sudo touch /nfs/general/general.test
Em seguida, verifique quem tem sua posse:
- ls -l /nfs/general/general.test
Output-rw-r--r-- 1 nobody nogroup 0 Aug 1 13:31 /nfs/general/general.test
Como montamos esse volume sem alterar o comportamento padrão do NFS e criamos o arquivo como o usuário root da máquina cliente pelo comando sudo
, o proprietário padrão do arquivo fica o nobody:nogroup
. Os superusuários do cliente não poderão realizar ações administrativas típicas, como a alteração do proprietário de um arquivo ou a criação de um novo diretório para um grupo de usuários, neste compartilhamento montado em NFS.
Para comparar as permissões do exemplo de uso geral com o compartilhamento de diretórios home, crie um arquivo em /nfs/home
da mesma forma:
- sudo touch /nfs/home/home.test
Em seguida, confira quem é o proprietário do arquivo:
- ls -l /nfs/home/home.test
Output-rw-r--r-- 1 root root 0 Aug 1 13:32 /nfs/home/home.test
Criamos o home.test
como root usando o comando sudo
, exatamente da mesma forma que criamos o arquivo general.test
. No entanto, neste caso, ele é propriedade de root. Isso acontece pois sobrescrevemos o comportamento padrão quando especificamos a opção no_root_squash
nesta montagem. Isso permite que nossos usuários root na máquina cliente ajam como root, tornando o gerenciamento de contas de usuário muito mais conveniente. Ao mesmo tempo, isso significa que não precisamos dar acesso de root a esses usuários no host.
Podemos montar os compartilhamentos NFS remotos automaticamente na inicialização adicionando-os ao /etc/fstab
no cliente.
Abra este arquivo com privilégios root em seu editor de texto:
- sudo nano /etc/fstab
No final do arquivo, adicione uma linha para cada um de nossos compartilhamentos. Elas se parecerão com isto:
. . .
host_ip:/var/nfs/general /nfs/general nfs auto,nofail,noatime,nolock,intr,tcp,actimeo=1800 0 0
host_ip:/home /nfs/home nfs auto,nofail,noatime,nolock,intr,tcp,actimeo=1800 0 0
Nota: você pode encontrar mais informações sobre as opções que estamos especificando aqui na página man do NFS. Você pode acessá-la executando o seguinte comando:
- man nfs
O cliente irá montar automaticamente as partições remotas na inicialização do sistema, embora possa levar algum tempo para estabelecer a conexão e para que os compartilhamentos fiquem disponíveis.
Se não quiser mais que o diretório remoto esteja montado em seu sistema, você pode desmontá-lo saindo da estrutura de diretórios do compartilhamento e desmontando, desta forma:
- cd ~
- sudo umount /nfs/home
- sudo umount /nfs/general
Observe que o comando é chamado de umount
não unmount
, como é o esperado.
Isso removerá os compartilhamentos remotos, deixando acessível apenas seu armazenamento local:
- df -h
OutputFilesystem Size Used Avail Use% Mounted on
udev 474M 0 474M 0% /dev
tmpfs 99M 936K 98M 1% /run
/dev/vda1 25G 1.8G 23G 8% /
tmpfs 491M 0 491M 0% /dev/shm
tmpfs 5.0M 0 5.0M 0% /run/lock
tmpfs 491M 0 491M 0% /sys/fs/cgroup
/dev/vda15 105M 3.9M 101M 4% /boot/efi
tmpfs 99M 0 99M 0% /run/user/1000
Se também quiser evitar que eles sejam remontados na próxima reinicialização do sistema, edite o /etc/fstab
e, em seguida, exclua a linha ou transforme-a em comentário colocando um caractere #
no início da linha. Você também pode evitar a montagem automática removendo a opção auto
, que permitirá que você ainda a monte tudo manualmente.
Neste tutorial, criamos um host NFS e demonstramos alguns comportamentos NFS importantes. Fizemos isso criando duas montagens NFS diferentes, que compartilhamos com um cliente NFS.
Se você quiser implementar o NFS na produção, é importante observar que o protocolo em si não é criptografado. Em casos onde você está compartilhando de uma rede privada, isso pode não ser um problema. Em outros casos, uma VPN ou algum outro tipo de túnel criptografado será necessário para proteger seus dados.
Thanks for learning with the DigitalOcean Community. Check out our offerings for compute, storage, networking, and managed databases.
This textbox defaults to using Markdown to format your answer.
You can type !ref in this text area to quickly search our full set of tutorials, documentation & marketplace offerings and insert the link!