如何在Ubuntu 16.04上使用Unison备份大型目录

Unison是一个开源文件同步工具。在本教程中,您将在一对服务器上安装和配置Unison,并使用它备份目录。您还将配置Unison以使用SSH作为安全通信协议并创建一个cron作业。

作者选择了自由和开源基金作为Write for DOnations计划的一部分进行捐赠。

介绍

Unison是一个开源文件同步工具。 备份大型数据集非常有效,其中只添加或更新了少量文件。 例如,企业Samba文件服务器或电子邮件服务器中会出现这种情况。

这些服务器中的大多数文件将保持不变,而每天将添加或修改少量文件。 Unison能够非常快速地发现和备份这些新文件 - 即使有数百万个文件和太字节数据也是如此。 在这些情况下, rsync等传统工具可能需要更长的时间来执行相同的备份操作。

在本教程中,您将在一对服务器上安装和配置Unison,并使用它来备份目录。 您还将配置Unison以使用SSH作为安全通信协议,并创建一个cron作业以定期运行Unison。

先决条件

在开始本指南之前,您需要以下内容:

本指南将使用两个服务器:

  • 服务器:承载您将备份的数据的服务器。
  • 备份服务器:将托管备份数据的服务器。

第1步 - 创建其他非root用户

使用Ubuntu 16.04教程的初始服务器设置指导您在服务器和备份服务器上创建一个名为sammy的非root sudo用户。 在此步骤中,您将创建两个新用户,一个在服务器上,另一个在备份服务器上。 这可以防止在您完成指南时出现混淆,如果在指南末尾启用了SSH安全配置,则备份服务器上需要备用非root sudo用户。

您需要在两个终端窗口中通过SSH以sammy用户身份登录服务器和备份服务器。 以下两个SSH命令将登录到这些服务器:

ssh sammy@primary_server_ip
ssh sammy@backup_server_ip

首先,在服务器上使用以下命令创建名为primary_user的新用户:

sudo adduser primary_user

然后给他们sudo访问权限:

sudo usermod -aG sudo primary_user

最后,更改为primary_user帐户:

su - primary_user

接下来,在备份服务器上执行相同的步骤,但创建一个名为backup_user的新用户。 确保以本指南的其他用户身份登录服务器和备份服务器。

现在您已在两台服务器上创建了必要的用户,您可以继续安装Unison软件。

第2步 - 在两台服务器上安装Unison

在此步骤中,您将在两台服务器上安装Unison软件包。

您将使用Ubuntu软件包管理器apt在两台服务器上安装Unison。 在一段时间内第一次使用apt时,您应该使用以下命令更新本地包索引:

sudo apt-get update

这可确保您安装最新版本的Unison。 这也有助于避免安装错误。

接下来,安装Unison:

sudo apt-get install unison

您现在已经完成了Unison的安装。 在下一步中,您将配置SSH,以便Unison能够在两个服务器之间进行通信。

第3步 - 创建SSH密钥和配置SSH

您需要做的第一件事是在服务器上创建SSH密钥对,因为您将使用基于密钥的身份验证进行SSH连接。 基于密钥的身份验证的优点是无需输入密码即可实现安全连接。 这很重要,因为您将创建一个自动备份过程,该过程必须在每次发生时都不输入密码的情况下进行。

服务器上拥有该密钥对后,您将公钥复制到备份服务器,然后测试Unison是否能够使用SSH在服务器之间进行通信。

创建SSH密钥对时,通常使用强密码。 但是,Unison将自动运行,因此每次运行时都无法手动输入密码。 ENTER键而不输入密码。 这将生成无密码SSH密钥对。

服务器上的primary_user主目录运行以下命令以生成SSH密钥对:

ssh-keygen -t rsa -b 4096 -f .ssh/unison-primary

这里使用的选项意味着以下内容:

  • -t rsa :设置将创建的密钥类型。 RSA密钥是最兼容的类型。
  • -b 4096 :设置密钥的长度。 密钥越长,它就越安全。 密钥长度4096是RSA密钥的当前建议密钥长度。
  • -f .ssh/ unison-primary :设置密钥的名称和保存位置。 在这种情况下,您将使用您选择的名称将密钥保存到SSH的默认目录.ssh

