Tópicos avançados do NFS

Danise Víctor Xavier

Departamento de Informática

Universidade Federal de Pernambuco

e-mail: dvx@di.ufpe.br

Recife, 30 de maio de 1996

 

1. Introdução

O NFS (Network File System) é um sistema de arquivo distribuído que provê acesso transparente a discos remotos. Este serviço permite centralizar a administração dos discos, assim como o NIS permite a administração centralizada das informações dos usuários e dos hosts.

Ao invés de duplicação de diretórios comuns como o /usr/local em cada sistema, o NFS oferece compartilhamento de uma única cópia do diretório entre todos os sistemas da rede.

Na visão do usuário, a utilização do NFS significa não ter que se logar em cada sistema para acessar os arquivos. Eles não precisam utilizar o comando rcp ou fitas para transferir arquivos entre sistemas locais. O NFS garante que os arquivos necessários aos usuários são acessíveis de qualquer host da rede.

O NFS é construído sobre um protocolo RPC e impõe o relacionamento cliente/servidor aos hosts que o utilizam. Um servidor NFS é um host que possui um ou mais sistemas de arquivos e os torna disponível pela rede. O cliente NFS monta estes sistemas de arquivos de um ou mais servidores. Um cliente NFS pode ser uma máquina diskless. E este é provavelmente o maior problema que o NFS encontra, pois não é trivial disponibilizar uma máquina sem qualquer recurso local como sendo um membro de uma rede funcionando completamente bem, além da integração desta máquina com outros servidores como o do NIS. Informações de como configurar, inicializar e gerenciar um cliente diskless podem ser vistas em [2].

Existem dois aspectos para a administração de sistemas utilizar o NFS: primeiramente escolher um esquema de nomes para os sistemas de arquivos e montá-lo. O objetivo do esquema de nomes é utilizar a transparência dos dados de modo amplo. E segundo, configurar os servidores e clientes NFS. Um ambiente com muitos servidores NFS e centenas de clientes podem rapidamente se tornar de complexo gerenciamento.

1.1. Características do NFS

A caching de dados no NFS não sobrecarrega de forma demasiada a memória dos clientes NFS por serem, os dados armazenados, em sua maioria atributos dos arquivos. Nem todas as operações dos sistemas de arquivos atingem os dados diretamente; muitas destas operações são configurações de atributos de arquivos como: comprimento, propriedade, tempo de modificação, número do inode. Por exemplo, o comando ls -l, fornece informações dos diretórios e arquivos, mas não acessam diretamente os dados neles contidos. Outras informações de como é realizada a caching dos dados tanto no cliente quanto no servidor NFS se encontram em [2].

 

2. VFS e Protocolo NFS

2.1. Interface VFS

Além de configurar as máquinas que se comportarão como servidores e clientes NFS, ou ainda definir esquemas de nomes que facilitem a manutenção dos sistemas de arquivos a serem montados ou exportados; é também necessário realizar análises dos padrões de uso no NFS, bem como depurar problemas operacionais, de forma que sejam sugeridas otimizações de performance. Para isto é importante se ter um conhecimento interno do protocolo NFS e dos daemons que o implementam.

Assim como o NIS, NFS é também implementado como um conjunto de procedimentos RPC que utilizam a representação de dados externos (XDR) para passar os argumentos entre clientes e servidores. Este mecanismo possibilita transparência no acesso aos discos remotos, o que é bem vindo no ambiente de sistemas distribuídos NFS.

Um sistema de arquivo montado via NFS apresenta dois níveis de transparência:

O NFS alcança o primeiro nível de transparência através da definição de um conjunto genérico de operações dos sistemas de arquivos que são executadas pelo VFS (Virtual File System). Em um cliente NFS do UNIX, a interface VFS faz com que todos os sistemas de arquivos NFS sejam vistos como sistemas de arquivos UNIX, mesmo que eles tenham sido exportados de servidores IBM MVS ou VAX/VMS. A figura abaixo ilustra esta transparência.

Figura 2.1.1- Interface VFS

