rsync,著名同步软件。既可做本地同步,也可作网络同步。

本地同步

假设有两个目录,foo和bar,并有文件foo/main.c

执行

rsync -avz --delete foo bar

即可将foo同步到bar下,即foo是bar的一个子目录。如果只想把foo下的内容同步到bar,执行

rsync -avz --delete foo/* bar

说明:

  • -a启用档案模式,相当于-rlptgoD,包括递归,保持symbolic link,保持各种属性(具体请man)
  • -v启用verbose模式
  • -z启用压缩
  • --delete将源目录不存在的文件在目标目录删除

网络同步

假设Server IP为10.0.0.1。在Server上安装rsync,然后建立/修改配置文件/etc/rsyncd.conf如下:

# uid and gid for file transfer when rsyncd is run as root
uid = nobody
gid = nogroup

# bind to address
address = 10.0.0.1

# port
port = 837

# chroot to module dir
use chroot = yes

# maximum simultaneous connection
max connections = 4

# log file and pid file
log file = /var/log/rsyncd.log
pid file = /var/run/rsyncd.pid

# hosts allow and deny
hosts allow = 2001:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx/64, 10.0.0.1/24
hosts deny = *

[public]
        path = /home/user/public_dir
        comment = public directory

[private]
        path = /home/user/private_dir
        comment = private directory
        auth users = alice, bob
        secrets file = /etc/rsyncd.secrets
  • 其中837是默认端口。address, uid, gid自行修改。
  • hosts allow和hosts deny可以包含多个IPv4和IPv6地址,用逗号隔开。
  • 下面模块的名称,路径,注释也自行修改。
  • auth users指定允许连接的用户列表,若没有该行,那么默认所有人可以连接。
  • secrets file包含了auth users及其对应的密码,并且需要设置权限为其他人不可读,如600。本例中/etc/rsyncd.secrets文件为:

    alice:alice123
    bob:bob123
    

Note. 并不要求alice和bob是rsync server上实际存在的用户名。

保存后启动rsync server

/etc/rc.d/rsync start

从Client连接Server

rsync --list-only 10.0.0.1::

其中::表示以rsync daemon方式访问。应该可以看到:

public        public directory
private       private directory

这时就可以用

rsync -avz --delete 10.0.0.1::public ./dst

将Server上/home/user/public_dir下的内容(不包括/home/user/public_dir目录本身)同步到./dst目录下。

如果要同步private目录,需要先建立一个password文件。例如我们要以用户名alice同步private目录,那么建立alice.password, 内容为alice的明文密码,权限为600:

alice123

这时就可以用

rsync --password-file=alice.password -avz --delete alice@10.0.0.1::private ./dst

将Server上/home/user/private_dir下的内容(不包括/home/user/private_dir目录本身)同步到./dst目录下。

网络同步还有一种方式就是通过远程登录。这和本地同步很类似,只需要加上-e ssh,并把::改成:(就如同scp)及附上真实路径:

rsync -avz --delete -e ssh user@10.0.0.1:/home/user/sync_dir ./dst

这和上面那条命令的效果是一样的么?当然不是,别忘了加/*

rsync -avz --delete -e ssh user@10.0.0.1:/home/user/sync_dir/* ./dst

这就一样了。

rsync documentation is a good place to learn more: