Linux借助管道远程复制大量文件

遇到一个问题,转移网站图片,需要在Linux远程计算机之间复制大量文件(文件数量多,占用总空间也大),有多种方案。

1、下载到本地再上传到目标服务器。两个服务器都在国外,并且带宽很大,直接传输速度很快。但下载到本地的做法,大大受限于本机的网速,效率实在太低。

2、scp直接递归复制文件夹。貌似文件很多时,性能不是很好。

3、rsync复制。rsync最适合需要持续同步的情况,增量同步时可以自动对比差异,只同步差异的部分,并且会自动处理压缩、断点续传。对于直接复制的情况,根据网上一些人的观点,性能或许不太好。另外还需要安装rsync工具。

4、源主机上使用tar压缩后,使用scp复制,然后在目标主机上解压。这种方式有两个问题,一个问题是需要三个步骤,必须人工干预,而且耗时较多。第二个问题是硬盘可能会不够用,因为压缩和解压过程中,服务器上需要同时存下原始文件和压缩包,而如果其中一个服务器硬盘比较小,只能存一份文件,就没法处理了。例如假设服务器有20GB空间,系统占了5GB,图片原始文件又有10GB,压缩之后是8GB,服务器没法同时存下5+10+8GB的文件。

5、利用tar结合管道复制。源文件主机上执行tar打包,通过管道传输数据到目标主机,同时通过ssh调用目标主机的tar命令实时解包,只需要一条命令就可以解决问题。这种方法需要配置允许源文件主机用ssh登录目标主机。

我传输的是图片文件,之前本地测试过,压缩并不会节省多少数据量,因此直接使用了tar的打包和解包,没有用压缩(也就是参数z或者j)。如果是一些例如像代码这种压缩后会显著减小体积的情况,考虑到网络速度相对慢,启用压缩效果更佳。

命令如下,src_dir是源文件目录,dst_host是目标主机IP或者域名,/dst_dir是目标文件夹。

1
tar cf - src_dir  ssh user@dst_host "cd /dst_dir && tar xvf -"

参考资料
https://serverfault.com/questions/18125/how-to-copy-a-large-number-of-files-quickly-between-two-servers
https://serverfault.com/questions/208300/quickest-way-to-transfer-55gb-of-images-to-new-server
https://unix.stackexchange.com/questions/10026/how-can-i-best-copy-large-numbers-of-small-files-over-scp