假设我打开了一个终端,并通过该终端cd
进入了某个目录。通过另一个终端,我删除了该目录并从相同的备份中将其恢复。当我尝试vim
从第一个终端访问同一目录中的文件时,为什么会收到有关陈旧文件句柄的错误?这是什么意思?(顺便说一句,我发现可以通过 绕过这个问题cd $(pwd)
。)
当目录被删除时,索引节点对于该目录(和其内容的索引节点)被回收。你的 shell 指向该目录的 inode(及其内容的 inode)的指针现在不再有效。当目录从备份中恢复时,旧的 inode不会(必须)重用;目录及其内容存储在随机 inode 上。唯一保持不变的是父目录对恢复的目录重用相同的名称(因为你告诉它)。
现在,如果你尝试访问原始 shell 仍指向的目录的内容,它将将该请求作为对原始 inode 的请求传达给文件系统,该原始 inode 已被回收(甚至可能用于某些用途)现在完全不同了)。因此,你收到一条stale file handle
消息,因为你要求提供一些不存在的数据。
当你执行cd
操作时,shell 会重新评估你提供给它的任何目的地的 inode 位置。现在你的 shell 知道目录的新 inode(以及其内容的新 inode),未来对其内容的请求将是有效的。
啊,所以这只是系统处理无效/空 inode 指针的方式?
是的。我不太了解细节,无法知道如果您尝试引用一个已经被回收的 inode 指向其他东西会发生什么。你还会得到一个陈旧的文件句柄吗?或者你会得到意想不到的数据?
我不认为系统会重用它,因为有人实际上是通过将它作为当前目录来使用该 I 节点。
那么如何解决呢?