我有一台小型 Linux 服务器 (Debian Squeeze),它运行一个 Samba 服务器,该服务器配置为与一些 Windows 机器共享一些文件夹。当我尝试从 Windows 中删除其中一个目录时,我收到“无法删除文件夹”错误。
我尝试从 Linux 的控制台删除该目录,但出现了类似的错误:
# rm dir-name -rf
rm: cannot remove `dir-name': Directory not empty
我列出了目录的内容,发现一个名为 .fuse_hidden 的文件,后跟一个十六进制数(000bd8c100000185)。
# ls -la dir-name
-rwxrwxrwx 1 root root 5120 Feb 13 11:46 .fuse_hidden000bd8c100000185
我试图删除.fuse_hidden 文件,但立即创建了一个新文件(注意十六进制数的变化)。
# rm dir-name/.fuse_hidden000bd8c100000185
# ls -la dir-name
-rwxrwxrwx 1 root root 5120 Feb 13 11:46 .fuse_hidden000bd8c100000186
我也尝试使用 Midnight Commander 删除该文件,但没有成功。
到目前为止我发现的其他解决方案涉及 GUI 并且我只有控制台。
任何建议都值得赞赏。
答案1
这类似于删除另一个系统在 NFS 挂载上打开的文件时发生的情况。问题是该文件已从文件系统中删除,而其“链接数”大于 1,这意味着其他进程仍将其保持打开状态。
- 登录到文件物理所在的系统。(无网络挂载)
- 执行
lsof dir-name/.fuse_hidden000bd8c100000185
以找出哪些进程正在打开文件句柄。 - 如果有意义的话,终止这些进程,或者弄清楚可以执行哪些步骤来“优雅地”释放打开的文件句柄而不终止进程。
通常情况下,当您删除本地文件系统上另一个进程已打开的文件时,操作系统会遵从您的请求并将其从目录树中删除,但操作系统仍认为该树指向的 inode 正在使用中。每次打开文件时,其“链接计数”都会增加一,并且只有当该链接计数达到零时,空间才会真正释放。
当你遇到这种性质的问题时,这意味着操作系统出于某种原因决定不是从目录树中删除该文件:通常是因为它有理由相信它仍然需要被无法使用直接 inode 编号的东西访问。它最初可能看起来是遵从的,但在后台,操作系统会将其重命名为具有隐藏的点前缀,以便仍然可以通过某种形式的文件系统路径寻址来访问它。当链接计数达到零时,空间仍将被释放,但该对象将保留在目录中,直到链接消失。
答案2
感谢这些建议,但对我没什么用。但我找到了一个解决方案:我将外部 SSD 移到运行 Windows 的 PC 上。使用文件资源管理器(选中“隐藏项目”),我导航到目录.Trashes
并能够删除该.fuser_hidden
文件。
希望这可以帮助!