
在日常运维中,我们经常需要在两个目录之间保持文件同步。无论是备份、数据整合还是服务文件共享,实时同步都是非常实用的需求。本文以 Linux 系统为例,使用 Unison + inotify-tools + systemd 实现 /data/syna1 到 /data/sync2 的实时同步,并总结了在配置过程中的常见问题及解决方法。
1. 安装必要软件
Unison 是一个强大的跨平台文件同步工具,支持增量同步和双向同步。为了实现实时监控,我们还需要 inotify-tools。
apt update
apt install unison inotify-tools -y- Unison:文件同步工具
- inotify-tools:Linux 文件系统事件监控工具,支持 Unison 的
repeat = watch功能
2. 创建 Unison 配置文件
Unison 使用配置文件(.prf)来指定同步的目录和其他选项。
创建目录和配置文件:
mkdir -p ~/.unison
nano ~/.unison/sync.prf在配置文件中写入以下内容(示例同步 /data/syna1 → /data/sync2):
# 同步源目录
root = /data/syna1
# 同步目标目录
root = /data/sync2
# 自动同步,无需手动确认
auto = true
batch = true
# 实时监控目录变化
repeat = watch
# 忽略权限差异,避免属性冲突
perms = 0- root:需要同步的两个目录
- auto = true 和 batch = true:自动处理冲突,避免交互提示
- repeat = watch:启用实时监控
- perms = 0:忽略文件权限差异,避免 Unison 因权限变化跳过同步
⚠️ 注意:文件必须在同一个文件系统中,否则 repeat = watch 可能无法正常工作。
3. 测试同步
首次同步可以手动运行:
unison sync输出示例如下:
Looking for changes
New file --> example.txt
Propagating updates
[BGN] Copying example.txt from /data/syna1 to /data/sync2
[END] Copying example.txt
Synchronization complete- 新文件已同步
- 属性冲突:可以通过
perms = 0忽略
4. 配置 systemd 实现后台实时同步
为了确保实时同步持续运行,即使系统重启也不受影响,可以使用 systemd 来管理 Unison 服务。
创建 systemd 服务文件
nano /etc/systemd/system/unison-sync.service写入以下内容:
[Unit]
Description=Unison Real-time Sync from /data/syna1 to /data/sync2
After=network.target
[Service]
Type=simple
User=root
ExecStart=/usr/bin/unison sync
Restart=always
RestartSec=5
StandardOutput=append:/root/.unison/unison.log
StandardError=append:/root/.unison/unison.log
[Install]
WantedBy=multi-user.target- User=root:以 root 用户运行,可访问任意目录
- ExecStart=/usr/bin/unison sync:使用我们创建的
sync.prf配置文件 - Restart=always:服务意外退出时自动重启
- StandardOutput 和 StandardError:记录日志,便于排查问题
启用并启动服务
systemctl daemon-reload
systemctl enable unison-sync
systemctl start unison-sync查看实时日志:
journalctl -u unison-sync -f文件一旦在 /data/syna1 中新增、修改或删除,会自动同步到 /data/sync2。
5. 常见问题及解决方法
1️⃣ 配置文件未找到
如果 systemd 日志报错:
Profile /root/.unison//root/.unison/sync.conf.prf does not exist解决方法:
- 确保配置文件名为
.prf。 systemd中的ExecStart应仅包含文件名,不带扩展名:
mv ~/.unison/sync.conf ~/.unison/sync.prf
ExecStart=/usr/bin/unison sync2️⃣ No file monitoring helper program found
原因:Linux 系统缺少 inotify 支持。
解决方法:
apt install inotify-tools -y3️⃣ 属性冲突 [CONFLICT] props changed on both sides
Unison 会检测目录和文件权限变化,如果权限不一致,会跳过同步。
解决方法:在 .prf 中加入:
perms = 0这样只同步文件内容,不强制同步权限。
4️⃣ nohup 不适合持续同步
nohup unison sync & 只会运行一次同步,执行完成后进程退出。
要实现实时持续同步,必须使用:
repeat = watch+inotify-tools- 或通过
systemd后台运行
6. 总结
通过本文教程,你可以实现:
- 实时同步:Unison 监控源目录变化并自动更新目标目录。
- 后台运行:通过
systemd服务实现开机自启,自动同步,无需手动干预。 - 日志管理:同步过程记录日志,便于排查问题。
- 稳定可靠:解决属性冲突、文件监控缺失等常见错误。
这个方案适用于备份目录、服务文件同步、音乐库同步等场景。
示例效果
在 /data/syna1 新增 test.mp3 文件:
touch /data/syna1/test.mp3Unison systemd 服务会自动检测并同步:
ls /data/sync2/
# 输出: test.mp3无需手动操作,完全实时同步。
评论0
暂时没有评论