本地与远程设备之间如何有效地进行文件同步?
The following article is from Linux大陆 Author ZhengN
点击关注公众号,一周多次包邮送书
来源:经授权转自 Linux大陆(ID:gh_45996d2b87a3)
作者:ZhengN
大家好,我是ZhnegN。
本次给大家分享一个工作中用到的关于拷贝的小技巧。
有这样一种场景:某项目中保存了很多图片文件在机器上,测试每次测试完程序都需要把所有图片拷到电脑上。
我们都知道,cp命令可以进行拷贝,但是cp命令的拷贝只能在同一台机器上进行拷贝。
在不同的机器上进行拷贝,可以使用scp,scp的常用用法如:
scp [可选参数] file_source file_target
参数说明:
-1:强制scp命令使用协议ssh1。 -2:强制scp命令使用协议ssh2。 -4:强制scp命令只使用IPv4寻址。 -6:强制scp命令只使用IPv6寻址。 -B:使用批处理模式(传输过程中不询问传输口令或短语)。 -C:允许压缩。(将-C标志传递给ssh,从而打开压缩功能)。 -p:保留原文件的修改时间,访问时间和访问权限。 -q:不显示传输进度条。 -r:递归复制整个目录。 -v:详细方式显示输出。scp和ssh(1)会显示出整个过程的调试信息。这些信息用于调试连接,验证和配置问题。 -c cipher:以cipher将数据传输进行加密,这个选项将直接传递给ssh。 -F ssh_config:指定一个替代的ssh配置文件,此参数直接传递给ssh。 -i identity_file:从指定文件中读取传输时使用的密钥文件,此参数直接传递给ssh。 -l limit:限定用户所能使用的带宽,以Kbit/s为单位。 -o ssh_option:如果习惯于使用ssh_config(5)中的参数传递方式, -P port:注意是大写的P, port是指定数据传输用到的端口号 -S program:指定加密传输时所使用的程序。此程序必须能够理解ssh(1)的选项。
应用实例:
# 把boa 可执行程序传到远程的 bin 目录
scp boa root@192.168.1.10:/bin
# 把远程的/bin下的boa程序拷贝到本地当前目录
scp root@192.168.1.10:/bin/boa .
但是,如果使用scp命令来拷贝我们大量的图片文件会存在如下问题:每次必须把程序停掉才能拷贝文件,这样拷贝的时间会很长,而且如果中途拷贝被中断了,重新进行拷贝时所有之前有拷贝过的文件仍被再拷贝一次,很费时。
所以整个测试的过程就是:测试->拷图片。拷图片的过程太长,会影响到下一次的测试。
有没有办法在程序运行期间也把图片拷贝出来呢?
当然是有的,使用rsync工具可以达到这样的效果。程序运行期间也把图片拷贝出来(同步到本地),而且不重复拷贝。
程序测试结束了,拷贝图片也正好结束或者稍晚一点结束,相当于这两个过程是个并行的过程,这样就可以大大提高测试的效率了。
rsync是什么?
rsync(remote sync)
是一个用于文件同步的工具。它可以用于两个本地目录之间的文件同步,也可以用于本地设备与远程设备之间的文件同步。
rsync与scp不同之处就是:rsync会检查发送方和接收方已有的文件,仅传输有变动的部分(默认规则是文件大小或修改时间有变动)。
rsync的使用
这里使用PC与开发板来进行演示。
注意:传输的双方都必须安装 rsync。
我们的开发板上并没有rsync,下面我们来一起编译一个。
下载rsync源码:
https://download.samba.org/pub/rsync/
解压、进入rsync-3.2.3、创建tmp文件夹:
tar -xvf rsync-3.2.3.tar.gz
cd rsync-3.2.3/
mkdir tmp
输入如下命令生成交叉编译的Makefile文件:
./configure --prefix=$PWD/tmp --host=arm-linux-gnueabihf CC=arm-linux-gnueabihf-gcc
此时可能会报如下错误:
根据提示进行修改。大概意思就是SIMD这个东西被使能了,SIMD是什么我们这里不需要管,我们关掉它即可。
输出命令 ./configure --help
查看配置参数,可以看到关闭SIMD的方式如:
输入:
./configure --prefix=$PWD/tmp --disable-simd --host=arm-linux-gnueabihf CC=arm-linux-gnueabihf-gcc
还是报错:
再次根据提示进行修改configure命令:
./configure --prefix=$PWD/tmp --disable-simd --disable-openssl --disable-xxhash --disable-zstd --disable-lz4 --host=arm-linux-gnueabihf CC=arm-linux-gnueabihf-gcc
这时候显示 rsync 3.2.3 configuration successful
:
可以生成了Makefile文件了。
注意:如果还有错误的话根据提示进行配置即可。
PS:关于Makefile文件的支持可查阅上一篇文章:Makefile常用基础知识梳理!
然后编译、安装:
make
make install
在tmp文件夹下得到:
其中,rsync可执行文件是我们板子要用到的,把其传到板子的/usr/bin目录下:
scp rsync root@192.168.1.108:/usr/bin
下面对rsync的使用进行一个简单的演示:
在板子上先建100个文件:
PC端同步板子里的这些文件到本地:
rsync -avzu --progress root@192.168.1.108:/root/test .
-a:表示存档模式,保存所有的元数据,比如修改时间(modification time)、权限、所有者等。 -v:表示输出细节。 -z:指定同步时压缩数据。 -u:表示同步时跳过目标目录中修改时间更新的文件。 --progress:表示显示进展。
板子再创建100个文件:
PC端再接着同步:
可以看到,文件是接着传的,前面已经传过的不会再重新传。
以上就是本次关于rsync这个小工具的简单分享。
还有其它类似的工具吗?欢迎留言讨论
相关资料:
https://www.ruanyifeng.com/blog/2020/08/rsync.html https://blog.csdn.net/weixin_42892101/article/details/104224587
推荐阅读
• 老板说我最近飘了,都敢用 MySQL 实现分布式锁了• 阿里终面:业务主表读写缓慢如何优化?• 函数调用时栈是如何变化的?• 9张图,32个案例带你轻松玩转Java stream• JVM 运行时数据区域,书中没有说清楚的方法区、永久代、元空间• 一个由“ YYYY-MM-dd ”引发的惨案 !• 能用js实现的最终用js实现,Shell脚本也不例外
👇更多内容请点击👇