Corrigindo "Stale file handle" no NFS - Remontando o Compartilhamento
O que "Stale file handle" realmente significa?
Conclusao: O cliente NFS esta segurando um file handle que nao corresponde mais ao objeto no servidor (
ESTALE). O NFS identifica objetos por handle, nao por caminho, entao mudancas no servidor sao o gatilho.
Em uma montagem NFS, ls, cat ou salvar um arquivo falha assim:
ls: cannot access '/mnt/nfs/data': Stale file handle
O NFS identifica um arquivo por um file handle, nao por seu caminho. Um handle e composto aproximadamente de tres partes:
- fsid -- identificador do filesystem exportado
- numero de inode -- o inode do arquivo ou diretorio alvo
- numero de geracao -- distingue inodes que foram reutilizados
O cliente faz cache desse handle no momento da montagem e no acesso, depois o reutiliza para operacoes posteriores. Se o objeto para o qual o handle aponta desaparece ou muda no servidor, o proximo acesso faz o kernel retornar ESTALE (Stale file handle).
Ponto-chave: Isso nao e uma falha de disco. O cliente esta simplesmente segurando uma referencia desatualizada, e a maioria dos casos e resolvida remontando no cliente. Suspeite do lado do cliente antes de mexer no servidor.
Por que um Stale file handle acontece?
Conclusao: Acontece quando o objeto para o qual um handle aponta muda no servidor. As quatro grandes causas sao deletar/recriar um arquivo, alterar exports, mudanca de fsid no reboot do servidor e mudancas de inode/geracao em uma restauracao.
Aqui estao os gatilhos comuns, ordenados por frequencia na pratica.
- A. Um arquivo ou diretorio e deletado e recriado no servidor (mais comum) -- se um arquivo e removido e criado novamente por outro caminho enquanto o cliente o tem aberto, o inode/geracao muda e o handle fica obsoleto
- B. Mudancas na configuracao de export -- editar
/etc/exportse executarexportfs -r, ou alterar um caminho ou opcoes de export, quebra as premissas por tras dos handles existentes - C. O fsid muda no reboot do servidor -- se
/etc/exportsnao fixafsid=, o servidor pode auto-atribuir um fsid diferente no reboot, invalidando handles existentes - D. Restauracao de backup ou snapshot -- uma restauracao pode alterar o numero de inode ou geracao de um arquivo, entao o mesmo caminho agora resolve para um handle diferente
A e D sao casos onde "o caminho e identico mas o objeto (inode) por baixo foi trocado." Parece correto pelo nome do arquivo, o que torna a causa raiz dificil de identificar. Quando voce vir ESTALE, primeiro suspeite que o objeto foi substituido no servidor.
Verifique a situacao primeiro
Conclusao: Identifique qual montagem NFS esta afetada e quais processos a estao usando antes de agir. Use
findmntpara montagens elsof/fuserpara os processos que as utilizam.
1. Identificar a montagem NFS
$ findmnt -t nfs,nfs4
TARGET SOURCE FSTYPE OPTIONS /mnt/nfs 192.168.10.5:/export nfs4 rw,relatime,vers=4.2,...
2. Reproduzir o ESTALE
$ ls /mnt/nfs ls: reading directory '/mnt/nfs': Stale file handle
3. Encontrar processos usando a montagem
Uma remontagem requer que nada esteja usando a montagem alvo. Identifique os processos que a estao usando primeiro.
$ lsof +D /mnt/nfs 2>/dev/null $ fuser -vm /mnt/nfs
Ate mesmo seu proprio shell dentro da montagem com cd conta como ocupado. Saia da montagem com cd / primeiro, depois tente a remontagem. Isso sozinho frequentemente permite que o umount funcione.
Como recuperar? (lado do cliente)
Conclusao: A correcao basica e "desmontar, depois remontar" para buscar o handle novamente. Se falhar como ocupado, use desmontagem lazy (
umount -l); se isso ainda falhar, escale para forca (umount -f).
Passo 1: Desmontagem e remontagem normal
$ cd / $ sudo umount /mnt/nfs $ sudo mount /mnt/nfs
Se ha uma entrada no /etc/fstab, mount /mnt/nfs sozinho remonta. Isso resolve a maioria dos casos.
Passo 2: Desmontagem lazy quando esta ocupado
Quando umount falha com target is busy, verifique se voce pode parar os processos referenciando, depois use desmontagem lazy.
$ sudo umount -l /mnt/nfs # lazy: desanexa assim que as referencias limparem $ sudo mount /mnt/nfs
-l (lazy) desanexa o ponto de montagem do namespace imediatamente e o libera assim que a ultima referencia desaparece, entao voce pode prosseguir para a remontagem mesmo em um ambiente ocupado.
Passo 3: Desmontagem forcada quando o servidor nao responde
Se o servidor esta inativo ou inalcancavel e o I/O esta travando, use forca.
$ sudo umount -f /mnt/nfs
umount -f pode perder dados nao gravados. Se uma aplicacao esta no meio de uma gravacao, pare-a primeiro quando possivel. Use forca / lazy apenas como ultimos recursos escalantes.
Passo 4: Quando apenas um unico arquivo esta obsoleto
Se apenas um arquivo ou diretorio especifico esta obsoleto em vez de toda a montagem, sair e voltar ao diretorio pode limpar.
$ cd / $ cd /mnt/nfs/data # buscar o handle novamente
Se persistir, prossiga para a remontagem nos Passos 1-3.
O que verificar no servidor
Conclusao: Se uma remontagem do cliente nao ajuda, ou o problema atinge todos os clientes, suspeite do servidor. Verifique o estado do export e a consistencia do fsid.
Verificar o estado do export
$ sudo exportfs -v
Confirme que os caminhos e opcoes de export sao o que voce pretendia. Se voce acabou de alterar /etc/exports, re-exporte para garantir que esta aplicado.
$ sudo exportfs -ra
Verificar que o fsid esta fixado
Se Stale aparece apos cada reboot do servidor, o fsid auto-atribuido provavelmente esta mudando. Fixe-o explicitamente em /etc/exports.
# /etc/exports (lado do servidor) /export 192.168.10.0/24(rw,sync,fsid=0,no_subtree_check)
fsid=0 e a pseudo-raiz do NFSv4. Atribua um valor unico (fsid=1, fsid=2, ...) ou um UUID para cada export adicional. Aplique mudancas com exportfs -ra.
Como prevenir?
Conclusao: Fixe
fsidno servidor e evite deletar ou recriar arquivos em uso diretamente no servidor. Opcoes de montagem tambem podem amenizar travamentos.
- Fixe
fsid=explicitamente -- a medida mais eficaz contra fsid mudando no reboot - Nao modifique arquivos em uso diretamente no servidor -- delete ou substitua pelo cliente, ou quando nenhum cliente estiver referenciando
- Faca mudancas de export durante uma janela de manutencao -- planeje edicoes de
/etc/exportse re-exports junto com remontagens dos clientes - Entenda
softvshard--hard(padrao) continua tentando ate o servidor retornar, o que favorece integridade de dados mas trava facilmente em interrupcoes;softdesiste no timeout, travando menos mas arriscando gravacoes perdidas. Escolha pelo caso de uso
Copiar e colar: template de recuperacao do lado do cliente
# 1. Sair da montagem cd / # 2. Qual montagem esta afetada e quem a esta usando findmnt -t nfs,nfs4 fuser -vm /mnt/nfs # 3. Remontar (-l se ocupado, -f se travado) sudo umount /mnt/nfs || sudo umount -l /mnt/nfs sudo mount /mnt/nfs
Resumo
- Stale file handle (
ESTALE) significa que o cliente NFS esta segurando um file handle desatualizado; nao e uma falha de disco - A causa e uma mudanca do objeto no servidor (deletar/recriar, mudanca de export, mudanca de fsid, restauracao)
- A correcao basica e uma remontagem no lado do cliente. Use
umount -lquando ocupado eumount -fquando travado, escalando em passos - Se atinge todos os clientes ou recorre a cada reboot, verifique que
fsidesta fixado no servidor