O segundo nível de transparência surgi a partir da definição de virtual nodes, que estão mais relacionados a estrutura dos inodes do UNIX, mas esconde a estrutura real do sistema de arquivo físico abaixo dele. O conjunto de todos os procedimentos que podem ser executados sobre os arquivos, é a definição da interface vnode. A especificação do vnode e do VFS definem o protocolo NFS.

Ações que operam no sistema de arquivos como um todo, tais como informar a quantidade de espaço livre em um sistema de arquivo, são chamadas operações VFS; enquanto que chamadas que atuam diretamente com os arquivos ou diretórios, são operações vnode. Algumas operações vnode não são definidas em certos tipos de sistemas de arquivos. Os sistemas de arquivos DOS, por exemplo, não possui qualquer equivalência a links simbólicos. Sendo assim, um servidor de arquivos NFS executando sobre uma máquina DOS rejeita qualquer tentativa de utilizar uma operação vnode para criar um link simbólico.

Em uma chamada de sistema UNIX local, os objetos definidos na interface são rotulados como descritores de arquivos, o qual identifica unicamente um arquivo dentro do escopo de um processo. A contrapartida dos descritores de arquivos no NFS é handles de arquivos, os quais são ponteiros para sistemas de arquivos remotos. Um handle não tem significado para o cliente, pois ele somente pode ser interpretado no contexto de sistemas de arquivos remotos. Informações mais detalhadas de como funcionam os handles de arquivos veja [2].

2.2. Protocolo NFS

O NFS é um protocolo baseado em RPC, com um relacionamento cliente/servidor entre a máquina que possui um sistema de arquivo a ser distribuído e a máquina que aguarda o acesso a estes sistemas de arquivos. O daemon do servidor NFS, nfsd, aceita as chamadas RPC dos clientes. Os servidores NFS também executam o daemon rpc.mountd para tratar das requisições de montagem dos sistemas de arquivos e algumas traduções de caminhos completos. No cliente NFS, o daemon biod está normalmente em execução para melhorar a performance do NFS, apesar de não ser imprescindível.

No cliente, cada processo que está utilizando os arquivos NFS é um cliente do servidor. As chamadas de sistema dos clientes que acessam os arquivos montados via NFS fazem chamadas RPC aos servidores NFS dos arquivos que foram montados. O VFS estende as operações das chamadas de sistema básicas a operações read( ) e write( ). Com o VFS as chamadas de sistema básicas e aquelas orientadas a sistemas de arquivos são modificadas para conhecerem como tratar com sistemas de arquivos não locais.

2.2.1. Procedimentos RPC

O protocolo RPC NFS contêm 16 procedimentos, cada um deles operam ou com arquivos ou sistemas de arquivos. Os procedimentos básico executados no servidor NFS podem ser agrupados em:

É importante observar que o protocolo RPC NFS e a interface vnode são coisas distintas. A interface vnode define um conjunto de serviços do sistema operacional que são usadas para acessar os sistemas de arquivos, NFS ou locais. Vnodes simplesmente generaliza a interface para objetos de arquivo. Existem muitas rotinas na interface vnode que correspondem diretamente a procedimentos no protocolo NFS, mas ela também contém implementações dos serviços do sistema operacional tal como mapeamento dos blocos de arquivos e gerenciamento de cache.

O protocolo NFS é uma realização específica de uma destas interfaces vnode. É utilizado para executar operações vnode específicas sobre arquivos remotos.

2.2.2. Stateless

O protocolo NFS é stateless, significando que não há necessidade de manter informações sobre o protocolo no servidor. O cliente mantém trilhas de todas as informações necessárias para enviar uma requisição ao servidor, mas o servidor não possui informações sobre requisições prévias, ou como as várias requisições se relacionam.

A escolha de um protocolo stateless vem de uma motivação principal, que é minimizar a sobrecarga quando da recuperação de um estado inativo. E isto implica em várias questões de design e implementação:

2.2.3. Retransmissão de requisições

