感谢Scott Pack的精彩回答(以前我不知道如何使用ssh做到这一点),所以我可以提供这一改进(如果bash是您的shell)。这将添加并行压缩,进度指示器并检查整个网络链接的完整性:
tar c file_list |
tee >(sha512sum >&2) |
pv -prab |
pigz -9 |
ssh [user@]remote_host '
gunzip |
tee >(sha512sum >&2) |
tar xC /directory/to/extract/to
'
pv是用于管道的不错的进度查看器程序,并且pigz是并行gzip程序,默认情况下使用的线程数与CPU的数量相同(我相信最多为8个)。您可以调整压缩级别,以更好地适应CPU与网络带宽的比率,pxz -9e并pxz -d在您的CPU比带宽更多的情况下将其替换掉。您只需在完成时验证两个总和是否匹配即可。
对于大量数据和高延迟网络,此选项很有用,但在链路不稳定且掉线的情况下,此选项不是很有用。在这种情况下,rsync可以恢复,因此可能是最佳选择。
样本输出:
6c1fe5a75cc0280709a794bdfd23d7b8b655f0bbb4c320e59729c5cd952b4b1f84861b52d1eddb601259e78249d3e6618f8a1edbd20b281d6cd15f80c8593c3e - ]
176MiB [9.36MiB/s] [9.36MiB/s] [ <=> ]
6c1fe5a75cc0280709a794bdfd23d7b8b655f0bbb4c320e59729c5cd952b4b1f84861b52d1eddb601259e78249d3e6618f8a1edbd20b281d6cd15f80c8593c3e -
对于块设备:
dd if=/dev/src_device bs=1024k |
tee >(sha512sum >&2) |
pv -prab |
pigz -9 |
ssh [user@]remote_host '
gunzip |
tee >(sha512sum >&2) |
dd of=/dev/src_device bs=1024k
'
显然,请确保它们的大小或限制与count =,skip =,seek =等相同。
当我以这种方式复制文件系统时,我通常会首先dd if=/dev/zero of=/thefs/zero.dat bs=64k && sync && rm /thefs/zero.dat && umount /thefs将大多数未使用的空间归零,这会加快xfer的速度。