Digamos que eu tenha um terminal aberto e, por meio desse terminal, eu cd
vá para algum diretório. Por meio de outro terminal, excluo esse diretório e o restauro de um backup idêntico. Quando tento vim
um 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)
.)
100
touch
no host A pode torná-lo normal.Respostas:
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 handle
mensagem porque pediu alguns dados inexistentes.Quando você executa uma
cd
operaçã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.fonte