比 cp -a 更快的替代方案

比 cp -a 更快的替代方案

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

答案1

尝试tar, pax, cpio, 用一些缓冲。

(cd /home && bsdtar cf - .) |
  pv -trab -B 500M |
  (cd /dest && bsdtar xpSf -)

我建议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,即仅按顺序复制分配的块,因此旋转存储可能是最有效的。

部分克隆将其推广到几个不同的文件系统。

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

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

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

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

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

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

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

然后还有更复杂的文件系统,你无法通过复制文件来真正复制数据。例如,zfs或者btrfs当您可以拍摄子卷的快照并将它们分支出来时……这些将有自己的专用工具来复制数据。

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

答案2

我推荐rsync,例如:

rsync -av --progress --stats dest orig

或者,通过压缩传输:

rsync -avz --progress --stats dest orig

相关内容