Corrigindo "Stale file handle" no NFS - Remontando o Compartilhamento
O que "Stale file handle" realmente significa?
Conclusão: O cliente NFS está segurando um file handle que não corresponde mais ao objeto no servidor (
ESTALE). O NFS identifica objetos por handle, não por caminho, então mudanças no servidor são 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, não por seu caminho. Um handle é composto aproximadamente de três partes:
- fsid -- identificador do filesystem exportado
- número de inode -- o inode do arquivo ou diretório alvo
- número de geração -- distingue inodes que foram reutilizados
O cliente faz cache desse handle no momento da montagem e no acesso, depois o reutiliza para operações posteriores. Se o objeto para o qual o handle aponta desaparece ou muda no servidor, o próximo acesso faz o kernel retornar ESTALE (Stale file handle).
Ponto-chave: Isso não é uma falha de disco. O cliente está simplesmente segurando uma referência desatualizada, e a maioria dos casos é resolvida remontando no cliente. Suspeite do lado do cliente antes de mexer no servidor.
Por que um Stale file handle acontece?
Conclusão: Acontece quando o objeto para o qual um handle aponta muda no servidor. As quatro grandes causas são deletar/recriar um arquivo, alterar exports, mudança de fsid no reboot do servidor e mudanças de inode/geração em uma restauração.
Aqui estão os gatilhos comuns, ordenados por frequência na prática.
- A. Um arquivo ou diretório é deletado e recriado no servidor (mais comum) -- se um arquivo é removido e criado novamente por outro caminho enquanto o cliente o tem aberto, o inode/geração muda e o handle fica obsoleto
- B. Mudanças na configuração de export -- editar
/etc/exportse executarexportfs -r, ou alterar um caminho ou opções de export, quebra as premissas por trás dos handles existentes - C. O fsid muda no reboot do servidor -- se
/etc/exportsnão fixafsid=, o servidor pode auto-atribuir um fsid diferente no reboot, invalidando handles existentes - D. Restauração de backup ou snapshot -- uma restauração pode alterar o número de inode ou geração de um arquivo, então o mesmo caminho agora resolve para um handle diferente
A e D são casos onde "o caminho é idêntico mas o objeto (inode) por baixo foi trocado." Parece correto pelo nome do arquivo, o que torna a causa raiz difícil de identificar. Quando você vir ESTALE, primeiro suspeite que o objeto foi substituído no servidor.
Verifique a situação primeiro
Conclusão: Identifique qual montagem NFS está afetada e quais processos a estão 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 estão usando primeiro.
$ lsof +D /mnt/nfs 2>/dev/null $ fuser -vm /mnt/nfs
Até mesmo seu próprio 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)
Conclusão: A correção básica é "desmontar, depois remontar" para buscar o handle novamente. Se falhar como ocupado, use desmontagem lazy (
umount -l); se isso ainda falhar, escale para força (umount -f).
Passo 1: Desmontagem e remontagem normal
$ cd / $ sudo umount /mnt/nfs $ sudo mount /mnt/nfs
Se há uma entrada no /etc/fstab, mount /mnt/nfs sozinho remonta. Isso resolve a maioria dos casos.
Passo 2: Desmontagem lazy quando está ocupado
Quando umount falha com target is busy, verifique se você 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 última referência desaparece, então você pode prosseguir para a remontagem mesmo em um ambiente ocupado.
Passo 3: Desmontagem forçada quando o servidor não responde
Se o servidor está inativo ou inalcançável e o I/O está travando, use força.
$ sudo umount -f /mnt/nfs
umount -f pode perder dados não gravados. Se uma aplicação está no meio de uma gravação, pare-a primeiro quando possível. Use força / lazy apenas como últimos recursos escalantes.
Passo 4: Quando apenas um único arquivo está obsoleto
Se apenas um arquivo ou diretório específico está obsoleto em vez de toda a montagem, sair e voltar ao diretório 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
Conclusão: Se uma remontagem do cliente não ajuda, ou o problema atinge todos os clientes, suspeite do servidor. Verifique o estado do export e a consistência do fsid.
Verificar o estado do export
$ sudo exportfs -v
Confirme que os caminhos e opções de export são o que você pretendia. Se você acabou de alterar /etc/exports, re-exporte para garantir que está aplicado.
$ sudo exportfs -ra
Verificar que o fsid está fixado
Se Stale aparece após cada reboot do servidor, o fsid auto-atribuído provavelmente está 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 é a pseudo-raiz do NFSv4. Atribua um valor único (fsid=1, fsid=2, ...) ou um UUID para cada export adicional. Aplique mudanças com exportfs -ra.
Como prevenir?
Conclusão: Fixe
fsidno servidor e evite deletar ou recriar arquivos em uso diretamente no servidor. Opções de montagem também podem amenizar travamentos.
- Fixe
fsid=explicitamente -- a medida mais eficaz contra fsid mudando no reboot - Não modifique arquivos em uso diretamente no servidor -- delete ou substitua pelo cliente, ou quando nenhum cliente estiver referenciando
- Faça mudanças de export durante uma janela de manutenção -- planeje edições de
/etc/exportse re-exports junto com remontagens dos clientes - Entenda
softvshard--hard(padrão) continua tentando até o servidor retornar, o que favorece integridade de dados mas trava facilmente em interrupções;softdesiste no timeout, travando menos mas arriscando gravações perdidas. Escolha pelo caso de uso
Copiar e colar: template de recuperação 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 está segurando um file handle desatualizado; não é uma falha de disco - A causa é uma mudança do objeto no servidor (deletar/recriar, mudança de export, mudança de fsid, restauração)
- A correção básica é 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
fsidestá fixado no servidor