web-dev-qa-db-ja.com

削除できないディレクトリ

私が試したすべて(常にスーパーユーザー権限で)が失敗しました:

# 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があることです。 (この小さな違い自体はすでに十分に不可解ですが、何でも...)

このディレクトリを消去するにはどうすればよいですか?

5
kjo
_# rm -rf /path/to/undeletable
rm: cannot remove ‘/path/to/undeletable’: Is a directory
_

rmstat(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が失敗したことを確認します。ルートに権限がないのはなぜですか?これが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
    _