对于Linux用户来说,在多台机器之间保持文件同步是一项常见任务。有时候可能同时使用笔记本电脑和台式机,管理家庭服务器和VPS,或者只是需要重要文件的额外副本备份。
如果是简单的备份,rsync和scp等工具效果很好,但如果你在两个Linux系统上都进行了更改,单向同步是不够的,毕竟可能会面临覆盖文件或丢失更新的风险。
这种情况下,Unison File Synchronizer(文件同步器)就派上了用场,它是一种双向同步工具,可以比较两侧的目录、检测变化并更新它们,以便两个位置始终保持一致。接下来将演示在Linux上按照和使用Unison文件同步器的一些基础知识。
在Linux系统上安装Unison
实际上可以从Linux发行版的软件包仓库安装Unison,也可以下载稳定版本。对于大多数用户来说,从仓库安装是最简单的方法:
sudo apt install unison [Debian、Ubuntu和Mint] sudo dnf install unison [RHEL/CentOS/Fedora和Rocky/AlmaLinux] sudo apk add unison [Alpine Linux] sudo pacman -S unison [Arch Linux] sudo zypper install unison [OpenSUSE] sudo pkg install unison [FreeBSD]
如果想要GUI版本,则可以使用以下命令安装它,不过GUI版本(unison-gtk)
仅在基于Debian的发行版上可用:
sudo apt install unison-gtk
安装完成,使用以下命令验证版本:
unison -version
重要提示:Unison对版本兼容性要求严格。如果你计划在两个Linux系统(例如,一台笔记本电脑和一台VPS)之间同步,则两者必须安装完全相同版本的Unison。否则,系统将拒绝连接。
Unison基本本地同步
在通过网络使用Unison之前,最好先同步同一台机器上的两个文件夹,这将简单帮你了解Unison的工作原理,同时无需担心远程连接或SSH(安全外壳协议)相关的问题。
假设你有两个文件夹:
~/Documents/work
→主要工作文件夹~/Backup/work_sync
→备份文件夹
要同步这些文件夹,请运行以下命令:
unison ~/Documents/work ~/Backup/work_sync
以下是该命令的详细工作步骤说明:
- 比较:Unison扫描两个目录并比较文件名、大小和时间戳
- 报告差异:列出了两个文件夹之间的所有差异
- 用户确认:如果有变化,Unison会询问你做什么:从左到右复制文件,从右到左复制文件,还是跳过它们
- 同步:一旦确认,Unison会更新两个目录以使它们匹配
提示:仅存在于一个文件夹中的文件会自动复制到另一个文件夹。如果文件在两个文件夹中都存在,但有不同的修改,Unison会提示你解决这个冲突。
这种双向同步的方式使Unison比单纯使用cp或rsync进行单向同步更安全。你可以在任何一方编辑文件,而不必担心丢失更新内容。
跨远程系统同步(使用SSH)
接下来让我们通过SSH在两台不同的机器之间同步文件,这意味着连接是加密且安全的。
这里假设你想要将本地~/Projects
文件夹与远程服务器同步,那么输入以下命令:
unison ~/Projects ssh://username@server-ip//home/username/Projects
以下是该命令的详细说明:
~/Projects
→ 你想要同步的本地目录ssh://username@server-ip//home/username/Projects
→ 远程机器上的完整路径,通过SSH访问- 请注意主机名后的双斜杠
(//)
:它们表示完整路径而不是相对路径
专业提示:建议设置基于SSH密钥的身份验证,这样就不必每次都输入密码,如果你以后想要自动执行同步任务,这一点至关重要。
使用配置文件实现自动化
每次输入冗长的Unison命令可能会很繁琐。幸运的是,Unison允许你创建配置文件,这些文件是为重复执行的同步任务保存的指令集。配置文件存储在~/.unison/
目录下,扩展名为.prf。
创建一个新的配置文件:
nano ~/.unison/work.prf
添加以下内容:
root = /home/youruser/Documents/work root = ssh://username@server-ip//home/username/Documents/work auto = true batch = true prefer = newer
以下是每个选项的详细解释:
root
→ 定义要同步的文件夹(本地和远程)auto = true
→ 自动执行同步,无需确认batch = true
→ 以非交互模式运行(对于脚本或cron作业有用)prefer = newer
→ 如果发生冲突,则保留最近修改时间的文件
现在只需运行以下命令,Unison将自动使用您的配置文件,无需每次都输入长命令。
unison work
运行连续同步(实时模式)
有时候你希望一种持续监控目录的观察模式,使目录在发生变化时自动保持同步,则可以输入以下命令:
unison work -repeat watch
使用此命令的作用在于:
- Unison会持续扫描你的目录以查找更改
- 任何一方添加或修改的文件都会自动同步
- 这对于文件不断更新的开发项目特别有用
注意:如果目录很大,监视模式可能会消耗更多的系统资源,因此请合理地使用它。
使用Cron安排同步任务
如果你更喜欢定期同步而不是持续监控,那么可以使用cron任务来安排Unison自动运行。
首先,编辑crontab:
crontab -e
添加以下行以每小时同步一次你的配置文件:
0 * * * * unison work -batch
以下是该命令的详细说明:
0 * * * *
→ 每小时运行一次unison work -batch
→ 以非交互模式执行你的工作配置文件
应该了解的常见Unison选项
以下是有用的Unison选项,可用快速的进行简单了解:
选项 | 描述 |
---|---|
-auto |
自动解决简单更新 |
-batch |
无需用户提示即可运行(对cron有用) |
-ui text |
强制终端文本模式界面 |
-repeat watch |
持续监视文件夹的变化 |
-prefer newer |
保留最近修改的文件,以免发生冲突 |
组合选项示例如下:
unison work -auto -batch -prefer newer
这将自动运行同步,通过保留较新的文件来解决冲突,并且不会提示你。
为什么选择Unison而不是其它工具
以下是选择Unison工具的特色优势,可用结合自身实际使用需求合理选用:
工具 | 同步类型 | 双向 | 可用的GUI | 用例 |
---|---|---|---|---|
rsync/scp | 单程 | ❌ | ❌ | 备份、服务器镜像 |
Unison | 双向 | ✅ | ✅(GTK) | 跨机器的活动项目 |
结论
总而言之,Unison是一款轻量级但功能强大的工具,适合需要在多台Linux机器之间保持一致性的用户。与rsync
等单向工具不同,它允许你安全地双向同步文件,防止意外覆盖和文件丢失,在某些使用场景下,其作用表现非常大。