19.6. NFS

Reorganizado e aumentado por Tom Rhodes. Escrito por Bill Swingle.

Dentre os diversos sistemas de arquivos suportados pelo FreeBSD está o Sistema de Arquivo em Rede (Network File System), também conhecido como NFS. O NFS permite que um sistema compartilhe seus diretórios e arquivos com outros sistemas através de uma rede. Usando NFS, os usuários e programas podem acessar arquivos em sistemas remotos quase como se fossem arquivos locais.

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

19.6.1. Como o NFS Funciona

O NFS consiste de, pelo menos, duas partes principais: um servidor e um ou mais clientes. O cliente acessa remotamente os dados armazenados na máquina servidora. Para que isto funcione direito, alguns poucos processos precisam estar configurados e rodando:

Nota: No FreeBSD 5.X, o utilitário portmap foi substituído pelo utilitário rpcbind. Assim, no FreeBSD 5.X é preciso que o usuário substitua cada instância do portmap pelo rpcbind nos exemplos a seguir.

O servidor precisa ter rodando os seguintes daemons:

Daemon Descrição
nfsd O daemon NFS, que atende requisições dos clientes NFS.
mountd O daemon de montagem NFS, que executa as solicitações que o nfsd(8) lhe passa.
portmap O daemon portmapper permite que clientes NFS descubram qual porta o servidor NFS está utilizando.

O cliente também pode rodar um daemon, conhecido como nfsiod. O daemon nfsiod atende às solicitações do servidor NFS. Isto é opcional e aumenta o desempenho, mas não é requerido para a operação normal e correta. Veja a página de manual nfsiod(8) para mais informações.

19.6.2. Configurando o NFS

A configuração do NFS é um processo relativamente claro e direto. Os processos que precisam estar rodando podem todos ser ativados no momento da inicialização do sistema, com poucas modificações no seu arquivo /etc/rc.conf.

No servidor NFS, certifique-se de que as seguintes opções estão configuradas no arquivo /etc/rc.conf:

portmap_enable="YES"
nfs_server_enable="YES"
mountd_flags="-r"

O mountd é automaticamente executado quando o servidor NFS é ativado.

No cliente, certifique-se de que esta opção está presente no /etc/rc.conf:

nfs_client_enable="YES"

O arquivo /etc/exports especifica quais sistemas de arquivos o NFS deve exportar (às vezes chamados de ``compartilhamentos''). Cada linha no /etc/exports determina um sistema de arquivo a ser exportado e quais máquinas têm acesso àquele sistema de arquivo. Junto com quais máquinas têm acesso ao sistema de arquivos, opções de acesso também podem ser especificadas. Existem muitas opções que podem ser usadas neste arquivo, mas somente umas poucas serão mencionadas aqui. Você pode facilmente descobrir outras opções lendo a página de manual exports(5).

Aqui estão uns poucos exemplos de entradas no /etc/exports:

Os seguintes exemplos dão uma idéia de como exportar sistemas de arquivos, ainda que os parâmetros possam ser diferentes, dependendo do seu ambiente e das configurações de rede. Por exemplo, para exportar o diretório /cdrom para três máquinas de exemplo, que possuem o mesmo nome de domínio que o servidor (por conseguinte a ausência do nome de domínio em cada uma) ou possuem entradas no seu arquivo /etc/hosts. O parâmetro -ro torna o sistema de arquivo exportado somente-para-leitura (read-only). Com este parâmetro, o sistema remoto não será capaz de gravar quaisquer mudanças no sistema de arquivo exportado.

/cdrom -ro host1 host2 host3

A linha abaixo exporta o /home para três sistemas através de seus endereços IP. Esta é uma configuração útil, se você tem uma rede privada, sem servidor DNS configurado. Opcionalmente, o arquivo /etc/hosts poderia ser configurado para nomear os sistemas internos; por favor reveja hosts(5) para maiores informações. O parâmetro -alldirs permite que os subdiretórios sejam pontos de montagem. Em outras palavras, não vai montar os subdiretórios, mas vai permitir que o cliente monte somente os diretórios que são requeridos os necessários.

/home  -alldirs 10.0.0.2 10.0.0.3 10.0.0.4

A seguinte linha exporta /a de forma que dois clientes de diferentes domínios acessem o sistema de arquivos. O parâmetro -maproot=root permite que o usuário root do sistema remoto grave dados no sistema de arquivos exportado como root. Se o parâmetro -maproot=root não for especificado, então, mesmo que um usuário tenha acesso de root no sistema remoto, ele não será capaz de modificar arquivos no sistema de arquivos exportado.

/a  -maproot=root host.exemplo.com box.exemplo.org

Para que um cliente tenha acesso a um sistema de arquivos exportado, o cliente precisa ter permissão para tal. Certifique-se de que o cliente está listado no seu arquivo /etc/exports.

No /etc/exports, cada linha representa a informação de exportação para um sistema de arquivo para um sistema. Um sistema remoto pode ser especificado somente uma vez por sistema de arquivo, e pode ter somente uma entrada padrão. Por exemplo, assuma que /usr é um único sistema de arquivo. O /etc/exports abaixo seria inválido:

