空のディレクトリ (btrfs ファイルシステム) を削除するにはどうすればいいですか?

空のディレクトリ (btrfs ファイルシステム) を削除するにはどうすればいいですか?

実験的なファイルシステムを使用していますbtrfs

私のディレクトリは次のようになります:

 ls -la empytfolder
 total 4
 drwxr-xr-x 1 root root   0 19. Mär 14:00 .
 drwxr-xr-x 1 root root 298 19. Mär 13:59 ..

削除しようとしましたrm -rf emptyfolderが、エラーが発生しますrm: cannot remove directory: directory not empty?。空のフォルダーを削除するにはどうすればよいですか? このフォルダーに 4 つのファイルがあるのはなぜですか? ルート ユーザーとして削除しようとしています。私のファイルシステムは btrfs です。

stat emptyfolder私に与えてくれるもの:

 Datei: „emptyfolder“
 Größe: 0           Blöcke: 0          EA Block: 4096   Verzeichnis
 Gerät: 21h/33d Inode: 256         Verknüpfungen: 1
 Zugriff: (0755/drwxr-xr-x)  Uid: (    0/    root)   Gid: (    0/    root)
 Zugriff    : 2012-03-19 14:00:28.205205566 +0100
 Modifiziert: 2012-03-19 14:00:23.925025572 +0100
 Geändert   : 2012-03-19 14:00:23.925025572 +0100
 Geburt    : -

システム クロックに問題があります。間違った時刻が表示されることがあります。

$ lsof +D emptyfolder
lsof: WARNING: can't stat() fuse.gvfs-fuse-daemon file system /home/user
/.gvfs Output information may be incomplete.

この gvfs-fuse-daemon とは何ですか? どうすれば削除できますか?

fuser -uv /dev/disk を試しましたが、効果はありませんでした。フォルダーにアクセスしているプロセスはありません。フォルダーを tmp に移動しました。

答え1

Btrfs FAQ - 空のディレクトリを削除できません:

最初のケース、 あなたが取得する場合:

rmdir: failed to remove ‘emptydir’: Operation not permitted 

これはおそらく、「emptydir」が実際にはサブボリュームであるためです。

これが当てはまるかどうかは、次の方法で確認できます。

btrfs subvolume list -a /mountpoint

サブボリュームを削除するには、次のコマンドを実行する必要があります。

btrfs subvolume delete emptydir

2番目のケース、 あなたが取得する場合:

rmdir: failed to remove ‘emptydir’: Directory not empty 

その場合、i_size がゼロでない空のディレクトリが存在する可能性があります。

これが当てはまるかどうかは、次の方法で確認できます。

stat -c %s emptydir
3196         <-- unexpected non-zero size

その (マウントされていない) ファイルシステムで実行するとbtrfs check、問題が確認され、他の問題のあるディレクトリ (存在する場合) が一覧表示されます。

同様の出力が得られます(抜粋):

checking fs roots
root 5 inode 557772 errors 200, dir isize wrong
root 266 inode 24021 errors 200, dir isize wrong ...

btrfs check --repairこのようなエラーは、btrfs-progs の最新バージョンを実行すれば修正できるはずです。

btrfs check --repair場合によっては、問題を解決するどころか、問題を悪化させる可能性があるため、軽々しく使用しないでください。

答え2

私はbtrfsパーティションで同様の症状を経験しました。

btrfs check --repair /dev/sdXY

問題は解決しました。見つかったエラーは次の形式です:

root X inode Y errors 200, dir isize wrong

そして

root X inode Y errors 80, file extent overlap

しかし、2 番目の種類のエラーは修復後も残っており、心配になってきました。

答え3

ReadyNAS ボックスの孤立したディレクトリでこの問題が発生しました。共有は GUI に表示されなくなりましたが、/data の下のディレクトリはこれまで存在していました。そのため、このフォルダを削除したかったのですが、rmdir が機能しません。

スナップショットを一つずつ削除しました

cd /data
btrfs subvolume delete ./VirtualBox1/.snapshots/309/snapshot
...
btrfs subvolume delete ./VirtualBox1/.snapshots/2/snapshot
btrfs subvolume delete ./VirtualBox1/.snapshots/1/snapshot
btrfs subvolume delete ./VirtualBox1/.snapshots

すべてのスナップショットを削除した後、「フォルダ」自体を削除することができました

btrfs subvolume delete ./VirtualBox1

答え4

cd空のディレクトリから を実行して、何lsof +D /path/to/emptydirが開いているか確認してみてください。ディレクトリの内容と使用方法によっては、何かがディレクトリを非常に高速に開閉していて、ls の実行時には何も入っていないのに の実行時には何か入っているという状況に遭遇するかもしれませんrm -fr emptydir。この場合は何も変わらないはずですが、 も実行してみてくださいrmdir emptydir

出力の先頭にある合計数ls(insgesamt は合計を意味すると思います) は、空のディレクトリを示しています。

ファイルシステムの種類を知っておくことも役立つと思います。また、実際fsckに実行してみて、それが役立つかどうかを確認してみるのもよいでしょう。

関連情報