我尝试过的一切(始终具有超级用户权限)都失败了:
# rm -rf /path/to/undeletable
rm: cannot remove ‘/path/to/undeletable’: Is a directory
# rmdir /path/to/undeletable
rmdir: failed to remove ‘/path/to/undeletable’: Device or resource busy
# lsof +D /path/to/undeletable
lsof: WARNING: can't stat(/path/to/undeletable): Permission denied
lsof 4.86
latest revision: ftp://lsof.itap.purdue.edu/pub/tools/unix/lsof/
latest FAQ: ftp://lsof.itap.purdue.edu/pub/tools/unix/lsof/FAQ
latest man page: ftp://lsof.itap.purdue.edu/pub/tools/unix/lsof/lsof_man
usage: [-?abhKlnNoOPRtUvVX] [+|-c c] [+|-d s] [+D D] [+|-f[gG]] [+|-e s]
[-F [f]] [-g [s]] [-i [i]] [+|-L [l]] [+m [m]] [+|-M] [-o [o]] [-p s]
[+|-r [t]] [-s [p:s]] [-S [t]] [-T [t]] [-u s] [+|-w] [-x [fl]] [--] [names]
Use the ``-h'' option to get more help information.
当我在没有超级用户权限的情况下尝试上述任何操作时,结果基本相同。唯一的区别是lsof
命令中的初始警告消息已Input/output error
改为Permission denied
. (这个微小的差异本身就已经足够令人费解了,但是,无论如何......)
我怎样才能删除这个目录呢?
答案1
# rm -rf /path/to/undeletable rm: cannot remove ‘/path/to/undeletable’: Is a directory
rm
调用stat(2)
来检查是否/path/to/undeletable
是目录(将由 删除rmdir(2)
)或文件(将由 删除unlink(2)
。由于stat
调用失败(我们稍后会看到原因),rm
决定使用unlink
,这解释了错误消息。
# rmdir /path/to/undeletable rmdir: failed to remove ‘/path/to/undeletable’: Device or resource busy
“设备或资源繁忙”,而不是“目录不为空”。所以问题是该目录被某些东西使用,而不是它包含文件。最明显的“被某物使用”是它是一个挂载点。
# lsof +D /path/to/undeletable lsof: WARNING: can't stat(/path/to/undeletable): Permission denied
这证实了stat
目录失败。为什么root会没有权限呢?这是 FUSE 的限制:除非使用该allow_other
选项安装,否则 FUSE 文件系统只能由与提供 FUSE 驱动程序的进程具有相同用户 ID 的进程访问。甚至 root 也受到了影响。
因此,您有一个由非 root 用户安装的 FUSE 文件系统。你想让我做什么?
您很可能只是对该目录感到恼火并想要卸载它。根可以做到这一点。
umount /path/to/undeletable
如果您想删除挂载点但保留挂载点,请使用 移动它
mount --move
。 (仅限 Linux)mkdir /elsewhere/undeletable chown bob /elsewhere/undeletable mount --move /path/to/undeletable /elsewhere/undeletable mail bob -s 'I moved your mount point'
如果要删除该文件系统上的文件,请使用
su
或任何其他方法切换到该用户,然后删除文件。su bob -c 'rm -rf /path/to/undeletable'
如果要删除挂载点隐藏的文件而不中断挂载,请创建另一个不包含挂载点的视图并从其中删除文件。 (仅限 Linux)
mount --bind /path/to /mnt rm -rf /mnt/undeletable/* /mnt/undeletable/.[!.]* /mnt/undeletable/..?* umount /mnt