¿Qué significa 'manejador de archivo obsoleto' en Linux?

100

Digamos que tengo una terminal abierta, ya través de esa terminal he cdentrado en algún directorio. A través de otra terminal, elimino ese directorio y lo restauro desde una copia de seguridad idéntica. Cuando intento vimacceder a un archivo desde la primera terminal, en el mismo directorio, ¿por qué obtengo un error sobre un identificador de archivo obsoleto? Qué significa eso? (En una nota al margen, he descubierto que es posible evitar este problema cd $(pwd)).

IDDQD
fuente
Si monta un directorio con NFS (nómbrelo adir) desde el host A al host B, luego haga lo de eliminar y restaurar para adir en el host A, también puede obtener el error "Manejo de archivo obsoleto" cuando accede a adir en el host B. Usar el comando touchen el host A puede hacer que sea normal.
rustyhu

Respuestas:

83

Cuando se elimina el directorio, el inodo para ese directorio (y los inodos para su contenido) se reciclan. El puntero que tiene su shell al inodo de ese directorio (y los inodos de su contenido) ya no es válido. Cuando se restaura el directorio desde la copia de seguridad, los inodos antiguos no se reutilizan (necesariamente); el directorio y su contenido se almacenan en inodos aleatorios. Lo único que permanece igual es que el directorio principal reutiliza el mismo nombre para el directorio restaurado (porque usted se lo indicó).

Ahora, si intenta acceder al contenido del directorio al que todavía apunta su shell original, comunica esa solicitud al sistema de archivos como una solicitud para el inodo original, que desde entonces ha sido reciclado (e incluso puede estar en uso para algo completamente diferente ahora). Entonces obtienes unstale file handle mensaje porque pediste algunos datos inexistentes.

Cuando realiza una cdoperación, el shell reevalúa la ubicación del inodo de cualquier destino que le dé. Ahora que su shell conoce el nuevo inodo para el directorio (y los nuevos inodos para su contenido), las futuras solicitudes de su contenido serán válidas.

dg99
fuente
Ah, ¿entonces esta es solo la forma en que el sistema trata los punteros de inodo inválidos / nulos?
IDDQD
Si. No sé lo suficiente sobre los detalles para saber qué sucedería si, por ejemplo, intentara hacer referencia a un inodo que ya había sido reciclado para apuntar a otra cosa. ¿Seguiría obteniendo un identificador de archivo obsoleto? ¿O obtendría datos inesperados?
dg99
1
No creo que el sistema lo reutilice, ya que alguien está usando ese I-nodo al tenerlo como directorio actual.
Samuel Åslund