Requisições NFS são enviadas do cliente ao servidor em qualquer momento. Contudo, um único processo cliente não poderá solicitar outra chamada RPC até que a chamada corrente seja completada e tenha sido reconhecida pelo servidor NFS. Um host cliente pode manter várias chamadas RPC em progresso simultaneamente, vindas de vários processos, mas cada processo garante que suas operações de arquivos são ordenadas através dos reconhecimentos.

Quando um cliente solicita uma requisição RPC, ele inicializa um período de timeout durante o qual o servidor deve servir e reconhecer esta requisição. Se algum problema ocorreu e o servidor não atendeu a requisição dentro do intervalo de tempo determinado, ou por tê-la perdido, ou por sobrecarga no servidor, o cliente retransmite a requisição. Porém, se a operação houver sido executada e o atraso foi o envio do reconhecimento, pelo fato das requisições serem indepotentes, não haverá problemas com a duplicação de requisições (isto se o servidor possuir cache de requisições duplicadas). Quando o cliente receber a segunda confirmação, ele a descarta.

A cache de requisições duplicadas nos servidores NFS normalmente contém poucas centenas de entradas, ou seja, os últimos poucos segundos (no máximo) de requisições NFS em um servidor ocupado. Esta cache é limitada no tamanho da janela na qual requisições NFS não indepotentes sejam consideradas duplicadas, causadas pela retransmissão, ao invés de requisições distintas.

 

3. Segurança em NFS

A segurança de sistemas de arquivos tem dois aspectos:

3.1. Autenticação RPC NFS

Cada requisição NFS, incluindo requisições de montagem, contém um conjunto de credenciais de usuários com o UID e uma lista de ID’s de grupos (gid) aos quais o UID pertence. As credenciais do NFS são as mesmas utilizadas em arquivos locais. No servidor NFS, estas credenciais são utilizadas para executar a verificação das permissões que são parte do acesso a arquivos UNIX. Existem três áreas nas quais as credenciais NFS podem não concordar com a estrutura das credenciais locais do usuário: o usuário ser o superusuário, o usuário pertencer a muitos grupos, ou nenhuma credencial ser fornecida (requisição anônima).

Cada implementação NFS possui um número limitado de grupos que podem ser passados na estrutura das credenciais para uma RPC NFS. Este número normalmente é combinado com o número máximo de grupos aos quais um usuário pode pertencer.

3.2. Mapeamento do superusuário

Ao superusuário não são dadas permissões de acesso normais a arquivos montados via NFS. A motivação por trás desta restrição é que o acesso de root seja garantido baseado por máquina física. Um usuário que é capaz de se tornar root em uma máquina não deverá necessariamente possuir permissões de modificar os arquivos no servidor de arquivos.

Para forçar as restrições no acesso do superusuário, o UID do root é mapeado para o usuário anônimo nobody na estrutura da credencial RPC NFS. O superusuário freqüentemente possui menos permissões comparado a um usuário sem privilégios para os sistemas de arquivos montados via NFS, uma vez que o grupo nobody normalmente não inclui outros usuários.

Muitos servidores NFS garantem permissão de acesso ao root em sistemas de arquivos exportados do servidor baseado no host, utilizando a opção de exportação root=. O servidor exportando um sistema de arquivo garante acesso ao root para um host ou lista de hosts, através da inclusão deles no arquivo /etc/exports. Por exemplo:

/home/work -root=bitatron:corvette

Nos servidores bitatron e corvette o superusuário tem privilégios de root quando acessando o sistema de arquivo /home/work.

3.3. Mapeamento de usuário desconhecido

As requisições NFS que não possuem credenciais válidas são mapeadas para o usuário anônimo. A estrutura das credenciais não existem nas requisições NFS quando:

Por default, o usuário anônimo é nobody. A opção de exportação anon permite que um servidor altere o mapeamento das requisições anônimas. Configurando o ID de um usuário anônimo no arquivo /etc/exports, o usuário desconhecido em uma requisição anônima é mapeado para um usuário conhecido localmente. Por exemplo:

/home/engin -anon=100

