Files

不可刪除的目錄

  • July 26, 2015

我嘗試過的一切(始終具有超級使用者權限)都失敗了:

# 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命令的初始 WARNING 消息有Input/output error而不是Permission denied. (這個微小的差異本身已經足夠令人費解了,但是,無論如何……)

我怎樣才能刪除這個目錄?

# 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 使用者掛載的 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

引用自:https://unix.stackexchange.com/questions/218491