如何删除具有多个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 中的子卷(我不想删除)。这让我想到了三个问题:

  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

要回答你的第三个问题,你可以使用btrfs-rm

我在 btrfs 上运行的 docker 安装上使用它,定期清理整个 docker 目录。使用风险自负,但对我有用(TM)。

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

下载:https://github.com/DirkTheDaring/btrfs-rm

相关内容