问题描述

我有两台电脑,一台配置较低的笔记本装有FydeOS能连google可以下载fuchsia源码,但由于用的是容器里的Linux不方便连接设备调试。另一台是配置较高的台式机装Manjaro,不能连google但硬盘空间大、CPU快、能连设备。于是我打算拿笔记本下载源码,然后把源码拷贝到台式机上进行编译、下载、调试和看代码。那问题就来了,如何快速将几十个G的小文件传到局域网的另一台电脑上?

  1. 首先想到的是移动硬盘。但FydeOS竟然不识别移动硬盘,而且都是小文件太伤硬盘了,也不会很快。为啥不打包压缩后复制?因为代码要经常更新,整个文件夹打包不方便比较。
  2. 然后想到samba,但不知为何FydeOS竟然挂载不上samba服务器,而且也不方便比较差异。
  3. 之后尝试了一些软件比如Feem,但容器里的Linux和台式机不算同一局域网,互相连不上。
  4. 最后又尝试了FTP,能传输文件,但速度实在太慢了。

继续上网找方案,被我发现了一个简直是为我这种场景量身设计的工具:rsync

rsync简介

Rsync(remote sync) 是用于同步某一位置文件和目录到另一位置的有效方法。备份的位置可以在本地服务器或远程服务器。它具有以下特征:
速度:第一次的rsync同步源的整个内容目录到目标位置。之后,rsync只传递改变的块或字节到目标位置,使传输非常快。
安全:rsync在传输中允许使用ssh协议加密数据。
更少的带宽:rsync分别在发送和接收端对数据进行压缩和解压缩。所以在使用rsync传输数据时使用的带宽总是比使用其他文件传输协议来的少。

安装和启动

server端

Manjaro已经自带rsync工具了,可以用下面的命令确认一下。

  1. $ rsync --version
  2. rsync version v3.2.3 protocol version 31
  3. Copyright (C) 1996-2020 by Andrew Tridgell, Wayne Davison, and others.

修改配置文件。如果这个文件不存在可以手动创建。

  1. $ sudo vim /etc/rsyncd.conf
  2. uid = zachary
  3. gid = zachary
  4. use chroot = no
  5. max connections = 3000
  6. syslog facility = local5
  7. pid file = /run/rsyncd.pid
  8. [ftp]
  9. path = /home/zachary/code
  10. comment = ftp area

以daemon的形式启动rsync,并ps看一下进程确实存在了。

  1. $ sudo rsync --daemon --config=/etc/rsyncd.conf
  2. $ ps -ef | grep rsync
  3. root 10059 1 0 12:06 ? 00:00:00 rsync --daemon --config=/etc/rsyncd.conf
  4. zachary 10080 6289 0 12:06 pts/0 00:00:00 grep --colour=auto rsync

由于rsync要用到ssh协议,所以也要启动sshd。

  1. sudo systemctl start sshd.service

对于Ubuntu系统可能需要先手动安装openssh-server。

  1. sudo apt install openssh-server

如果需要修改ssh默认配置比如端口号,可以编辑配置文件。

  1. $ sudo vim /etc/ssh/sshd_config

client端

首先可以用telnet试一下对方873端口能不能连上。

  1. $ telnet 192.168.3.6 873
  2. Trying 192.168.3.6...
  3. Connected to 192.168.3.6.
  4. Escape character is '^]'.
  5. @RSYNCD: 31.0

如果可以连上并显示RSYNCD字符就证明server端没问题了。
然后可以传输一个文件试一下。

  1. $ rsync -avz bootstrap.sh zachary@192.168.3.6:/home/zachary/code

第一次使用会提示是否继续连接,输入yes即可。连接成功后会提示输入目标设备的密码,输入正确密码后就应该开始同步了。如果能传输成功,就可以传输整个文件夹了。

  1. $ 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,内容如下:

  1. out
  2. .git
  3. .ssh
  4. .fx-build-dir
  5. .fx-ssh-path
  6. compile_commands.json
  7. rust-project.json

然后执行命令:

  1. $ rsync -avz --exclude-from=fuchsia_exclude.txt fuchsia/ zachary@192.168.3.6:/home/zachary/code/fuchsia

以后每次更新源码后都可以用rsync同步到台式机上,而且只会同步有改动的文件,方便查看哪些功能有更新。
需要注意的是,使用rsync前要断开VPN,否则两台电脑就不在同一个局域网内了。