最近公司组织了开发机迁移的活动,需要将个人用的开发机,从一个平台迁移到另外一个上面去。
由于开发机使用了一阵子,导致了机器的磁盘上积攒了大量的文件,其中,小文件占了大多数,一般都是程序,临时文件,日志文件,还有一些 virtualenv 里面的文件和库。
我们一般能够使用的,在两台服务器之间传送文件的服务,不外乎如下几类:
- HTTP Server + Wget
- FTP Server + Wget
- scp
- rsync
所有这些选项,在传输速度上都是可以满足需求的,毕竟是公司内网; 可是它们在处理众多小文件的时候又遇到了瓶颈,光是扫描磁盘上的文件列表,都会花去很长的时间。所以解决这个问题,我们分成两步:
- 处理海量小文件
- 快速传输
对于问题 1, 我们使用 tar 来合并(但不压缩) 文件,可以做到在传输文件的时候屏蔽文件数量多带来的困扰; 问题 2 ,在网络环境比较好,同时不需要加密传输的情况下,可以使用 nc 命令来完成。
NC (Net Cat)
nc - arbitrary TCP and UDP connections and listens
nc 是一个专门用来完成 点对点的 TCP/UDP 传输的工具,它可以通过 -l 参数来完成监听一个端口,将发送到端口上的数据读入; 同时可以指定 一个 IP+端口,将数据发送到指定的地址去。
结合我们提到的需求,我们需要将 home 目录,从机器 A 传输到机器 B 上面去,可以才去如下步骤:
机器 B : 监听本机端口 X,并且将数据解包之后写入磁盘
cd ~
nc -l -p X | tar xv
机器 A :打包磁盘上的工具,然后发送到机器 B 的端口 X 上
cd ~
tar cv . | nc IP-B X
经过我们的测试,使用 nc 传输文件,速率大概是使用 scp 的大概 4 倍左右; 当然,具体的表现会根据你机器、网络配置的不同有所波动。
时间: 2024-08-01 09:36:15