/usr/src   cliente
/usr/ports cliente

Um sistema de arquivo, /usr, tem duas linhas especificando exportações para o mesmo sistema, cliente. O formato correto para esta situação é:

/usr/src /usr/ports cliente

As propriedades de um sistema de arquivo exportado para um dado sistema precisa estar em uma mesma linha. Linhas sem um cliente especificado são tratadas como um único sistema. Isto limita como você pode exportar sistemas de arquivos, mas para a maioria das pessoas isto não é um problema.

Abaixo segue um exemplo de uma lista de exportação válida, onde /usr e /exports são sistemas de arquivos locais:

# Exporte src e ports ao cliente01 e cliente02, mas somente o 
# cliente01 tem privilégios de root nele
/usr/src /usr/ports -maproot=root    cliente01
/usr/src /usr/ports        cliente02
# As máquinas cliente possuem acesso de root e podem montar em
# qualquer lugar de /exports.  Qualquer um no mundo pode montar /exports/obj somente-leitura.
/exports -alldirs -maproot=root      cliente01 cliente02
/exports/obj -ro

Você precisa reiniciar o mountd todas as vezes que modificar o /etc/exports de forma que as mudanças tenham efeito. Isto pode ser executado enviando o sinal HUP ao processo mountd:

# kill -HUP `cat /var/run/mountd.pid`

Alternativamente, uma reinicialização (reboot) fará o FreeBSD configurar tudo corretamente. Entretanto, uma reinicialização não é necessária. Executando o seguinte comando como root deverá ativar tudo.

No servidor NFS:

# portmap
# nfsd -u -t -n 4
# mountd -r

No cliente NFS:

# nfsiod -n 4

Agora tudo deve estar pronto para, na prática, montar um sistema de arquivo remoto. Nestes exemplos, o nome do servidor será server e o nome do cliente será client. Se você quer somente montar temporariamente um sistema de arquivo ou prefere testar a configuração, apenas execute um comando como este como root no cliente:

# mount server:/home /mnt

Isto irá montar o diretório /home do servidor em /mnt no cliente. Se tudo estiver configurado corretamente, você deve ser capaz de entrar no /mnt no cliente e ver todos os arquivos que estão no servidor.

Se você quer montar automaticamente um sistema de arquivo remoto cada vez que o computador iniciar, adicione o sistema de arquivos no arquivo /etc/fstab. Eis um exemplo:

server:/home   /mnt    nfs rw  0   0

A página de manual fstab(5) lista todas as opções disponíveis.

19.6.3. Usos Práticos

O NFS tem muitos usos práticos. Alguns dos usos mais comuns estão listados abaixo:

19.6.4. Montagens Automáticas com amd

Contribuído por Wylie Stilwell. Reescrito por Chern Lee.

O daemon de automontagem, amd(8) (automatic mounter daemon), monta automaticamente um sistema de arquivo remoto todas as vezes que um arquivo ou diretório naquele sistema de arquivo é acessado. Sistemas de arquivos que ficam inativos por um período de tempo também serão automaticamente desmontados pelo amd. Usar o amd é uma alternativa para montagens permanentes, uma vez que as montagens permanentes geralmente estão listadas no /etc/fstab.

O amd opera anexando-se como um servidor NFS aos diretórios /host e /net. Quando um arquivo é acessado dentro destes diretórios, o amd procura pelo ponto de montagem remoto correspondente e o monta automaticamente. O /net é usado para montar um sistema de arquivo exportado de um endereço IP, enquanto o /host é usado para montar uma exportação de um nome de sistema remoto.

Um acesso a um arquivo dentro de /host/foobar/usr diria ao amd para tentar montar a exportação /usr no sistema foobar.

Exemplo 19-1. Montando uma Exportação com amd

Você pode ver as montagens disponíveis de um sistema remoto com o comando showmount. Por exemplo, para ver as montagens de um sistema chamado foobar, você pode usar:

% showmount -e foobar
Exports list on foobar:
/usr                   10.10.10.0
/a               10.10.10.0
% cd /host/foobar/usr

Como visto no exemplo, o showmount mostra /usr como uma exportação. Quando trocar de diretórios para /host/foobar/usr, o amd tenta resolver o nome do sistema foobar e automaticamente monta a exportação desejada.

O amd pode ser iniciado pelos scripts de inicialização colocando as seguintes linhas no /etc/rc.conf:

amd_enable="YES"

Adicionalmente, parâmetros personalizados podem ser passados ao amd pela opção amd_flags. Por padrão, o amd_flags é ajustado para:

amd_flags="-a /.amd_mnt -l syslog /host /etc/amd.map /net /etc/amd.map"

O arquivo /etc/amd.map define as opções padrão com as quais as exportações serão montadas. O arquivo /etc/amd.conf define algumas das características mais avançadas do amd.

Consulte as páginas de manual amd(8) e amd.conf(5) para maiores informações.

