O que significa 'identificador de arquivo obsoleto' no Linux?

100

Digamos que eu tenha um terminal aberto e, por meio desse terminal, eu cdvá para algum diretório. Por meio de outro terminal, excluo esse diretório e o restauro de um backup idêntico. Quando tento vimum arquivo do primeiro terminal, no mesmo diretório, por que recebo um erro sobre um identificador de arquivo obsoleto? O que isso significa? (Por outro lado, descobri que é possível contornar esse problema completamente cd $(pwd).)

IDDQD
fonte
Se você montar um diretório por NFS (nomeie-o adir) do host A para o host B, então faça a coisa de deletar e restaurar para adir no host A, você também pode obter o erro "Manipulação de arquivo obsoleto" ao acessar adir no host B. Usar o comando touchno host A pode torná-lo normal.
rustyhu

Respostas:

83

Quando o diretório é excluído, o inode desse diretório (e os inodes de seu conteúdo) são reciclados. O ponteiro que seu shell tem para o inode desse diretório (e os inodes de seu conteúdo) agora não são mais válidos. Quando o diretório é restaurado do backup, os inodes antigos não são (necessariamente) reutilizados; o diretório e seu conteúdo são armazenados em inodes aleatórios. A única coisa que permanece a mesma é que o diretório pai reutiliza o mesmo nome para o diretório restaurado (porque você o instruiu).

Agora, se você tentar acessar o conteúdo do diretório para o qual seu shell original ainda está apontando, ele comunica essa solicitação ao sistema de arquivos como uma solicitação para o inode original, que já foi reciclado (e pode até estar em uso para algo totalmente diferente agora). Então você recebeu uma stale file handlemensagem porque pediu alguns dados inexistentes.

Quando você executa uma cdoperação, o shell reavalia a localização do inode de qualquer destino que você fornecer. Agora que seu shell conhece o novo inode para o diretório (e os novos inodes para seu conteúdo), as solicitações futuras de seu conteúdo serão válidas.

dg99
fonte
Ah, então esta é apenas a maneira do sistema de tratar ponteiros de inode inválidos / nulos?
IDDQD de
Sim. Não sei o suficiente sobre os detalhes para saber o que aconteceria se, por exemplo, você tentasse fazer referência a um inode que já foi reciclado para apontar para outra coisa. Você ainda obteria um identificador de arquivo obsoleto? Ou você obteria dados inesperados?
dg99 de
1
Não acho que o sistema iria reutilizá-lo, já que alguém está realmente usando esse nó I por tê-lo como o diretório atual.
Samuel Åslund