如何在不使用btrfs复制数据的情况下复制文件?


14

我没有使用btrfs的经验,但是它被宣传为能够删除重复数据文件。

在我的应用程序中,我需要复制整个目录树。

据我了解,btrfs仅在某些后期扫描中进行重复数据删除,而不是立即进行重复数据删除。即使只是使用cp似乎也不会触发任何重复数据删除(至少df表明复制文件的大小增加了磁盘使用量)。

我是否可以完全避免移动数据并btrfs直接告诉文件在另一个位置重复,而实际上只是克隆其元数据?

从本质上讲,类似于硬链接,但具有独立的元数据(权限,修改时间等)。


7
cp --reflink=always
mikeserv

3
请注意,这类似于硬链接。当您使用时cp --reflink=always,从用户角度来看,结果将以各种方式成为两个完全独立的文件。底层文件系统通过写时复制来抽象这一事实只是实现细节。您不会得到“硬链接,但具有独立的元数据”。据我所知,btrfs尚未进行任何自动重复数据删除。我认为这是一个未来的计划,但我对此并不乐观。
ormaaj

@ormaaj-硬链接将没有独立的元数据。Udo询问实现细节。当您对文件进行reflink时,您实际上是在克隆其元数据。只有当引用独立更改时,文件才会分开-这就是重复数据删除的全部内容!
mikeserv

1
@mikeserv Er,我很确定重复数据删除具有不同的含义。重复数据删除将获取现有的冗余数据副本并重新统一它。COW是最小化重复的一种手段,它不是重复数据删除。
ormaaj 2015年

@ormaaj-我认为这很奇怪:重复数据删除与最小化重复无关。
mikeserv

Answers:


12

有两种选择:

  1. cp --reflink=always
  2. cp --reflink=auto

第二种几乎总是比第一种更好。使用auto表示如果文件系统不支持重新链接(例如ext4或复制到NFS共享),它将退回到进行真正的复制。使用第一个选项,我很确定它将彻底失败并停止复制。

如果您将此作为脚本的一部分使用,而该脚本需要在不理想的情况下保持稳健,则可auto以为您带来更好的服务。


你是埃里克·埃斯特拉达吗?
mikeserv

2
@mikeserv大声笑,不。我的名字叫伊桑。不过那会很有趣。Eric Estrada:白天为演员,夜间为sysadmin。信不信由你,这是十多年eestrada以来第一次有人问我这个问题。
eestrada

2
当然,埃里克。无论如何,好的答案。
mikeserv
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.