深入解析linux 的 rsyncd服务
rsyncd 是 rsync 的守护进程 (daemon) 模式,是 rsync 的两种核心工作模式之一。
-
Shell 模式 (ad-hoc):
rsync -avz /src user@host:/dest- 原理:通过 SSH 隧道传输。
- 优点:简单、安全(复用SSH)。
- 缺点:每次同步都需要 SSH 登录握手,同步大量小文件时,开销巨大,速度较慢。
-
Daemon 模式 (
rsyncd):rsync -avz /src user@host::module(注意双冒号::)- 原理:一个服务器(Server B)以后台服务形式常驻运行
rsyncd守护进程(默认873端口)。客户端(Server A)直接连接此端口。 - 优点:极快。省去了 SSH 的开销,非常适合高频、大量的文件同步(如Web服务器的uploads目录、日志、数据备份)。
- 缺点:需要额外配置;默认数据明文传输(但在可信的内网中,这是为了速度而做的权衡)。
- 原理:一个服务器(Server B)以后台服务形式常驻运行
这份文档将详细指导你如何配置 rsyncd,实现从 Server A 到 Server B 的高效文件同步。
🗄️ rsyncd 守护进程模式使用文档
1. 目标场景
我们设定一个典型的 Web 服务器备份场景:
-
Server A (源/Client)
- IP:
192.168.1.10 - 角色: 客户端 (Client),数据发送方。
- 同步目录:
/data/www/uploads/(PHP应用的用户上传目录)
- IP:
-
Server B (目标/Server)
- IP:
192.168.1.20 - 角色:
rsyncd守护进程 (Daemon),数据接收方。 - 备份目录:
/backup/web_uploads/
- IP:
2. (核心) 步骤一:配置 Server B (数据接收方)
Server B 是“服务端”,需要启动 rsyncd 服务并配置“模块”(Module)。
2.1 安装 rsync
(大部分 Linux 发行版已自带)
# CentOS/RHEL
sudo yum install rsync# Debian/Ubuntu
sudo apt install rsync
2.2 创建 rsyncd.conf 配置文件
这是 rsyncd 的灵魂。
创建并编辑 /etc/rsyncd.conf 文件:
sudo vi /etc/rsyncd.conf
粘贴以下配置:
# /etc/rsyncd.conf - rsyncd 守护进程配置
# --- 全局配置 (Global Settings) ---
uid = nobody # 进程运行的用户 (重要:用低权限用户)
gid = nobody # 进程运行的用户组
use chroot = no # 不锁定到 chroot (配置更简单)
max connections = 10 # 最大连接数
pid file = /var/run/rsyncd.pid
log file = /var/log/rsyncd.log
transfer logging = yes
log format = %t %a %m %f %b# --- 模块定义 (Module Definition) ---
# 定义一个名为 [web_uploads] 的模块
# 客户端将通过这个“模块名”来访问
[web_uploads]# 模块的注释comment = Web Server Uploads Backup# 模块在 Server B 上的“真实”文件路径path = /backup/web_uploads/# 是否只读 (no = 客户端可以写入)read only = no# 是否只写 (yes = 客户端只能写入,不能读取)# write only = yes# 允许连接的客户端 IP (用空格或逗号分隔)# (为了安全,强烈建议设置)hosts allow = 192.168.1.10# (可选) 拒绝的 IP,* 代表所有# hosts deny = *# 认证用户名 (这是“虚拟”用户名,不是系统用户)auth users = rsync_backup_user# 存放“虚拟用户名:密码”的文件secrets file = /etc/rsyncd.secrets
2.3 创建 rsyncd.secrets 认证文件
此文件用于 auth users 中定义的用户。
sudo vi /etc/rsyncd.secrets
粘贴以下内容 (格式为 username:password):
rsync_backup_user:Your_Secret_Password_Here
⚠️ 关键安全步骤: 必须设置严格的权限,只允许 root 读取此文件!
sudo chmod 600 /etc/rsyncd.secrets
2.4 确保备份目录存在且权限正确
rsyncd.conf 中 uid = nobody,这意味着 nobody 用户需要有写入 path 目录的权限。
# 创建备份目录
sudo mkdir -p /backup/web_uploads/# 将目录的所有权交给 nobody
sudo chown -R nobody:nobody /backup/web_uploads/
2.5 启动 rsyncd 服务
方式一 (推荐:使用 systemd)
如果你的发行版提供了 rsyncd.service 文件(CentOS 7+ 通常有):
# 启动服务
sudo systemctl start rsyncd# 设置开机自启
sudo systemctl enable rsyncd
方式二 (手动启动)
如果 systemctl 找不到服务,你可以手动启动守护进程:
sudo rsync --daemon
2.6 配置防火墙 (重要)
rsyncd 默认使用 TCP 873 端口。
使用 firewalld (CentOS/RHEL):
sudo firewall-cmd --add-port=873/tcp --permanent
sudo firewall-cmd --reload
使用 ufw (Ubuntu/Debian):
sudo ufw allow 873/tcp
sudo ufw reload
Server B 配置完成!
3. 步骤二:配置 Server A (数据发送方)
Server A 是“客户端”,负责发起同步命令。
3.1 创建密码文件 (为了自动化)
为了不在 cron 或脚本中暴露密码,我们将密码存在一个文件中。
# 在你希望执行同步的用户下(比如 www-data 或你自己的用户)
vi ~/.rsync_pass
文件内容(注意:只有密码,没有用户名):
Your_Secret_Password_Here
⚠️ 关键安全步骤: 同样设置严格的权限。
chmod 600 ~/.rsync_pass
3.2 运行 rsync 命令
这是最终的同步命令。
-a(archive): 归档模式,等于-rlptgoD。保留权限、时间戳、递归等。-v(verbose): 显示详细过程。-z(compress): 压缩传输(如果文件是文本,效果好;如果是图片/zip,可以去掉)。-P(progress/partial): 显示进度条,并支持断点续传。--delete: (危险但常用) 删除 Server B 上有、但 Server A 上没有的文件,保持两侧完全一致。--password-file: 指定我们刚创建的密码文件。
测试 (Dry Run):
在正式执行前,强烈建议先用 -n (或 --dry-run) 进行模拟运行。它只会显示将要发生什么,不会真的传输文件。
rsync -avzPn \/data/www/uploads/ \rsync_backup_user@192.168.1.20::web_uploads
正式执行命令:
rsync -avzP \--password-file=~/.rsync_pass \/data/www/uploads/ \rsync_backup_user@192.168.1.20::web_uploads
(带删除的完全镜像):
rsync -avzP --delete \--password-file=~/.rsync_pass \/data/www/uploads/ \rsync_backup_user@192.168.1.20::web_uploads
4. 命令详解与“陷阱”
4.1 “双冒号” ::
rsync_backup_user@192.168.1.20::web_uploads
rsync_backup_user:rsyncd.conf中auth users定义的虚拟用户。192.168.1.20:rsyncd服务器的 IP。::(双冒号): 告诉rsync客户端“我要使用 daemon 模式,连接 873 端口”。(如果是单冒号:,它会走 SSH 模式)。web_uploads:rsyncd.conf中定义的模块名[web_uploads]。
4.2 “斜杠” / (最重要的陷阱)
rsync 命令对源路径末尾的斜杠 / 极其敏感。
-
场景 1 (带斜杠):
rsync -av /data/www/uploads/ ...- 含义:同步
/uploads/里面的内容 (content) 到目标目录。 - 结果:
/backup/web_uploads/file.jpg
- 含义:同步
-
场景 2 (不带斜杠):
rsync -av /data/www/uploads ...- 含义:同步
/uploads这个文件夹本身 (folder) 到目标目录。 - 结果:
/backup/web_uploads/uploads/file.jpg(多了一层目录)
- 含义:同步
99% 的情况下,你想要的都是场景 1(带斜杠)。
5. 自动化 (Cron Job)
将命令加入 crontab 即可实现自动备份。
crontab -e
(每天凌晨 3:00 执行一次完全同步)
0 3 * * * rsync -a --delete --password-file=/home/user/.rsync_pass /data/www/uploads/ rsync_backup_user@192.168.1.20::web_uploads > /var/log/rsync_backup.log 2>&1
(注意:-v 和 -P 已被移除,因为在 cron 中不需要看进度条,-a 更安静)
