
Master Two-Way File Synchronization on Linux with Unison: A Comprehensive Guide
Keeping files and directories consistent across multiple computers can be a significant challenge. Whether you’re a developer synchronizing a project between a laptop and a server, or a system administrator maintaining configuration files across a fleet of machines, you need a reliable solution. While tools like rsync
are excellent for one-way transfers, they fall short when you need true two-way synchronization.
This is where Unison shines. Unison is a powerful, cross-platform file synchronization tool that excels at keeping two replicas of a file collection identical. It intelligently detects changes on both sides and propagates them to the other, handling updates, creations, and deletions with precision.
Why Choose Unison for File Sync?
Unison offers several key advantages that make it a superior choice for bidirectional synchronization tasks:
- True Two-Way Sync: Unlike backup utilities that simply overwrite a destination, Unison analyzes both directories (or “roots”) and determines the correct action for each file. If a file is changed on one machine, it’s updated on the other. If a new file is created, it’s copied over.
- Robust Conflict Detection: What happens if the same file is modified on both machines since the last sync? Unison won’t blindly overwrite one. It detects the conflict and asks you to resolve it, ensuring you never accidentally lose important changes.
- Network Efficiency: Unison uses an algorithm similar to
rsync
to transfer only the parts of a file that have changed, making it incredibly efficient over slow or metered network connections. - Cross-Platform Compatibility: Unison works seamlessly across Linux, macOS, and Windows, allowing you to synchronize files between different operating systems.
Getting Started: Installing Unison
Installation is straightforward using your distribution’s package manager. For Unison to work, it is crucial that you install the exact same version of Unison on both the local and remote machines. Mismatched versions will result in an error.
On Debian / Ubuntu:
sudo apt update
sudo apt install unison
On RHEL / CentOS / Fedora:
sudo dnf install unison
To verify your installation and check the version, run:
unison -version
Make sure the output of this command is identical on both systems you plan to sync.
Performing Your First Sync
The basic syntax for Unison is simple: unison <root1> <root2>
. The “roots” are the two directories you want to synchronize.
1. Local Synchronization
To sync two directories on the same machine, the command would look like this:
unison /home/user/documents /media/user/backup-drive/documents
Unison will scan both locations, present a summary of proposed changes, and ask for your confirmation before proceeding.
2. Remote Synchronization via SSH
The real power of Unison is in synchronizing with a remote server. This is done securely over SSH. The syntax specifies the remote path using an SSH URL format.
unison /home/user/project ssh://[email protected]//home/username/project
Note the double slash (//
) after the server name. This indicates you are specifying an absolute path on the remote server.
Streamlining Your Workflow with Unison Profiles
Typing out long commands every time is tedious and prone to error. Unison allows you to create configuration files, called “profiles,” to store your synchronization settings.
Profiles are simple text files stored in the ~/.unison/
directory with a .prf
extension. For example, let’s create a profile named project.prf
.
- Create the directory if it doesn’t exist:
mkdir ~/.unison
- Create and edit the profile file:
nano ~/.unison/project.prf
Add the following configuration, adjusting the paths to match your setup:
# Unison Profile for my web project
# The two roots to synchronize
root = /home/user/my-web-project
root = ssh://user@production-server//var/www/my-web-project
# Automatically accept default (non-conflicting) actions
auto = true
# Don't ask for confirmation on every run
batch = true
# Paths to ignore during synchronization
# Useful for log files, cache, or temporary uploads
ignore = Path temp
ignore = Path logs
ignore = Name *.bak
ignore = Name .git
# Use rsync transfer protocol for efficiency
fastcheck = true
Now, instead of typing the long command, you can simply run:
unison project
Unison will automatically load the settings from project.prf
.
Actionable Security and Automation Tips
1. Use SSH Keys for Passwordless Authentication
For seamless and secure remote synchronization, especially when automating, you should use SSH key-based authentication. This eliminates the need to enter your password every time you run Unison. If you haven’t set this up, you can generate a key pair with ssh-keygen
and copy the public key to your remote server with ssh-copy-id [email protected]
.
2. Automate Synchronization with Cron
You can easily automate your Unison sync tasks using a cron job. This is perfect for running nightly backups or keeping a project in sync throughout the day.
Open your crontab for editing:
crontab -e
To run the “project” profile sync every 30 minutes, you would add the following line:
*/30 * * * * /usr/bin/unison project > /dev/null 2>&1
This command runs your profile and discards the output, ensuring your system doesn’t email you after every successful run.
By mastering Unison, you gain a reliable and efficient tool to manage file consistency across all your Linux systems. Its ability to handle bidirectional changes intelligently makes it an indispensable utility for any serious user.
Source: https://www.tecmint.com/unison-file-synchronizer-linux/