更快的替代 cp -a

Yur*_*j73 9 cp file-copy

对于 /home 到另一个磁盘的简单传输,我使用cp -a这在我看来是一种非常缓慢的方式。应该想知道一种更有效的方法来完成任务。我将 /home 挂载为逻辑卷,但目标磁盘不是 LVM 系统

Sté*_*las 16

尝试tar, pax, cpio, 缓冲一些东西。

(cd /home && bsdtar cf - .) |
  pv -trab -B 500M |
  (cd /dest && bsdtar xpSf -)
Run Code Online (Sandbox Code Playgroud)

我建议bsdtar而不是tar因为至少在某些 Linux 发行版上tar是 GNU tar,它与bsdtar(from libarchive)相反,不处理保留扩展属性或 ACL 或 linux 属性。

pv将缓冲多达 500M 的数据,因此可以更好地适应两个文件系统上读写速度的波动(尽管实际上,您的磁盘可能比另一个更慢,操作系统的写回机制将进行缓冲,如好吧,所以它可能不会有太大区别)。旧版本pv不支持-a(用于平均速度报告),您可以pv -B 200M在那里单独使用。

在任何情况下,那些都不会有 的限制cp,即按顺序进行读取写入。这里我们有两个tar并发工作,因此一个可以读取一个 FS,而另一个则忙于等待另一个 FS 完成写入。

对于 ext4,如果您要复制到至少与源一样大的分区,另请参阅clone2fs哪种工作方式ntfsclone,即仅按顺序复制分配的块,因此旋转存储可能是最有效的。

partclone将其概括为几个不同的文件系统。

现在克隆文件系统时需要考虑一些事项。

克隆将复制所有目录、文件及其内容......以及其他所有内容。现在,其他一切都因文件系统而异。即使我们只考虑传统 Unix 文件系统的共性,我们也必须考虑:

  • 链接:符号链接和硬链接。有时,我们必须考虑如何处理指向要克隆的文件系统/目录之外的绝对符号链接或符号链接
  • 最后修改、访问和更改时间:只能使用文件系统 API(cp、tar、rsync...)复制前两个
  • 稀疏性:你有一个 2TB 的稀疏文件,它是一个 VM 磁盘映像,只需要 3GB 的磁盘空间,其余的都是稀疏的,做一个简单的复制会填满目标驱动器。

然后,如果您考虑ext4大多数 Linux 文件系统,则必须考虑:

  • ACL 和其他扩展属性(如用于 的那些SELinux
  • Linux 属性,如不可变或仅附加标志

并非所有工具都支持所有这些,或者当它们支持时,您必须像--sparse, --acls... 选项一样明确启用它rsynctar... 当复制到不同的文件系统时,您必须考虑它们不支持的情况支持相同的功能集。

您可能还必须考虑文件系统本身的属性,例如 UUID、root 的保留空间、fsck 频率、日志记录行为、目录格式......

然后是更复杂的文件系统,你不能真正通过复制文件来复制数据。例如,zfs或者btrfs当您可以拍摄子卷的快照并将其分支时……那些将拥有自己的专用工具来复制数据。

如果您想确保复制所有内容,则块设备(或至少分配的块,如果可能的话)的字节到字节复制通常是最安全的。但是要注意 UUID 冲突问题,这意味着您要复制到更大的东西上(尽管您可以在复制之前调整源快照副本的大小)。