Btrfs 子卷问题

Btrfs 子卷问题

关于 Btrfs 的几个问题:

  1. 在其上创建子卷之前是否必须安装 Btrfs 文件系统?
  2. 我可以轻松地将现有目录转换为子卷吗? (即,如果我想使“/home”成为一个单独的子卷,我可以直接mk_btrfs_subfolder /home(或无论命令是什么),而不必创建一个新的空子卷并复制所有内容吗?

执行上述操作的命令很好,但不是必需的,只需是/否就可以了,我可以谷歌如何操作。

答案1

是的,您必须安装它,如果您想将目录转换为子卷,您可以使用以下命令创建快照

btrfs subvolume snapshot <name of subvolume containing folder> @new_subvol

然后,您可以进入子卷并删除除 @new_subvol/home 之外的所有内容,然后将 home 中的所有内容移动到新子卷的根目录,例如

mv @new_subvol/home/* @new_subvol

然后,您可以删除原始目录并将新创建的快照移至其位置。

答案2

  1. 是的。
  2. 不。

至少目前不是。


答案3

我可以轻松地将现有目录转换为子卷吗? (即,如果我想使“/home”成为一个单独的子卷,我可以直接转到 mk_btrfs_subfolder /home (或任何命令),而不必创建一个新的空子卷并复制所有内容吗?

对于大型子卷,最不坏的方法是将子卷创建为快照,然后进行清理。这避免了实际复制任何文件数据,尽管它确实意味着一堆元数据更新,如果本机支持的话,这些更新是不必要的。

安德鲁在他的回答中提到了这一点,但没有给出完整的示例,所以这里是一个。我采取了与他略有不同的方法,首先将旧目录移开,这样我就可以在其最终位置创建子卷。

cd /build/
mkdir xxxx
mv *-rpi-staging xxxx
btrfs subvolume snapshot /build /build/wheezy-armhf-rpi-staging
btrfs subvolume snapshot /build /build/jessie-armhf-rpi-staging
btrfs subvolume snapshot /build /build/stretch-armhf-rpi-staging
btrfs subvolume snapshot /build /build/buster-armhf-rpi-staging
cd /build/wheezy-armhf-rpi-staging/
find -maxdepth 1 ! -name xxxx ! -name . -exec rm -rf {} +
(shopt -s dotglob; mv -- xxxx/wheezy-armhf-rpi-staging/* . )
rm -rf xxxx
cd /build/jessie-armhf-rpi-staging/
find -maxdepth 1 ! -name xxxx ! -name . -exec rm -rf {} +
(shopt -s dotglob; mv -- xxxx/jessie-armhf-rpi-staging/* . )
rm -rf xxxx
cd /build/stretch-armhf-rpi-staging/
find -maxdepth 1 ! -name xxxx ! -name . -exec rm -rf {} +
(shopt -s dotglob; mv -- xxxx/stretch-armhf-rpi-staging/* . )
rm -rf xxxx
cd /build/buster-armhf-rpi-staging/
find -maxdepth 1 ! -name xxxx ! -name . -exec rm -rf {} +
(shopt -s dotglob; mv -- xxxx/buster-armhf-rpi-staging/* . )
rm -rf xxxx

关于这个工作示例的注释。

  1. /build 是一个 btrfs 文件系统。
  2. wheezy-armhf-rpi-staging jessie-armhf-rpi-stagingstretch-armhf-rpi-staging 和 buster-armhf-rpi-staging 是要转换的目录。
  3. 这个例子是我实际所做的清理版本,如果其中有任何错误,请指出。
  4. 名为 xxxx 的文件/目录不应直接存在于要转换的目录下或直接存在于进行转换的顶级目录下。
  5. 我建议,如果您要在包含重要数据的系统上执行此操作,请先创建一个额外的快照,以便在出现问题时可以进行恢复。
  6. 假定使用的 shell 是 bash。

答案4

我可以轻松地将现有目录转换为子卷吗? (即,如果我想使“/home”成为一个单独的子卷,我可以直接转到 mk_btrfs_subfolder /home (或任何命令),而不必创建一个新的空子卷并复制所有内容吗?

我遇到了这个问题的一个特定版本:我的文件系统上有几个顶级 btrfs 子卷,它们由名为 snapper 的实用程序按特定计划进行快照。不幸的是,当涉及到经常更改的目录时,这可能会造成相当大的臃肿,其中我有很多想要排除的目录。

在初始设置时,从快照中排除特定路径很简单:只需在相关路径处创建一个新的 btrfs 子卷即可。不幸的是,一旦你有了一个正在运行的系统,事情就会变得有点复杂。

想法编写脚本并不难,所以我开始了一个小 bash 脚本。当然,随着我开始处理不同类型的输入、文件锁、权限等,这个小脚本很快就增长到了近 100 行。

如果您有类似的问题(您想要修剪的 snapper 管理的 btrfs 文件系统),我邀请您使用(风险自负):https://github.com/billwanjohi/snapper-exclude/blob/master/snapper-exclude.sh

相关内容