Qualquer requisição que chegar sem uma credencial de usuário será executada com o UID 100. Este mapeamento é válido apenas para os sistemas de arquivos exportados com esta opção, no exemplo acima, apenas para /home/engin.

3.4. Outras medidas de segurança

/export/root/noreast -access=noreast,root=noreast

/source -rw=corvette:vacation,access=souerce-group

Qualquer host que não pertença a relação, deverá montar o sistema de arquivo utilizando a opção -ro ou a opção de montagem -r. Uma tentativa de montar um sistema de arquivo somente leitura com permissão de escrita será realizada com sucesso. Contudo, surgirão problemas quando um cliente NFS tentar escrever realmente neste sistema de arquivo.

echo "nfs_portmon/W1" | adb -w /vmunix /dev/kmen

3.5. NFS Seguro

Disponibilizar um NFS seguro em um sistema de arquivo é muito simples: basta exportar e montar sistemas de arquivos com a opção secure. No servidor NFS, o arquivo /etc/exports possui entradas como:

/home/thud -secure

Quando um sistema de arquivo é exportado com esta opção, os clientes devem montá-lo com a mesma opção. No cliente NFS, o arquivo /etc/fstab deverá possuir a seguinte linha de entrada:

thud:/home/thud /home/thud nfs rw,secure,hard 0 0

Se um usuário acessar o sistema de arquivo seguro, pode gerar uma chave válida com o servidor, ela é utilizada para encriptar o timestamps enviado junto com as requisições NFS do usuário. Se o servidor decriptar o timestamps com sucesso, a credencial no estilo UNIX apresentada pelo usuário é confiável e é utilizada para garantir permissões normais de arquivo estilo UNIX.

3.6. Chave pública e chave privada

Chaves públicas e chaves privadas (secretas) são mantidas no mapa NIS publickey.byname, o qual é construído a partir do arquivo /etc/publickey no servidor master. Se o NIS não está sendo executado, não é possível criar estas chaves. A única chave que é definida por default é para nobody, que é requerida para o mapeamento de usuários anônimos. O formato da entrada no arquivo /etc/publickey é o seguinte:

unix.10461@nesales publickey:secretkey

As chaves são strings longas de dígitos em hexadecimal, representando os valores das chaves encriptadas. No arquivo /etc/publickey, o campo secretkey contém a chave secreta do usuário encriptada junto a senha de login do mesmo.

Os identificadores no arquivo /etc/publickey possuem uma das duas formas: unix.uid@NISdomain, utilizada para chaves de usuários; ou unix.host@NISdomain, utilizada para criar uma chave de segurança RPC para o superusuário naquele host especificado.

3.7. Criação de Chaves

O superusuário pode adicionar chaves de usuários através do comando newkey -u user. Neste caso, a senha do usuário deverá ser fornecida, sendo assim, o superusuário apenas deverá criar as chaves se o usuário estiver disponível para ser informado de sua nova senha. Por exemplo:

nismaster# newkey -u stern

Adding new key for unix.1461@nesales.East.Sun.COM.

New Password:

Outra alternativa, é o próprio usuário criar seus pares de chaves com o comando chkey. Por exemplo:

cliente% chkey

Gerating new key for unix.11461@nesales.East.Sun.COM.

Password:

sending request to nismaster

As chaves podem ser criadas por qualquer usuário na máquina cliente NIS, provendo a chave nobody já existente. Se esta entrada é removida do mapa publickey, então os usuários poderão utilizar o comando chkey apenas para alterar suas chaves privadas, mas não criar novas chaves.

O único meio de se criar chaves de host (para verificação de superusuário) é através do comando newkey -h como root. Por exemplo:

# newkey -h bitatron

Adding new key for unixbitatron@nesales.East.Sun.COM.

New Password:

Para os mapas NIS receberem as atualizações dos comandos newkey e chkey, o servidor master NIS deverá está executando o rpc.ypudated.

3.8. Estabelecendo conversão de chaves

