如何重命名 BTRFS 子卷?

如何重命名 BTRFS 子卷?

我有一个 BTRFS 文件系统,里面有一组子卷。到目前为止一切顺利。我需要更改子卷的名称,不幸的是,该btrfs程序不允许我重命名子卷。使用 Google 搜索得到了一些结果,一个说我可以直接重命名mv,另一个说我可以直接snapshot重命名并删除旧子卷。在我使分区崩溃并必须从备份中重新加载它(它相当大)之前,我的问题是:

  • 目前重命名子卷的最佳方法是什么?
  • 这样做可以吗mv,或者它会使一些内部结构无效?
  • 制作新的快照并删除旧的子卷是可行的方法吗,或者这样做有一些缺点吗?

我知道一切仍处于实验阶段,但就我的目的而言,它运行得相当好(到目前为止,我每天都有增量备份)。

答案1

就是mv这样。这是Ubuntu 社区文档

为了进一步说明为什么这是正确的方法,这里引用了 btrfs 系统管理员指南中的一段话:

快照

快照只是一个子卷,它使用 btrfs 的 COW 功能与其他子卷共享其数据(和元数据)。一旦创建了 [可写] 快照,原始子卷和新快照子卷之间的状态就没有任何区别了。要回滚到快照,请卸载修改后的原始子卷,然后在其位置安装快照。此时,可以根据需要删除原始子卷。由于快照是子卷,因此也可以创建快照的快照。

答案2

有几件重要的事情需要注意。命名:

btrfs 子卷 - 独立于数据容器的inside文件系统。它表示为目录现有 FS 的子卷。如果您创建新的子卷,它将是空的,可以使用文件系统内的逻辑数据块。在数据应该在逻辑上分开的地方使用非常方便,例如不同的 VM 或不同的客户端在不同的子卷上。这允许very fast删除全部仅使用子卷删除命令即可删除逻辑数据块。

btrfs 快照 - 操作系统快照完成时子卷及其所有数据的副本existing。可用作恢复设置或更改的操作备份,例如制作子卷快照、进行更改(VM 或数据)、测试一切是否正常,在宽限期后删除快照。需要注意的是:快照可以是只读的(-r切换),因此可以用作 FS 更改的增量块,并可能传输到另一个 BTRFS!

当前(2016-12-30)BTRFS 的限制:

在子卷之间复制或移动数据,例如,mv dir1/dataset1 dir_subvolume1/产生所有实际 io 以将数据复制到另一个子卷,并在移动的情况下从原始子卷中删除。并且非常只需进行引用即可利用 BTRFS 的 COW 特性高效复制大量数据:

cp -a --reflink=always dir1/dataset1 dir_subvolume1/

如果需要的话:

rm -rf dir1/dataset1

只读子卷快照可以mv在现有目录级别重命名(用 移动),但不能重命名/移动到不同的子目录级别。例如,这mv /btrfs/subvol_snap1 /btrfs/.snaphots是不可能的,会产生没有太多解释的错误: mv: cannot move 'subvol_snap1' to '.snapshots/subvol_snap1': Read-only file system。为了能够移动这样的快照,您需要在新的首选位置创建现有只读快照的新只读快照,然后删除旧快照:

btrfs sub snap -r /btrfs/subvol_snap1 /btrfs/.snaphots/subvol_snap1
btrfs sub del /btrfs/subvol_snap1

只是为了更轻松的生活:

btrfs sub list /btrfs

我希望这将为所有新的 btrfs 粉丝节省大量时间 :)

答案3

如果要将根卷重命名为嵌套子卷,则需要对其进行快照,然后执行find $ROOT_VOL -xdev -delete删除根卷先前内容的操作。反向操作(将子卷重命名为根卷)似乎是不可能的。

相关内容