背景
一直以来,我都使用群晖(自带rsync
服务)来备份服务器上的文件,但是有个问题就是,群晖无法完全保留文件的属性。这样一来,如果真的有天需要用到这些备份文件时,修改权限又是一份工作量。
正好,家庭服务器主机上有个Raid5
阵列,可以为备份提供足够的安全保障,所以何不直接在家庭服务器上建立一个 rsync
服务器呢。
安装
|
|
目前大多数Linux发行版本都默认安装了rsync
工具,而且rsync
与ssh
结合就可以在任意包含这两个工具的主机上进行文件同步/备份,那我们为什么又要弄一个rsync
服务器呢?
rsync
与ssh
的结合是个强绑定,需要系统登陆账号,这本来不是问题,但是为了在脚本中使用,我们往往需要通过ssh-copy-id
将本机的密钥拷贝到远程主机上,用以实现无密码ssh
登陆。这就相当于打开了一扇没有上锁的大门,这在不是很受信的主机上做这样的事是非常危险的。
但这在rsync
服务器上就不一样了,下面我们慢慢讲。
配置服务
|
|
这时我们会看到ConditionPathExists=/etc/rsyncd.conf was not met
,不急,一步一步慢慢来,下面我们来添加一个配置文件:
|
|
(哈哈,借鉴了一下)
重点来了,注意此处的auth users
为独立用户,与系统登陆用户没有关联。
下面再创建个密码文件:
|
|
注意:此处的用户名必须与上面的auth users
相同。
我们可以使用openssl rand -base64 12
生成随机密码,更改后面的数字实现不同长度的密码。我个人就用这个命令生成各种token
、密码、随机字符等。
至此,就配置完成了,最后重启一下服务:
|
|
测试
查看873
端口是否开启
|
|
(这里使用sudo
可以看到具体命令行程序名称)
同步测试:
|
|
这里有两点需要注意:
- 使用
RSYNC_PASSWORD
指定密码,可以实现在脚本中免除密码输入。当然我们也可以使用--password-file
来指定参数文件,但需要注意,客户端的密码文件与服务端不一样,客户端的密码文件没有用户名(我真的有点不理解它的设计意图了)。 - 这里目标路径使用的是模块名
:backups
,这样不但隐藏了实际路径,也做到了前后端的分离,如果服务端变更路径就不需要对客户端进行同步修改。
日志
作为一个优秀的运维人员,保留日志是一个很好的习惯。
如果需要记录传输日志,可以在/etc/rsyncd.conf
文件开头添加两行:
|
|
这样,传输日志就会记录在syslog
中,可以使用journalctl -u rsync -f
来查看。
总结
其实,rsync
是一个古老而强大的工具,只是随着时代的发展而逐渐被人遗忘了。举个例子,我们可以使用rsync -avcz a/ b/
来实现桌面操作系统中常用的合并两个文件夹的操作。