Quando um usuário se loga em uma máquina que está executando um NFS seguro, a senha informada no momento do login é utilizada para decriptar a chave privada deste usuário. A chave secreta é dada pelo daemon keyserv (este daemon deve estar em execução nas máquinas que utilizam o NFS seguro), o qual realiza uma cache desta chave para posterior geração da chave de sessão. As chaves de sessão são utilizadas para gerar as chaves de conversão junto aos servidor NFS. O procedimento completo para a geração de uma chave de conversão é dado a seguir:

 

4. Análise da Performance

4.1. Identificando gargalos na performance NFS

O design stateless do NFS torna simples a recuperação de uma "queda" do sistema, mas ele também torna impossível para um cliente distinguir entre um servidor que está lento e outro que está inativo. Os clientes não podem informar porque um servidor parece lento, ou os pacotes são deixados pela rede e nunca alcançam o servidor, ou o servidor poderá estar sobrecarregado.

Os potenciais gargalos existentes em um relacionamento cliente/servidor são:

4.2. Localizando os gargalos

Para localizar os gargalos existentes em um serviço NFS, uma abordagem é iniciar uma análise em um típico cliente NFS, e avaliar sua visão dos serviços oferecidos pela rede. Ferramentas que examinam a interface da rede local, a carga da rede percebida pelo cliente, e o timeout NFS e estatísticas de retransmissão, indicam se os problemas de performance são devido a rede ou aos servidores NFS.

A ferramenta nfsstat executada no cliente compara a retransmissão e taxas de repostas duplicadas. Maiores informações sobre esta ferramenta veja o item 5.2.

4.3. Deamons do servidor NFS

O número default de daemons nfsd é escolhido empiricamente pelo fornecedor do sistema, e provê uma performance média sobre condições médias. O número de daemons é especificado como um argumento para o nfsd quando ele é inicializado pelo script de inicialização:

nfsd 8 & echo -n ‘ nfsd’ (inicializa oito instâncias do nfsd)

Em muitos casos variar o número de daemons provê uma melhor performance. Na teoria, o número de daemons nfsd poderia ser incrementado até os limites das tabelas de processo serem alcançados, embora na prática o escalonamento de muitos nfsd decremente a performance antes do limite do processo do servidor ser alcançado.

O daemon nfsd nada mais é que um processo receptor de subrotinas do kernel que executam operações de sistemas de arquivos. Ele existe como um processo separado para provê um escalonamento tratado pelo kernel, permitindo que um servidor aceite mais requisições NFS enquanto outros daemons nfsd estão aguardando que uma operação no disco seja completada.

 

4.4. Construção de pontos de montagem

A escolha de um esquema de nomes para os pontos de montagem podem ter um impacto significante na utilização dos servidores NFS. Duas comuns mas ineficientes construções são "caminho das pedras" dos mounts e links simbólicos residentes nos servidores.

Um caminho da pedras existe quando é montado um sistema de arquivo no topo de outro diretório o qual faz parte de um sistema de arquivo montado via NFS de um servidor diferente. Por exemplo:

# mount mahimahi:/usr /usr

# mount wahoo:/usr/local /usr/local

# mount poi:/usr/local/bin /usr/local/bin

É melhor montar todos os subdiretórios do /usr e
/usr/local de um único servidor de arquivos, de forma que não sejam enviadas requisições RPC para outros servidores de arquivos simplesmente pelo fato destes possuírem componentes intermediários no caminho completo.

Links simbólicos são também úteis para impor simetria às convenções de nomes através dos múltiplos sistemas de arquivos; mas eles impõem também uma carga desnecessária no servidor NFS que é regularmente chamado a resolver links. Por exemplo, considere um /usr/local que seja composto de links para vários subdiretórios em outros servidores:

# mount wahoo:/usr/local /usr/local

# cd /usr/local

# ls -l

lrwxrwxrwx 1 root 16 May 17 19:12 bin -> /tools/poi/bin

lrwxrwxrwx 1 root 16 May 17 19:12 lib -> /tools/mahimahi/lib

lrwxrwxrwx 1 root 16 May 17 19:12 man -> /tools/irie/man

