需求说明
服务器A:172.17.166.10(源服务器,存放原始文件,IP仅为示例,请替换为你的A服务器真实IP)
服务器B:172.17.166.11(目标服务器,开机/重启自动拉取A服务器指定目录全部文件,IP仅为示例,请替换为你的B服务器真实IP)
实现逻辑:全部操作在【服务器B】执行,B开机后自动通过rsync从A拉取文件。
⚠️重要:文中所有出现的IP、目录、用户名全部为示例,部署前务必修改为你自己服务器实际信息。
第一步:服务器B配置免密SSH登录服务器A(必须操作)
登录服务器B,复制下面命令逐条执行:
# 生成ssh密钥,全部回车,不要输入密码
ssh-keygen -t ed25519
# 把公钥分发到服务器A,root为示例用户名,请替换为A服务器实际登录用户名
ssh-copy-id root@172.17.166.10
# 测试免密登录,执行后不需要输入密码直接登录A代表成功
ssh root@172.17.166.10
如果没有ssh-copy-id命令:手动把B服务器 ~/.ssh/id_ed25519.pub 文件内容复制,粘贴到A服务器 ~/.ssh/authorized_keys 文件末尾。
第二步:两台服务器安装rsync工具
服务器A和服务器B都执行对应安装命令:
CentOS / RHEL / Rocky Linux:
yum install -y rsync
Debian / Ubuntu:
apt install -y rsync
第三步:在服务器B创建同步脚本
示例目录:
A服务器源目录:
B服务器保存目录:
注意:目录末尾的斜杠
A服务器源目录:
/data/source/(替换为A真实目录,末尾斜杠 /不要丢)B服务器保存目录:
/data/target/(替换为B真实接收目录)注意:目录末尾的斜杠
/ 不能丢,代表同步目录内部全部文件。
登录服务器B,创建脚本文件 /opt/sync_from_a.sh
#!/bin/bash
# 等待网络就绪,防止开机网卡还没启动就执行同步
sleep 8
# ==========请修改下面3项为你自己实际信息==========
SRC_HOST="172.17.166.10" # A服务器真实IP
SRC_DIR="/data/source/" # A服务器源目录
DST_DIR="/data/target/" # B服务器本地保存目录
# =================================================
# 创建本地目录
mkdir -p ${DST_DIR}
# rsync拉取文件
# --delete 参数:B服务器会删除A不存在的文件,实现目录完全镜像;不需要镜像可以删掉--delete
/usr/bin/rsync -avz --delete root@${SRC_HOST}:${SRC_DIR} ${DST_DIR}
保存脚本后,给脚本增加执行权限:
chmod +x /opt/sync_from_a.sh
测试脚本是否可以正常同步
/opt/sync_from_a.sh
执行后看到文件正常下载,代表脚本没问题。
第四步:配置systemd实现开机自动执行
服务器B上创建systemd服务文件:/etc/systemd/system/sync_from_a.service
[Unit]
Description=Auto sync file from server A
After=network.target sshd.service
[Service]
Type=oneshot
ExecStart=/opt/sync_from_a.sh
User=root
[Install]
WantedBy=multi-user.target
执行下面命令生效并设置开机自启:
# 重载systemd配置
systemctl daemon-reload
# 设置开机启动
systemctl enable sync_from_a.service
# 手动运行一次测试
systemctl start sync_from_a.service
# 查看执行日志
journalctl -u sync_from_a.service
第五步:测试重启验证效果
服务器B执行重启命令:
reboot
重启登录B服务器,检查接收目录是否已经拉取A服务器文件。
查看开机同步日志:
journalctl -u sync_from_a.service
可选配置:定时周期性拉取(每10分钟同步一次)
如果希望不仅开机拉取,运行过程中定时拉取,配置crontab定时任务:
crontab -e
粘贴下面一行,保存退出:
*/10 * * * * /opt/sync_from_a.sh >> /var/log/sync_from_a.log 2>&1
常见问题排查
- 同步失败优先看日志:
journalctl -u sync_from_a.service - 确认A服务器防火墙开放22端口,B可以访问A的22端口
- 脚本内sleep 8是等待网络,如果你的服务器开机网络很慢,可以调大sleep数字,例如sleep 12
- 如果不用root用户,ssh免密、脚本里面的root全部替换成你的普通用户名,同时保证目录读写权限
- 当前方案:开机只执行一次拉取,不是实时监控文件变化;实时同步需要inotify+rsync方案
⚠️提示:
--delete 参数会删除B本地A服务器不存在的文件,生产环境谨慎使用;不需要镜像同步直接删除脚本中的 --delete。
© 版权声明
THE END

















![表情[baoquan]-服务器测评_云 VPS 推荐_运维技术教程与源码分享 - 环球云域数据平台 cloudidc.vip](https://cloudidc.vip/wp-content/themes/zibll/img/smilies/baoquan.gif)


暂无评论内容