Что означает «устаревший дескриптор файла» в Linux?

101

Скажем, у меня открыт терминал, и через него я cdпопал в какой-то каталог. Через другой терминал я удаляю этот каталог и восстанавливаю его из идентичной резервной копии. Когда я пытаюсь открыть vimфайл с первого терминала в том же каталоге, почему я получаю сообщение об устаревшем дескрипторе файла? Что это означает? (Кстати, я обнаружил, что эту проблему можно обойти cd $(pwd).)

IDDQD
источник
Если вы монтируете по NFS каталог (назовите его adir) с хоста A на хост B, а затем выполняете операцию удаления и восстановления для adir на хосте A, вы также можете получить ошибку «Дескриптор устаревшего файла» при доступе к adir на хосте. B. Используйте команду touchна хосте A, чтобы все стало нормально.
rustyhu

Ответы:

83

Когда каталог удаляется, индексный дескриптор этого каталога (и индексные дескрипторы его содержимого) повторно используется. Указатель вашей оболочки на индексный дескриптор этого каталога (и индексные дескрипторы его содержимого) больше не действителен. Когда каталог восстанавливается из резервной копии, старые inodes не (обязательно) повторно используются; каталог и его содержимое хранятся в случайных индексах. Единственное, что остается неизменным, - это то, что родительский каталог повторно использует то же имя для восстановленного каталога (потому что вы это сказали).

Теперь, если вы попытаетесь получить доступ к содержимому каталога, на который все еще указывает ваша исходная оболочка, он передает этот запрос в файловую систему как запрос на исходный индексный дескриптор, который с тех пор был переработан (и может даже использоваться для чего-то теперь совсем другое). Итак, вы получили stale file handleсообщение, потому что запросили несуществующие данные.

Когда вы выполняете cdоперацию, оболочка повторно оценивает расположение inode того места назначения, которое вы ему указываете. Теперь, когда ваша оболочка знает новый индексный дескриптор для каталога (и новые индексы для его содержимого), будущие запросы на его содержимое будут действительными.

dg99
источник
Ах, так это всего лишь способ обращения системы с недействительными / нулевыми указателями inode?
IDDQD
Да. Я не знаю достаточно деталей, чтобы знать, что произойдет, если, например, вы попытаетесь сослаться на индексный дескриптор, который уже был переработан, чтобы указать на что-то еще. Вы все равно получите устаревший дескриптор файла? Или вы получите неожиданные данные?
dg99
1
Я не думаю, что система будет использовать его повторно, поскольку кто-то на самом деле использует этот I-узел, имея его как текущий каталог.
Самуэль Ослунд