19.6.5. Problemas na Integração com Outros Sistemas

Contribuído por John Lind.

Certos adaptadores Ethernet para sistemas PC ISA possuem limitações que podem causar sérios problemas de rede, particularmente com NFS. Esta dificuldade não é específica do FreeBSD, mas sistemas FreeBSD são afetados por ela.

O problema quase sempre ocorre quando sistemas PC (FreeBSD) são conectados em rede com estações de trabalho de alto desempenho com as feitas pela Silicon Graphics, Inc., e Sun Microsystems, Inc. As montagens NFS funcionarão bem, e algumas operações podem ser bem sucedidas, mas repentinamente, o servidor vai parecer não mais responder ao cliente, mesmo que as solicitações de e para outros sistemas continuem a ser processadas. Isto acontece ao sistema cliente, se o cliente for o sistema FreeBSD ou a estação de trabalho. Em muitos sistemas, não há forma de parar o sistema elegantemente, uma vez que este problema se manifestou. A única solução é, freqüentemente, reinicializar o cliente, porque a situação do NFS não pode ser resolvida.

Apesar da solução ``correta'' ser a de obter um adaptador de maior desempenho e capacidade para o sistema FreeBSD, há um contorno simples que vai permitir a operação satisfatória. Se o sistema FreeBSD for o servidor, inclua a opção -w=1024 na montagem a partir do cliente. Se o sistema FreeBSD é o cliente, então monte o sistema de arquivo NFS com a opção -r=1024. Estas opções podem ser especificadas usando o quarto campo da entrada fstab no cliente para montagens automáticas, ou, usando o parâmetro -o do comando mount para montagens manuais.

Deve ser observado que há um problema diferente, algumas vezes confundido com este, quando os servidores e clientes NFS estão em redes diferentes. Se for este o caso, esteja certo de que seus roteadores estão roteando a informação UDP necessária, ou você não vai chegar a lugar algum, não importando o que mais você estiver fazendo.

Nos seguintes exemplos, fastws é o nome do sistema (interface) de uma estação de trabalho de alto desempenho, e freebox é o nome do sistema (interface) de um sistema FreeBSD com um adaptador Ethernet de baixo desempenho. Também, /sharedfs será o sistema de arquivo NFS exportado (veja exports(5)), e /project será o ponto de montagem no cliente para o sistema exportado. Em todos os casos, note que opções adicionais, como hard ou soft e bg podem ser desejáveis em sua aplicação.

Exemplos para o sistema FreeBSD (freebox) como sendo o cliente no /etc/fstab de freebox:

fastws:/sharedfs /project nfs rw,-r=1024 0 0

Como um comando para montagem manual em freebox:

# mount -t nfs -o -r=1024 fastws:/sharedfs /project

Exemplos para o sistema FreeBSD como o servidor no /etc/fstab em fastws:

freebox:/sharedfs /project nfs rw,-w=1024 0 0

Como comando para montagem manual em fastws:

# mount -t nfs -o -w=1024 freebox:/sharedfs /project

Quase qualquer adaptador Ethernet permitirá operação sem as restrições acima no tamanho de leitura ou escrita.

Para qualquer um que se importe, aqui está o que acontece quando a falha ocorre, o que também explica porque é irrecuperável. O NFS trabalha tipicamente com um tamanho de ``bloco'' de 8 k (apesar de que pode criar fragmentos de tamanhos menores). Uma vez que o tamanho máximo do quadro Ethernet é em torno de 1500 bytes, o ``bloco'' NFS é dividido em múltiplos quadros Ethernet, mesmo que ainda seja uma única unidade para o código de nível superior, e precisa ser recebido, montado e confirmado (acknowledged) como uma unidade. As estações de alto desempenho podem bombear os pacotes que compõem a unidade NFS para fora, um após o outro, tão próximos quanto permitido pelo padrão. Nas interfaces menores, de baixa capacidade, os últimos pacotes ultrapassam os primeiros pacotes da mesma unidade antes que possam ser reconstruídos ou confirmados. Como resultado, a estação de trabalho vai expirar e tentar novamente, mas tentará novamente com a unidade de 8 K inteira, e o processo se repetirá, ao infinito.

Mantendo o tamanho da unidade menor que a limitação do tamanho do quadro Ethernet, garantimos que qualquer quadro Ethernet completo recebido pode ser confirmado individualmente, evitando a situação de congelamento (deadlock).

Ultrapassagens ainda poderão ocorrer quando uma estações de alto desempenho estiverem golpeando dados para um sistema PC, mas com placas melhores, tais ultrapassagens não são garantidas nas ``unidades'' NFS. Quando uma ultrapassagem acontecer, as unidades afetadas serão retransmitidas, e haverá uma boa chance de que serão recebidas, montadas e confirmadas.

Este, e outros documentos, podem ser obtidos em ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/.

Para perguntas sobre FreeBSD, leia a documentação antes de contatar <questions@FreeBSD.org>.
Para perguntas sobre esta documentação, envie e-mail para <doc@FreeBSD.org>.