上面显示的命令在以下两个文件中创建公钥和私钥SSH密钥:

  • .ssh/unison-primary
  • .ssh/unison-primary.pub

第一个是私有SSH密钥,第二个是公钥。 您需要将公钥文件的内容复制到备份服务器。 显示公钥文件内容以进行复制的最简单方法是使用cat命令将内容打印到终端:

cat .ssh/unison-primary.pub

backup_user主目录中的备份服务器上,使用文本编辑器打开.ssh/authorized_keys文件。 在这里,您将使用nano

nano .ssh/authorized_keys

将公钥粘贴到编辑器中,然后保存并退出。

您现在可以通过SSH从服务器登录备份来测试SSH配置是否正常工作。 这很重要,因为您需要接受并保存SSH服务器的备份服务器密钥指纹,否则Unison将无法运行。 服务器的终端中,从primary_user的主目录运行以下命令:

ssh -i .ssh/unison-primary backup_user@backup_server_ip

-i .ssh/ unison-primary选项指示SSH使用特定的密钥或标识文件。 在这里,您将使用您创建的新的unison-primary密钥。

Y ENTER然后按ENTER接受指纹,然后登录和注销。 您只需要确认SSH在服务器之间工作并保存备份服务器的SSH指纹。 指纹只能手动保存,因此必须在本教程后面的流程自动化之前完成。

接下来,通过从服务器上的primary_user主目录运行以下命令来检查Unison是否将连接:

ssh -i .ssh/unison-primary backup_user@backup.example.com unison -version

在此命令中,您使用了用于测试连接的相同SSH命令,并在最后添加了Unison命令。 当命令放在SSH连接的末尾时,SSH将登录,运行命令,然后退出。 unison -version命令指示Unison打印其版本号。

如果一切正常,您将看到一个响应,显示备份服务器上的Unison版本:

unison version 2.48.3

现在您已确认Unison可以使用SSH密钥在服务器之间进行通信,您已准备好继续配置Unison。

第4步 - 配置Unison

在此步骤中,您将配置Unison以在从服务器到备份服务器的目录上运行简单的单向备份。

要配置Unison,首先需要在服务器上的primary_user主目录下创建配置目录:

mkdir .unison

接下来,您需要在.unison目录的文本编辑器中打开名为default.prf的新文件。 该文件包含Unison配置。 使用以下命令打开文件:

nano .unison/default.prf

然后输入以下内容:

default.prf
force = /home/primary_user/data
sshargs = -i /home/primary_user/.ssh/unison-primary

这两行意思如下:

  • force :这确保将更改从服务器推送到备份服务器。 /home/ primary_user /data路径是保存要备份的数据的目录的位置。
  • sshargs :此选项指示Unison使用您生成的SSH密钥。

如果包含要备份的数据的目录不在primary_user主目录下,则必须确保primary_user可以读写它。 如果您不熟悉Linux的所有权和权限,请查看“ Linux权限简介”指南以了解更多信息。

现在配置了Unison,因此您可以通过备份目录继续测试它。

第5步 - 使用Unison备份目录

您已准备好在配置Unison时备份目录。 您将服务器上的/home/ primary_user /data目录备份备份服务器上的/home/ backup_user /data/目录。 包含要备份的数据的目录必须与您在force选项旁边的.unison/default.prf放置的目录相同。

您需要备份一些数据来测试Unison是否正常工作。 服务器上创建一些空文件,然后检查Unison是否将它们传输到备份服务器。

首先,通过从primary_user主目录运行以下命令,创建将保存要备份的数据的目录:

mkdir data/

接下来,使用touch命令创建五个空文件:

touch data/file{1..5}

命令的最后一部分file{1..5}使用Bash大括号扩展来创建五个文件。 当bash被赋予{1..5} ,它会自动填写缺少的数字24 此技术对于快速枚举多个文件很有用。

既然您已data目录和一些测试文件,则可以运行Unison将文件备份备份服务器。 以下命令将执行此操作:

unison -batch -auto /home/primary_user/data ssh://backup_user@backup_server_ip//home/backup_user/data

这些选项意味着:

  • batch :运行时不问任何问题。
  • auto :自动接受任何非冲突操作。

当您在简单的单向同步模式下使用Unison时,您不必解决任何冲突。 这意味着您可以安全地设置这些选项。