Cada referência a qualquer arquivo no /usr/local deve primeiro seguir até o servidor wahoo para que ele resolva o link apropriadamente.

Se existem um ou mais links simbólicos que estão formando um gargalo na pesquisa do caminho completo no servidor, é melhor removê-los e substituí-los pelo sistema de arquivo, alvo do link, montado diretamente no cliente NFS.

 

5. Ferramentas NFS

Assim como o NIS, o NFS também possui um conjunto de ferramentas que auxiliam na avaliação das configurações da rede e das possíveis falhas ocorridas. O NFS apresenta um comportamento bem mais estático em suas operações: ou um sistema de arquivo é montado ou não. O NFS é executado corretamente ou simplesmente não funciona.

A saída emitida por estas ferramentas são utilizadas para avaliar a performance dos procedimentos NFS.

5.1. Informações de montagem

As informações de montagem dos sistemas de arquivos são mantidas em três arquivos:

% mount

/dev/id000a on / type 4.2 (rw)

/dev/id000g on /usr type 4.2 (rw)

/dev/id000h on /var type 4.2 (rw)

/dev/id001h on /home/wahoo type 4.2 (rw)

onaga:/home/onaga on /home/onaga type nfs (rw,bg,hard)

thud:/home/thud on /home/thud type nfs (rw,bg,hard)

mahimahi:/home/mahimahi on /home/mahimahi type nfs (rw,bg,hard)

% mount -p

/dev/id000a / 4.2 rw 1 1

/dev/id000g /usr 4.2 rw 1 2

/dev/id000h /var 4.2 rw 1 3

/dev/id001h /home/wahoo 4.2 rw 1 4

onaga:/home/onaga /home/onaga nfs rw,bg,hard 0 0

thud:/home/thud /home/thud nfs rw,bg,hard 0 0

mahimahi:/home/mahimahi /home/mahimahi nfs rw,bg,hard 0 0

A ferramenta showmount é usada para visualizar as informações de montagem no lado do servidor NFS. Com a opção -a imprime os pares host e diretório dos clientes que acessam aquele servidor. Já a opção -d, imprime apenas os diretórios montados pelos clientes. Por exemplo:

% showmount -a

bears:/var/spool/mail

bears:/home/wahoo

honeymoon:/home/wahoo

honeymoon:/var/spool/mail

131.40.52.44:/home/wahoo

131.40.52.44:/var/spool/mail

% showmount -d

/usr

/home/mahimahi

/tools/mahimahi

No lado do cliente NFS, as informações de uso dos sistemas de arquivos montados são oferecidas pelo utilitário df. Ele fornece informações dos pontos de montagem e dos correspondentes sistemas de arquivos. Se o ponto de montagem é um link simbólico, o df resolve o link e exibe o sistema de arquivo para o qual o link aponta.

O comando df possui várias opções [man na linha de comando] e [2], dentre elas a opção -t fstype que exibe os sistemas de arquivos que apresentam o tipo especificado em fstype. Por exemplo:

% df -t nfs

Filesystem kbytes used avail capacity Mounted on

onaga:/home/onaga 585325 483295 43497 92% /home/onaga

thud:/home/thud 427520 364635 20133 95% /home/thud mahimahi:/home/mahimahi

371967 265490 69280 79% /home/mahimahi

 

5.2. Estatísticas do NFS

O utilitário nfsstat imprime conjuntos de dados estatísticos sobre o comportamento de ambos os elementos cliente e servidor NFS. Com a opção -c, exibe as estatísticas no lado do cliente NFS, enquanto que a opção -s fornece estatísticas do servidor. Por exemplo:

% nfsstat -s

Server rpc:

calls badcalls nullrecv badlen xdrcall

13910643 0 0 0 0

Server nfs:

calls badcalls

13910643 0

null getattr setattr root lookup

7774 0% 2140751 15% 38289 0% 0 0% 2303449 16%

readlink read wrcache write create 503057 3% 4743967 34% 0 0% 3569183 25% 191783 1%

