我的根文件系统位于 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 中的子卷(我不想删除)。这让我想到了三个问题:
该选项有什么
-o
作用?如何仅列出下面的子卷
/chroot
如何删除子卷数量未知的目录?
我正在运行带有 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