冲突只能在Unison的其他操作模式下发生,它在两个方向上同步。 这样的用例将同步某人的笔记本电脑和台式机上的目录。 当他们更新桌面上的文件时,他们希望将更改推送到笔记本电脑,反之亦然。 如果在发生Unison同步之前在两端修改了相同的文件,则会发生冲突,并且Unison无法自动决定要保留哪个文件以及要覆盖哪个文件。

在单向推送模式下,始终保留数据上的数据,并覆盖备份上的数据。

此命令将在第一次运行时打印长消息。 该消息如下:

Contacting server...
Connected [//primary_server_ip//home/primary_user/data -> //primary_server_ip//home/backup_user/data]
Looking for changes
Warning: No archive files were found for these roots, whose canonical names are:
        /home/primary_user/data
        //backup_server_ip//home/backup_user/data
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

  Waiting for changes from server
Reconciling changes
dir      ---->            /  
Propagating updates
UNISON 2.48.3 started propagating changes at 16:30:43.70 on 03 Apr 2019
[BGN] Copying  from /home/primary_user/data to //backup_server_ip//home/backup_user/data
[END] Copying  
UNISON 2.48.3 finished propagating changes at 16:30:43.71 on 03 Apr 2019
Saving synchronizer state
Synchronization complete at 16:30:43  (1 item transferred, 0 skipped, 0 failed)

此信息警告这是第一次同步。 如果您在每次同步运行时都看到此消息,它还会提供有关如何解决问题的提示。 最后一节告诉您在此次运行期间Unison同步了哪些数据。

在每次后续运行中,它将打印更少的信息。 这是没有文件更新时的输出:

Contacting server...
Connected [//primary_server_ip//home/primary_user/data -> //backup_server_ip//home/backup_user/data]
Looking for changes
  Waiting for changes from server
Reconciling changes
Nothing to do: replicas have not changed since last sync.

这是在服务器上修改/data/file1时的输出:

Contacting server...
Connected [//primary_server_ip//home/primary_user/data -> //backup_server_ip//home/backup_user/data]
Looking for changes
  Waiting for changes from server
Reconciling changes
changed  ---->            file1  
Propagating updates
UNISON 2.48.3 started propagating changes at 16:38:37.11 on 03 Apr 2019
[BGN] Updating file file1 from /home/primary_user/data to //backup_server_ip//home/backup_user/data
[END] Updating file file1
UNISON 2.48.3 finished propagating changes at 16:38:37.16 on 03 Apr 2019
Saving synchronizer state
Synchronization complete at 16:38:37  (1 item transferred, 0 skipped, 0 failed)

每次同步运行后, 备份服务器将在服务器上具有data目录的精确副本。

警告:运行Unison时, 备份服务器上data目录中的任何新文件或更改都将丢失。

您现在可以运行Unison来备份目录。 在下一步中,您将通过运行Unison with cron来自动执行备份过程。

第6步 - 创建Unison Cron作业

在本节中,您将创建一个cron作业,该作业将运行Unison并以指定的频率将data目录备份备份服务器。

crontab是一个由cron进程读取的文件。 它包含的命令被加载到cron进程中并以指定的时间间隔执行。

您可以通过运行以下命令来查看当前用户的crontab的内容:

crontab -l

-l选项列出当前用户的crontab的内容。 如果您之前没有编辑过crontab,您将看到以下信息:

# Edit this file to introduce tasks to be run by cron.
# 
# Each task to run has to be defined through a single line
# indicating with different fields when the task will be run
# and what command to run for the task
# 
# To define the time you can provide concrete values for
# minute (m), hour (h), day of month (dom), month (mon),
# and day of week (dow) or use '*' in these fields (for 'any').# 
# Notice that tasks will be started based on the cron's system
# daemon's notion of time and timezones.
# 
# Output of the crontab jobs (including errors) is sent through
# email to the user the crontab file belongs to (unless redirected).
# 
# For example, you can run a backup of all your user accounts
# at 5 a.m every week with:
# 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/
# 
# For more information see the manual pages of crontab(5) and cron(8)
# 
# m h  dom mon dow   command

接下来,在服务器上使用-e标志运行crontab命令,以在编辑模式下将其打开:

crontab -e

如果未配置默认命令行编辑器,则首次运行该命令时将要求您选择编辑器。 选择您选择的编辑器以打开crontab。

打开crontab后,将以下命令添加到现有文本下的第一个空行:

...
* */3 * * * /usr/bin/unison -log -logfile /var/log/unison.log -auto -batch -silent /home/primary_user/data ssh://backup_user@backup_server_ip//home/backup_user/data

您将使用的命令几乎与上面手动备份中使用的命令相同,但有一些其他选项。 这些附加选项如下:

  • -silent :禁用除错误之外的所有输出。 从crontab执行Unison时不需要正常输出,因为没有人可以读取它。
  • -log :指示Unison记录其操作。
  • -logfile :指定Unison将记录其操作的位置。

在此示例中,Unison每3小时运行一次。 您可以将其更改为更符合您要求的任何频率。

无论何时编辑crontab,在保存并退出之前必须始终在底部放置一个空行,否则cron可能无法正确加载crontab文件。 这可能导致命令无法执行。

完成这些更改后,保存并关闭文件。

接下来,创建Unison将在服务器上写入的日志文件。 以下命令将创建此文件:

sudo touch /var/log/unison.log

接下来,使primary_user成为文件的所有者。

sudo chown primary_user /var/log/unison.log

您可以通过读取/var/log/unison.log的日志文件来检查Unison备份的状态。 Unison只会在备份新文件或更新文件或遇到错误时记录某些内容。

Unison现在定期从crontab备份。 最后一步和可选步骤是使SSH配置更安全。

第7步(可选) - 保护SSH

在本指南中,您已创建并使用了没有密码的SSH密钥。 这是一个安全问题,您可以通过限制backup_user在通过SSH登录到备份服务器时能够执行的操作来解决这个问题。

您将通过将SSH配置为仅允许backup_user在通过SSH登录时执行单个命令来执行此操作。 这意味着您创建的SSH密钥只能用于执行Unison备份而不能执行任何其他操作。 这导致您将无法作为backup_user连接备份服务器。 这是因为登录需要的不仅仅是单个允许的命令。

如果您需要以backup_user身份访问备份服务器,则应首先以sammy用户身份登录,然后使用su - backup_user切换到su - backup_user

/etc/ssh/sshd_config上编辑备份服务器上的SSH配置文件:

sudo nano /etc/ssh/sshd_config

然后将以下行添加到文件的底部:

的/ etc / SSH / sshd_config中
Match User backup_user
  ForceCommand unison -server

这些配置选项将执行以下操作:

  • Match User :当列出的用户登录时,SSH将应用以下和缩进配置选项。
  • ForceCommand :这ForceCommand匹配的用户限制为以下命令。 在这种情况下, backup_user只能运行unison -server命令。

保存并退出文本编辑器。 接下来,重新加载SSH服务以启用新配置:

sudo systemctl reload ssh.service

您可以尝试通过SSH从服务器以backup_user身份登录备份服务器来测试此问题。

ssh -i .ssh/unison-primary backup_user@backup_server_ip

如果/etc/ssh/sshd_config设置正常,那么您将看到以下内容:

Unison 2.48

SSH会话将一直挂起,直到会话被CTRLC终止,因为Unison正在等待命令。

这表明Unison服务器在登录时自动调用,在与Unison服务器通信之外无法进行其他访问。

您现在拥有一个可靠且安全的Unison备份系统,可以根据需要随时备份您的数据。

结论

在本指南中,您安装并配置了Unison文件同步软件以通过SSH备份目录。 您还将cron配置为按指定的时间表自动运行备份并保护SSH,以便不会滥用无密码密钥。

在确定是否应该使用Unison时,您应该考虑以下几点:

  • 当文件数量较少或数据量较少时,Unison可能不是最佳选择。 在这种情况下, rsync将是一个更合适的选择。 您可以在VPS指南中的“ 如何使用Rsync同步本地和远程目录”中阅读有关使用rsync的更多信息。

  • 备份大量数据可能需要很长时间,并且可能会占用公共网络接口上的带宽分配。 如果您的服务器和备份服务器都是DigitalOcean Droplet,那么如果您使用专用网络,则可以更加快速,安全地完成Unison备份。 有关免费DigitalOcean专用网络的更多信息,请参阅专用网络概述文档。