问题描述
我有两台电脑,一台配置较低的笔记本装有FydeOS能连google可以下载fuchsia源码,但由于用的是容器里的Linux不方便连接设备调试。另一台是配置较高的台式机装Manjaro,不能连google但硬盘空间大、CPU快、能连设备。于是我打算拿笔记本下载源码,然后把源码拷贝到台式机上进行编译、下载、调试和看代码。那问题就来了,如何快速将几十个G的小文件传到局域网的另一台电脑上?
- 首先想到的是移动硬盘。但FydeOS竟然不识别移动硬盘,而且都是小文件太伤硬盘了,也不会很快。为啥不打包压缩后复制?因为代码要经常更新,整个文件夹打包不方便比较。
- 然后想到samba,但不知为何FydeOS竟然挂载不上samba服务器,而且也不方便比较差异。
- 之后尝试了一些软件比如Feem,但容器里的Linux和台式机不算同一局域网,互相连不上。
- 最后又尝试了FTP,能传输文件,但速度实在太慢了。
继续上网找方案,被我发现了一个简直是为我这种场景量身设计的工具:rsync
rsync简介
Rsync(remote sync) 是用于同步某一位置文件和目录到另一位置的有效方法。备份的位置可以在本地服务器或远程服务器。它具有以下特征:
速度:第一次的rsync同步源的整个内容目录到目标位置。之后,rsync只传递改变的块或字节到目标位置,使传输非常快。
安全:rsync在传输中允许使用ssh协议加密数据。
更少的带宽:rsync分别在发送和接收端对数据进行压缩和解压缩。所以在使用rsync传输数据时使用的带宽总是比使用其他文件传输协议来的少。
安装和启动
server端
Manjaro已经自带rsync工具了,可以用下面的命令确认一下。
$ rsync --version
rsync version v3.2.3 protocol version 31
Copyright (C) 1996-2020 by Andrew Tridgell, Wayne Davison, and others.
修改配置文件。如果这个文件不存在可以手动创建。
$ sudo vim /etc/rsyncd.conf
uid = zachary
gid = zachary
use chroot = no
max connections = 3000
syslog facility = local5
pid file = /run/rsyncd.pid
[ftp]
path = /home/zachary/code
comment = ftp area
以daemon的形式启动rsync,并ps看一下进程确实存在了。
$ sudo rsync --daemon --config=/etc/rsyncd.conf
$ ps -ef | grep rsync
root 10059 1 0 12:06 ? 00:00:00 rsync --daemon --config=/etc/rsyncd.conf
zachary 10080 6289 0 12:06 pts/0 00:00:00 grep --colour=auto rsync
由于rsync要用到ssh协议,所以也要启动sshd。
sudo systemctl start sshd.service
对于Ubuntu系统可能需要先手动安装openssh-server。
sudo apt install openssh-server
如果需要修改ssh默认配置比如端口号,可以编辑配置文件。
$ sudo vim /etc/ssh/sshd_config
client端
首先可以用telnet试一下对方873端口能不能连上。
$ telnet 192.168.3.6 873
Trying 192.168.3.6...
Connected to 192.168.3.6.
Escape character is '^]'.
@RSYNCD: 31.0
如果可以连上并显示RSYNCD字符就证明server端没问题了。
然后可以传输一个文件试一下。
$ rsync -avz bootstrap.sh zachary@192.168.3.6:/home/zachary/code
第一次使用会提示是否继续连接,输入yes即可。连接成功后会提示输入目标设备的密码,输入正确密码后就应该开始同步了。如果能传输成功,就可以传输整个文件夹了。
$ rsync -avz --exclude 'out' fuchsia/ zachary@192.168.3.6:/home/zachary/code/fuchsia
其中rsync的-a选项是archive的意思,加了之后有以下作用:
• 递归模式
• 同步软链接
• 同步权限
• 同步时间戳
• 同步属主和属组
-v选项是verbose,打印同步的文件名。
-z选项是compress,启用压缩,减小传输数据量。
—exclude后面可以指定排除的目录或文件。
如果要排除的文件较多,可以放到文件列表中,然后在命令中用—exclude-from=指定这个列表。
在HOME目录下新建一个文件叫fuchsia_exclude.txt,内容如下:
out
.git
.ssh
.fx-build-dir
.fx-ssh-path
compile_commands.json
rust-project.json
然后执行命令:
$ rsync -avz --exclude-from=fuchsia_exclude.txt fuchsia/ zachary@192.168.3.6:/home/zachary/code/fuchsia
以后每次更新源码后都可以用rsync同步到台式机上,而且只会同步有改动的文件,方便查看哪些功能有更新。
需要注意的是,使用rsync前要断开VPN,否则两台电脑就不在同一个局域网内了。