remove renamel link symlink mkdir 100826 0% 19419 0% 797 0% 379 0% 4960 0%

rmdir readdir fsstat

4940 0% 258096 1% 22973 0%

A interpretação dos campos está detalhada em [2]. Alguns destes seriam:

No lado do cliente, alguns campos são iguais, porém possuem uma interpretação voltada ao cliente NFS; além disso, outros campos são acrescentados. Para uma completa descrição de seus significados veja [2].

6. Interpretação de Erros

Uma vez que o dispositivo de disco tem uma requisição de escrita ou de leitura, apenas uma falha do meio pode causar uma operação que retorne um erro. Qualquer outra falha, tal como problemas de permissão, ou falta de espaço no sistema de arquivo, são detectadas por rotinas de gerenciamento dos sistemas de arquivos antes do drive de disco receber a requisição.

Se ocorre um erro do meio, por exemplo, o disco apresenta um setor danificado, então, o erro será reportado de volta a aplicação durante a próxima chamada similar ou durante uma rotina close( ) do arquivo contendo um bloco com defeito. Quando o drive perceber que um erro ocorreu e que foi retornado a controladora do disco, ele imprime uma mensagem de falha do meio na console.

Um mecanismo similar é utilizado para reportar erros no meio virtual do servidor de arquivos remotos. Quando uma rotina write( ) é chamada sobre um arquivo montado via NFS, os dados do buffer e o offset do arquivo são tratados por rotinas de escrita do NFS, do mesmo modo que a escrita em um sistema de arquivo UNIX chama a rotina de escrita do drive de disco de mais baixo nível. Como o driver do dipositivo de disco, o NFS possui uma rotina de driver para escalonar requisições de escrita: cada nova requisição é colocada no buffer local ou na página de cache. Quando um buffer está completo ou a página tem sido escrita, a requisição é tratada pelo daemon biod, que executa a chamada RPC para o servidor remoto e retorna o código resultante.

Ocasionalmente, um daemon biod pode detectar um erro quando tentar escrever no servidor remoto, o erro é então, impresso na console do cliente. O formato desta mensagem de erro é por exemplo:

NFS write error 13 on host mahimahi fh 27b26ff7

Na tabela abaixo temos uma relação dos erro relacionados ao NFS e os respectivos números de erros:

Número

Erro

Causa típica

13

Permission Denied

Superusuário não pode escrever no sistema de arquivo remoto

28

No Space

Disco remoto está cheio

70

Stale File Handle

Arquivo aberto ou diretório destruído e recriado

Tabela 6.1 - Valores dos erros

Os erros "Permission Denied" e "No Space" serão detectados no sistema de arquivo local, mas o cliente NFS não tem meios de determinar se uma operação de escrita obteve sucesso em algum tempo futuro.

Uma vez que várias falhas de escrita tem ocorrido devido a sistemas de arquivos cheios ou problemas de permissão, o superusuário pode ocasionar um down no usuário ou processo que está executando as escritas, através da identificação do arquivo que está sendo escrito. O utilitário showfh correlaciona os handles dos arquivos impressos pelo biod com o caminho completo do arquivo no servidor remoto. Por exemplo:

cliente% showfh mahiomahi 2 7 b 2 6 f f 7

/home/mahimahi/stern/foo

Onde 2 7 b 2 6 f f 7 é o handle do arquivo reportado na mensagem de erro.

Para evitar retardos dos clientes devido a problemas como escrita, devemos ter uma idéia clara das atividades dos clientes e do quanto estão sobrecarregados os servidores. Devemos também determinar a carga que o NFS impõe a rede e otimizar os clientes e servidores para que possam fazer melhor uso dos recursos disponíveis. Para tanto uma análise de performance deve ser realizada assim como descrito no item 4.

 

7. Bibliografia

  1. Hal Stern - Managing NFS and NIS - O’Reilly & Associates, Inc. - 1991.
  2. Evi Nemeth, Garth Snyder, Scott Seebass, Trent R. Hein - UNIX System Administration Handbook - Prentice Hall PTR - 1995.