複数のbtrfsサブボリュームを含むディレクトリを削除する方法は?

複数のbtrfsサブボリュームを含むディレクトリを削除する方法は?

私のルートファイルシステムはbtrfsパーティションにあります。私のディレクトリ/chrootにbtrfsサブボリュームが多いため、使用できませんrm -rf /chroot。すべてのサブボリュームを削除するには、/chroot以下のサブボリュームのみをリストしてみました-o。マニュアルページには、「指定されたパスの下のサブボリュームのみを印刷する」と記載されています。

# btrfs subvolume list -o /chroot
ID 593 gen 6616 top level 5 path chroot/base-devel/root
ID 594 gen 6618 top level 5 path chroot/multilib-devel/root
ID 595 gen 6620 top level 5 path chroot/base/root
ID 597 gen 6624 top level 5 path chroot/twm/root
ID 599 gen 6628 top level 5 path chroot/lxde/root
ID 601 gen 6655 top level 5 path chroot/wheezy/root
ID 602 gen 6684 top level 5 path chroot/sid/root
ID 603 gen 6862 top level 5 path var/lib/machines

驚くべきことに、これは/var/lib/macines(削除したくない)のサブボリュームを返します。これにより、3つの質問が発生します。

  1. このオプションの-o機能は何ですか?

  2. 下にサブボリュームのみをリストする方法/chroot

  3. サブボリュームの数が不明なディレクトリを削除する方法は?

私は4.2.5カーネルとbtrfs-progs v4.3.1がインストールされているArch Linuxを実行しています。

答え1

次のコマンドは、/chrootディレクトリ内のすべてのサブボリュームを削除します。

ls /chroot | xargs btrfs subvolume delete

btrfsサブボリュームの一部ではないファイルまたはディレクトリがある場合、エラーは印刷されますが削除されません。

(4.6.0カーネルとbtrfs-progs v3.17を使用してDebianでテスト済み)

答え2

btrfs subvolume delete <path>サポートされるパスワイルドカード

たとえば、スナップショットを作成するサブボリュームがあり、各スナップショットは独自のサブボリュームです。 (つまり、/mnt/newDrive/.snapshots/1/snapshot/new_subvol独自のサブボリューム):

user@machine:/mnt/newDrive/.snapshots$ tree
.
├── 1
│   ├── info.xml
│   └── snapshot
│       └── new_subvol
├── 104
│   ├── info.xml
│   └── snapshot
│       └── new_subvol
├── 111
│   ├── info.xml
│   └── snapshot
│       └── new_subvol

これらすべてのサブボリュームを削除するには、私がすべきことは次のとおりです。

sudo btrfs subvolume delete /mnt/newDrive/.snapshots/*/snapshot/new_subvol

その後、すべてのサブボリュームが消えて簡単に/mnt/newDrive/.snapshots削除できます。

rm -rf /mnt/newDrive/.snapshots

役に立ったことを願っています!

答え3

3番目の質問に答えるには、次のものを使用できます。btrfs-rm

docker ディレクトリ全体を定期的にクリーンアップするために、btrfs で実行される docker インストールでこれを使用します。使用によるリスクは本人負担ですが、私には効果があります(TM)。

sudo ./btrfs-rm  /var/lib/docker/*   # create clean empty dir for docker

ダウンロード:https://github.com/DirkTheDaring/btrfs-rm

関連情報