In this article I will show how to setup file synchronization between two Ubuntu server with unison. Unison is used to sync a file between two server. It is free open source file-synchronization tool similar to rsync, the main difference is that it synchronizes changes in both directions, for example if we change the file on one server it will replicated to another server and vice versa.
You will need to install unison on both the servers for example I have two server called linuxhost1 and linuxhost2. And we connect from lookhost1 to lookhost2 using SSH, we also need to install SSH packages on both servers. By default, its already installed on ther server. If its not found the server you can install this using below command.
$ apt-get -y install unison openssh-server ssh
Generate A Private/Public Key Pair On lookhost1 Server
Now we are going to create a private/public key pair on our lookhost1 server:
# ssh-keygen -t dsa Generating public/private dsa key pair. Enter file in which to save the key (/root/.ssh/id_dsa): [ENTER] Created directory '/root/.ssh'. Enter passphrase (empty for no passphrase): [ENTER] Enter same passphrase again: <-- ENTER Your identification has been saved in /root/.ssh/id_dsa. Your public key has been saved in /root/.ssh/id_dsa.pub. The key fingerprint is: ba:82:e1:a1:42:9b:d4:c8:99:c8:bd:8b:7d:4d:d4:66 [email protected] The key's randomart image is: +---[DSA 1024]----+ | | | | | . | | . E | |+ * . S | |.Ooo o | |ooo+. + | |oo=... o | |.. oo.. | +-----------------+
Note :- Please don’t enter a passphrase otherwise syncronize will not work without human interaction.
Now copy public key to lookhost2 server:
# ssh-copy-id -i $HOME/.ssh/id_dsa.pub [email protected] The authenticity of host '192.168.0.193 (192.168.0.193)' can't be established. ECDSA key fingerprint is 51:7f:b4:ed:bd:e3:fc:16:2f:55:5c:e1:2c:d7:3d:a9. Are you sure you want to continue connecting (yes/no)? [yes] /usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed /usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys [email protected]'s password: [lookhost2 root password] Number of key(s) added: 1
Now try logging into the machine, with: “ssh ‘[email protected]′”
and check to make sure that only the key(s) you wanted were added.
# cat $HOME/.ssh/authorized_keys ssh-dss AAAAB3NzaC1kc3MAAACBAKHLdAztIr8muZIlQYuE/4f75kmgTwWqJRZJ1dTqHDnHWsy48emDU8v85hxAPg43k9aF7/zAwpA0MNNNk5T9Tx/DyUkK/KcyVP2f4p8tvovrkUvoxsZACkTUmFqKdq2x6/AGfjsCRmkpLhZuad7r5rKEXHRh8KYGHqD1Id8wcpy5AAAAFQCww3OekKcKMshMAwBK3XQmmYEGUwAAAIEAgjztlwh8OFYxwQve/RrhI2sceCXwS/yjQyH7q0zdWB9Fr4s/16T2PLBT+7M3vb+JlPDO3JRqgaYbel1kS2F2iKrY0EX0FI3/9fVDfWoz3mhCscPLriqy5AcsHitxQNfiZgA5wDiSjWpk1v+FbIC+VuqbKdQuE4MBKj19N9YALIUAAACABQ4NDsa2UBc8jsxvghjoLhUWF7HChaCksXQcL6i98VNRcemtPC6wpIri75iR4Uhv1666bDOBAdmIBX9Qf7A/+czPKPaj4CGI1hVy1pgYMa3btnEvoSnH/ONtjpOz9q+3up1OOOn+5fud7xjJn+Fq8WoGROgarBpCbQU3w2GUUnM= [email protected]
Now we are going to run unsion firt time to synchronize the /var/www director on boht servers:
# unison /var/www ssh://lookhost2//var/www Contacting server... Connected [//lookhost1//var/www -> //lookhost2//var/www] Looking for changes Warning: No archive files were found for these roots, whose canonical names are: /var/www //lookhost2//var/www This can happen either because this is the first time you have synchronized these roots, or because you have upgraded Unison to a new version with a different archive format. Update detection may take a while on this run if the replicas are large. Unison will assume that the 'last synchronized state' of both replicas was completely empty. This means that any files that are different will be reported as conflicts, and any files that exist only on one replica will be judged as new and propagated to the other replica. If the two replicas are identical, then no changes will be reported. If you see this message repeatedly, it may be because one of your machines is getting its address from DHCP, which is causing its host name to change between synchronizations. See the documentation for the UNISONLOCALHOSTNAME environment variable for advice on how to correct this. Donations to the Unison project are gratefully accepted: http://www.cis.upenn.edu/~bcpierce/unison Press return to continue. <-- Press Enter Waiting for changes from server Reconciling changes local lookhost2 dir ----> example.com [f] <-- Press Enter dir ----> example.de [f] <-- Press Enter Proceed with propagating updates?  <-- Enter "y" Propagating updates UNISON 2.40.102 started propagating changes at 11:17:17.94 on 26 Aug 2017 [BGN] Copying example.com from /var/www to //lookhsot2//var/www [BGN] Copying example.de from /var/www to //lookhost2//var/www Shortcut: copied /var/www/example.de/web/index.html from local file /var/www/.unison.example.com.d3783bddaaf59b9ba4d2ed0433f9db63.unison.tmp/web/index.html [END] Copying example.de [END] Copying example.com UNISON 2.40.102 finished propagating changes at 11:17:17.94 on 26 Aug 2017 Saving synchronizer state Synchronization complete at 11:17:17 (2 items transferred, 0 skipped, 0 failed)
Now check /var/www directory on lookhost1 and lookhost2 server. You can see that they are in sync now.
If you don’t want to run unsion interactively, you can create a file on /root/.unison/default.prf that contain all setting.
# /root/.unison/default.prf # Roots of the synchronization root = /var/www root = ssh://lookhost2//var/www # Paths to synchronize #path = current #path = common #path = .netscape/bookmarks.html # Some regexps specifying names and paths to ignore #ignore = Path stats ## ignores /var/www/stats #ignore = Path stats/* ## ignores /var/www/stats/* #ignore = Path */stats ## ignores /var/www/somedir/stats, but not /var/www/a/b/c/stats #ignore = Name *stats ## ignores all files/directories that end with "stats" #ignore = Name stats* ## ignores all files/directories that begin with "stats" #ignore = Name *.tmp ## ignores all files with the extension .tmp # When set to true, this flag causes the user interface to skip # asking for confirmations on non-conflicting changes. (More # precisely, when the user interface is done setting the # propagation direction for one entry and is about to move to the # next, it will skip over all non-conflicting entries and go # directly to the next conflict.) auto=true # When this is set to true, the user interface will ask no # questions at all. Non-conflicting changes will be propagated; # conflicts will be skipped. batch=true # !When this is set to true, Unison will request an extra # confirmation if it appears that the entire replica has been # deleted, before propagating the change. If the batch flag is # also set, synchronization will be aborted. When the path # preference is used, the same confirmation will be requested for # top-level paths. (At the moment, this flag only affects the # text user interface.) See also the mountpoint preference. confirmbigdel=true # When this preference is set to true, Unison will use the # modification time and length of a file as a `pseudo inode # number' when scanning replicas for updates, instead of reading # the full contents of every file. Under Windows, this may cause # Unison to miss propagating an update if the modification time # and length of the file are both unchanged by the update. # However, Unison will never overwrite such an update with a # change from the other replica, since it always does a safe # check for updates just before propagating a change. Thus, it is # reasonable to use this switch under Windows most of the time # and occasionally run Unison once with fastcheck set to false, # if you are worried that Unison may have overlooked an update. # The default value of the preference is auto, which causes # Unison to use fast checking on Unix replicas (where it is safe) # and slow checking on Windows replicas. For backward # compatibility, yes, no, and default can be used in place of # true, false, and auto. See the section "Fast Checking" for more # information. fastcheck=true # When this flag is set to true, the group attributes of the # files are synchronized. Whether the group names or the group # identifiers are synchronizeddepends on the preference numerids. group=true # When this flag is set to true, the owner attributes of the # files are synchronized. Whether the owner names or the owner # identifiers are synchronizeddepends on the preference # extttnumerids. owner=true # Including the preference -prefer root causes Unison always to # resolve conflicts in favor of root, rather than asking for # guidance from the user. (The syntax of root is the same as for # the root preference, plus the special values newer and older.) # This preference is overridden by the preferpartial preference. # This preference should be used only if you are sure you know # what you are doing! prefer=newer # When this preference is set to true, the textual user interface # will print nothing at all, except in the case of errors. # Setting silent to true automatically sets the batch preference # to true. silent=true # When this flag is set to true, file modification times (but not # directory modtimes) are propagated. times=true
Specify the path directive, which you want to synchronize.
You can also check man page for more about available options.
# man unison
Now we have put all setting in the /root/.unison/default.prf file, we can run unison command without any options.
Set Cron Job For Unison
On Server lookhost1:
For automate synchronization we can set a cron job for on lookhost1 server:
# crontab -e */10 * * * * /usr/bin/unison &> /dev/null
Now run unison every 10 minutes.
Find full path of unison using below command:
# which unison