Что означает «устаревший дескриптор файла» в Linux?
Скажем, у меня открыт терминал, и через него я cd перешел в какой-то каталог. Через другой терминал я удаляю этот каталог и восстанавливаю его из идентичной резервной копии. Когда я пытаюсь vim загрузить файл с первого терминала в том же каталоге, почему я получаю сообщение об устаревшем дескрипторе файла? Что это означает? (Кстати, я обнаружил, что эту проблему можно обойти с помощью cd $(pwd) .)
Если вы монтируете по NFS каталог (назовите его adir) с хоста A на хост B, а затем выполняете операцию удаления и восстановления для adir на хосте A, вы также можете получить ошибку «Дескриптор устаревшего файла» при доступе к adir на хосте. B. Используйте команду touch на хосте A, чтобы все стало нормально.
1 ответ
При удалении каталога повторно используется индексный дескриптор для этого каталога (и индексные дескрипторы его содержимого). Указатель вашей оболочки на индексный дескриптор этого каталога (и индексные дескрипторы его содержимого) больше не действителен. Когда каталог восстанавливается из резервной копии, старые inodes не (обязательно) повторно используются; каталог и его содержимое хранятся в случайных индексных дескрипторах. Единственное, что остается неизменным, — это то, что родительский каталог повторно использует то же имя для восстановленного каталога (потому что вы это сказали).
Теперь, если вы попытаетесь получить доступ к содержимому каталога, на который все еще указывает исходная оболочка, он передает этот запрос в файловую систему как запрос на исходный индексный дескриптор, который с тех пор был переработан (и может даже использоваться для чего-то теперь совсем другое). Итак, вы получили сообщение stale file handle , потому что вы запросили несуществующие данные.
Когда вы выполняете операцию cd , оболочка повторно оценивает расположение inode того места назначения, которое вы ей указываете. Теперь, когда ваша оболочка знает новый индексный дескриптор для каталога (и новые индексы для его содержимого), будущие запросы на его содержимое будут действительными.
Что означает «устаревший дескриптор файла» в Linux?
Скажем, что у меня открыт терминал, и через этот терминал у меня есть cd ‘ed в какой-то каталог. Через другой терминал я удаляю этот каталог и восстанавливаю его из идентичной резервной копии. Когда я пытаюсь выполнить vim файл с первого терминала, в том же каталоге, почему я получаю сообщение об ошибке с устаревшим дескриптором файла? Что это значит? (С другой стороны, я обнаружил, что эту проблему можно обойти через cd $(pwd) .)
ОТВЕТЫ
Ответ 1
Когда каталог удаляется, inode для этого каталога (и inodes для его содержимого) перерабатываются. Указатель, который ваша оболочка имеет для этого каталога inode (и его содержимого inodes), теперь уже недействительна. Когда каталог восстанавливается из резервной копии, старые inodes не используются (обязательно) повторно; каталог и его содержимое хранятся в случайных инодах. Единственное, что остается прежним, — это то, что родительский каталог использует одно и то же имя для восстановленного каталога (потому что вы сказали ему).
Теперь, если вы попытаетесь получить доступ к содержимому каталога, на который указывает ваша исходная оболочка, он передает этот запрос в файловую систему в качестве запроса на исходный индексный дескриптор, который с тех пор был переработан (и может даже быть включен теперь используйте что-то совершенно другое). Таким образом, вы получаете сообщение stale file handle , потому что вы запрашивали некоторые несуществующие данные.
Когда вы выполняете операцию cd , оболочка повторно оценивает местоположение inode любого места назначения, которое вы ему даете. Теперь, когда ваша оболочка знает новый inode для каталога (и новые inodes для его содержимого), будущие запросы на его содержимое будут действительны.
«Устаревший дескриптор файла» на подключенном общем ресурсе CIFS
Итак, у меня есть ящик Kali Linux 2019.4, на котором я запускаю ежемесячный скрипт, который монтирует 4 общих ресурса CIFS, из которых я беру пару файлов. Этот сценарий всегда работал без каких-либо проблем, но после обновления до 2019.4 около 1-2 недель назад, когда я запускаю сценарий, я получаю следующую ошибку для файлов внутри 1-го смонтированного общего ресурса CIFS:
OSError: [Errno 116] Stale file handle: $FILE_I_WANT_TO_COPY
Независимо от того, как я пытаюсь взаимодействовать с файлами внутри этого общего ресурса, ничего не работает, я всегда получаю ошибку «Дескриптор устаревшего файла». Единственное, что я могу сделать, это перечислить каталоги (ls). Другие общие ресурсы CIFS не имеют этой проблемы, и я могу без проблем копировать файлы из них в свой Kali Linux. Кроме того, я могу взаимодействовать (копировать, перемещать и т. Д.) С этими файлами из этого общего ресурса, если я использую систему Windows (Windows 10 v2004 (Insider Preview)).
Что я пытался (безуспешно), чтобы решить проблему:
- Размонтировать / смонтировать общий ресурс
- Перезагрузите систему
- Измените параметр vers в команде mount на 2.1 и 3.0
- Измените параметр кеширования в команде монтирования на none
- апт-обновление && апт-апгрейд
А пока я продолжу изучать различные возможные решения, с которыми я сталкиваюсь в Интернете, но если вы имеете какое-либо представление о том, что происходит и каково решение, я был бы признателен.