对于我使用的 /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
... 的选项rsync
,tar
... 当复制到不同的文件系统时,您必须考虑它们不支持的情况支持相同的功能集。
您可能还必须考虑文件系统本身的属性,例如 UUID、根的保留空间、fsck 频率、日志记录行为、目录格式...
然后还有更复杂的文件系统,你无法通过复制文件来真正复制数据。例如,zfs
或者btrfs
当您可以拍摄子卷的快照并将它们分支出来时……这些将有自己的专用工具来复制数据。
如果您想确保复制所有内容,则块设备(或至少是可能的情况下分配的块)的字节到字节复制通常是最安全的。但要注意 UUID 冲突问题,这意味着您正在复制到更大的内容(尽管您可以在复制之前调整源快照副本的大小)。
答案2
我推荐rsync,例如:
rsync -av --progress --stats dest orig
或者,通过压缩传输:
rsync -avz --progress --stats dest orig