Linux中的“过时文件处理”是什么意思?


100

假设我打开了一个终端,并通过该终端cd进入了某个目录。通过另一个终端,我删除该目录,然后从相同的备份将其还原。当我尝试vim从第一个终端的同一目录中的文件进行操作时,为什么会收到有关陈旧文件句柄的错误消息?这是什么意思?(从侧面看,我发现可以通过绕过此问题cd $(pwd)。)


如果您将NFS从主机A挂载目录(命名为Adir)到主机B,然后对主机A上的Adir执行删除和恢复操作,则在访问主机上的Adir时也会出现错误“陈旧文件句柄” B. touch在主机A上使用该命令可以使其正常。
rustyhu

Answers:


83

当目录被删除时,索引节点对于该目录(和其内容的索引节点)被回收。您的外壳程序指向该目录的索引节点(及其内容的索引节点)的指针现在不再有效。从备份中还原目录时,不会(必须)重用旧的inode 。该目录及其内容存储在随机索引节点上。唯一保持不变的是目录对还原的目录重复使用相同的名称(因为您告诉过它)。

现在,如果您尝试访问原始外壳程序仍指向的目录的内容,它将把该请求作为对原始inode的请求传达给文件系统,此原始inode已被回收(甚至可能用于某些用途)现在完全不同)。这样您会收到一条stale file handle消息,因为您要求提供一些不存在的数据。

当您执行cd操作时,shell将重新评估您提供给它的目的地的inode位置。现在您的外壳程序知道该目录的新索引节点(及其内容的索引节点),以后对其内容的请求将是有效的。


嗯,这就是系统处理无效/空inode指针的方式吗?
IDDQD

是。我对这些细节一无所知,例如,如果您尝试引用已经被回收的inode指向其他对象,将会发生什么情况。您还会获得陈旧的文件句柄吗?还是会得到意外的数据?
dg99

1
我不认为系统会重用它,因为有人实际上通过将其作为当前目录来使用该I节点。
塞缪尔·奥斯隆(SamuelÅslund),
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.