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

作者选择了 免费和开源基金作为 写给捐款计划的一部分,接受捐款。

介绍

Unison是一个开源文件同步工具. 它非常有效地备份大数据库,只有少数文件已添加或更新。 这种情况发生在,例如,企业 Samba文件服务器或电子邮件服务器。

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

在本教程中,您将安装和配置Unison在一对服务器上,并使用它来备份一个目录。您还将配置Unison以使用SSH作为安全的通信协议,并创建一个Cron工作(https://help.ubuntu.com/community/CronHowto)定期运行Unison。

前提条件

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

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

主要 服务器:将备份数据托管的服务器。* 备份* 服务器:将备份数据托管的服务器。

第1步:创建额外的非根用户

[初始服务器设置有Ubuntu 16.04] (https://andsky.com/tech/tutorials/initial-server-setup-with-ubuntu-16-04) 教程指导您在 和** 后卫** 服务器上创建了名为** sammy** 的非root sudo用户. 在这个步骤中,您将创建两个新的用户,一个在** prime** 服务器上,一个在** backup** 服务器上. 这可以防止在通过指南工作时出现混乱,如果在指南后端启用了SSH安全配置,则需要在** backup** 服务器上安装一个替代的非root sudo用户.

您需要在两个终端窗口中登录 primary 和** backup** 服务器作为** sammy** 用户。

1[environment local]
2ssh sammy@primary_server_ip
3ssh sammy@backup_server_ip

首先,在 primary 服务器上,使用此命令创建一个名为** primary_user** 的新用户:

1sudo adduser primary_user

然后给他们sudo访问权利:

1sudo usermod -aG sudo primary_user

最后,更改到 primary_user 帐户:

1su - primary_user

接下来,在备份服务器上遵循相同的步骤,但创建一个名为备份_用户**的新用户。

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

步骤 2 — 在两个服务器上安装 Unison

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

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

1sudo apt-get update

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

接下来,安装Unison:

1sudo apt-get install unison

在下一步,您将配置SSH,使Unison能够在两个服务器之间进行通信。

步骤 3 – 创建 SSH 密钥和配置 SSH

您需要做的第一件事是在主服务器上创建一个 SSH 密钥对,因为您将使用 SSH 连接的基于密钥的身份验证。基于密钥的身份验证的优点是,安全连接是可能的,而无需输入密码。

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

当你创建一个SSH密钥对时,你通常会使用一个强大的密码。然而,Unison会自动运行,因此每次运行都无法手动输入密码。

运行以下命令从 primary_user 主目录在** primary** 服务器上生成一个 SSH 密钥对:

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

在这里使用的选项意味着如下:

  • t rsa: 此设置将创建的密钥类型。 RSA 密钥是最兼容的类型。 * -b 4096: 此设置了密钥的长度。 密钥的长度越长,密钥的安全性越大。 密钥长度为 4096 是 RSA 密钥的当前推荐密钥长度。 * -f.ssh/unison-primary: 此设置了密钥的名称和将其存储的位置。

上面的命令创建了以下两个文件中的公共和私人 SSH 密钥:

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

第一个是私钥 SSH,第二个是公共钥匙. 您需要将公共钥匙文件的内容复制到备份**服务器. 最简单的方式来显示用于复制的公共钥匙文件的内容是使用cat命令将内容打印到终端:

1cat .ssh/unison-primary.pub

backup_user 主目录中的** backup** 服务器上,使用文本编辑器打开 .ssh/authorized_keys 文件。

1[environment second]
2nano .ssh/authorized_keys

将公共密钥插入编辑器,然后保存和退出。

现在,您可以通过通过 SSH 来测试 SSH 配置是否正在工作,通过 SSH 登录 备份 从** 主要** 服务器。 这是很重要的,因为您需要接受并保存 SSH 服务器的** 备份** 服务器的关键指纹,否则 Unison 将无法工作。

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

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

您只需要确认SSH在服务器之间运行,并保存备份**服务器的SSH指纹。

接下来,请检查 Unison 是否会通过在 primary 服务器上的** primary_user** 主目录中运行以下命令进行连接:

1ssh -i .ssh/unison-primary [email protected] unison -version

在这个命令中,你使用了你用来测试连接的相同 SSH 命令,并在末尾添加了 Unison 命令. 当一个命令放在 SSH 连接的末尾时,SSH 会登录,运行命令,然后退出。

如果一切顺利,你会看到一个响应显示在 备份 服务器上的 Unison 版本:

1[secondary_label Output]
2unison version 2.48.3

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

步骤 4 - 配置 Unison

在此步骤中,您将配置 Unison 来运行一个简单的单向备份从 primary 服务器到** backup** 服务器的目录。

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

1mkdir .unison

接下来,您需要在.unison 目录中的文本编辑器中打开一个名为 `default.prf' 的新文件. 此文件包含 Unison 配置。

1nano .unison/default.prf

然后输入以下内容:

1[label default.prf]
2force = /home/primary_user/data
3sshargs = -i /home/primary_user/.ssh/unison-primary

这两条线意味着如下:

  • force:这确保只将更改从 ** primary 服务器推到** backup** 服务器。 /home/primary_user/data 路径是存储您要备份的数据目录的位置。

如果您想要备份的数据的目录不在 primary_user 主目录中,那么您必须确保它是可读和可写的** primary_user** . 如果您不熟悉Linux所有权和权限,请参阅(https://andsky.com/tech/tutorials/an-introduction-to-linux-permissions)指南以了解更多信息。

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

步骤 5 — 使用 Unison 备份目录

您现在已经配置了 Unison 来备份一个目录,您将在 primary 服务器上备份 /home/primary_user/data 目录到** backup** 服务器上的 /home/backup_user/data/ 目录。

您需要一些数据来备份,以测试 Unison 是否正在工作. 在 primary 服务器上创建一些空的文件,然后检查 Unison 是否将其转移到** backup** 服务器。

首先,创建将数据保留在备份中的目录,从 primary_user 主目录中执行以下命令:

1mkdir data/

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

1touch data/file{1..5}

命令的最后一部分,file{1..5},使用Bash轴扩展来创建五个文件.当bash给出「{1..5}」时,它会自动填写缺少的数字,即「2」、「3」和「4」。

现在你有数据目录和一些测试文件来备份,你可以运行Unison来备份文件到 备份 服务器。

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

这些选项意味着如下:

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

由于您正在使用 Unison 在一个简单的单向同步模式中,您将无需解决任何冲突,这意味着您可以安全地设置这些选项。

冲突只能发生在Unison的其他操作模式中,它在两个方向同步。这样的使用案例是同步某人的笔记本电脑和桌面上的目录。当他们在桌面上更新文件时,他们希望该更改被推到笔记本电脑,反之亦然。

在单向推动模式中, primary 上的数据总是保留,备份上的数据是重写的。

此命令在首次运行时会打印一个长消息,该消息如下:

 1[secondary_label Output]
 2Contacting server...
 3Connected [//primary_server_ip//home/primary_user/data -> //primary_server_ip//home/backup_user/data]
 4Looking for changes
 5Warning: No archive files were found for these roots, whose canonical names are:
 6        /home/primary_user/data
 7        //backup_server_ip//home/backup_user/data
 8This can happen either
 9because this is the first time you have synchronized these roots, 
10or because you have upgraded Unison to a new version with a different
11archive format.  
12
13Update detection may take a while on this run if the replicas are 
14large.
15
16Unison will assume that the 'last synchronized state' of both replicas
17was completely empty. This means that any files that are different
18will be reported as conflicts, and any files that exist only on one
19replica will be judged as new and propagated to the other replica.
20If the two replicas are identical, then no changes will be reported.
21
22If you see this message repeatedly, it may be because one of your machines
23is getting its address from DHCP, which is causing its host name to change
24between synchronizations. See the documentation for the UNISONLOCALHOSTNAME
25environment variable for advice on how to correct this.
26
27Donations to the Unison project are gratefully accepted: 
28http://www.cis.upenn.edu/~bcpierce/unison
29
30  Waiting for changes from server
31Reconciling changes
32dir      ---->            /  
33Propagating updates
34UNISON 2.48.3 started propagating changes at 16:30:43.70 on 03 Apr 2019
35[BGN] Copying from /home/primary_user/data to //backup_server_ip//home/backup_user/data
36[END] Copying  
37UNISON 2.48.3 finished propagating changes at 16:30:43.71 on 03 Apr 2019
38Saving synchronizer state
39Synchronization complete at 16:30:43  (1 item transferred, 0 skipped, 0 failed)

此信息是警告,这是第一个同步,它还提供有关如何解决问题的提示,如果您看到每一次同步运行此消息。

在每一次后续运行时,它会打印更少的信息. 以下是当没有更新文件时的输出:

1[secondary_label Output]
2Contacting server...
3Connected [//primary_server_ip//home/primary_user/data -> //backup_server_ip//home/backup_user/data]
4Looking for changes
5  Waiting for changes from server
6Reconciling changes
7Nothing to do: replicas have not changed since last sync.

primary 服务器上修改 /data/file1 时,这是输出:

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

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

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

你现在可以运行Unison来备份一个目录. 在下一步,你将通过运行Unison _cron_来自动化备份过程。

步骤6 - 创建一个Unison Cron工作

在本节中,您将创建一个 cron 工作,该工作将运行 Unison,并以指定频率将数据目录备份到 backup 服务器。

crontab 是一个由 cron 进程读取的文件,其中的命令被加载到 cron 进程中,并在指定的间隔执行。

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

1crontab -l

-l选项列出了当前用户的 crontab 的内容. 如果您以前没有编辑 crontab,则会看到以下信息:

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

接下来,在 primary 服务器上运行crontab命令,使用-e旗帜在编辑模式下打开它:

1crontab -e

如果您没有配置默认命令行编辑器,您将被要求在首次运行命令时选择编辑器。

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

1...
2* */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

您将使用的命令几乎与您在手动备份中使用的命令相同,但有一些额外的选项。

  • 沉默:除错误外,禁用所有输出。在从 crontab 执行 Unison 时,不需要正常输出,因为没有人可以读取它。 * -log:指示 Unison 记录其操作。

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

每当你编辑 crontab 时,你必须在保存前始终在底部放一个空行,并且 exit 或 cron 可能无法正确加载 crontab 文件。

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

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

1sudo touch /var/log/unison.log

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

1sudo chown primary_user /var/log/unison.log

您可以通过阅读在 /var/log/unison.log 的日志文件来检查 Unison 备份的状态。

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

步骤 7 (可选) — 保护 SSH

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

您将通过配置 SSH 来只允许 backup_user 在登录 SSH 时执行单个命令。这意味着您创建的 SSH 密钥只能用于执行 Unison 备份,而不是其他任何东西。

如果您需要作为 backup_user 访问** backup** 服务器,您应该先作为** sammy** 用户登录,然后使用 su - backup_user 更改为** backup_user** 。

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

1[environment second]
2sudo nano /etc/ssh/sshd_config

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

1[label /etc/ssh/sshd_config]
2Match User backup_user
3  ForceCommand unison -server

这些配置选项将如下:

  • Match User:当列出的用户登录时,SSH将应用以下和索引的配置选项。 * ForceCommand:这会限制匹配的用户使用以下命令。

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

1[environment second]
2sudo systemctl reload ssh.service

您可以通过尝试登录到 备份 服务器作为** 备份_用户** 通过 SSH 从** 主要** 服务器。

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

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

1[secondary_label Output]
2Unison 2.48

SSH 会话将暂停,直到会话被用CTRLC杀死,因为 Unison 正在等待命令。

这表明,在登录时,Unison服务器被自动召唤,在与Unison服务器进行通信之外,没有其他访问是可能的。

您现在有一个工作和安全的Unison备份系统,将尽可能频繁地备份您的数据。

结论

在本指南中,您安装并配置了 Unison 文件同步软件以通过 SSH 备份目录,您还配置了 cron 以在指定时间表上自动执行备份,并确保 SSH 以便无法滥用无密码密钥。

当确定是否应该使用Unison时,您应该考虑一些事情:

  • 当文件数量较少或数据数量较少时,统一可能不是最佳选择。 在这种情况下,`rsync'是一个更适当的选择。 您可以在 [如何使用 Rsync 在 VPS (https://andsky.com/tech/tutorials/how-to-use-rsync-to-sync-local-and-remote-directories-on-a-vps ) 指南中读取更多关于使用 rsync 的内容 。
  • 备份大量数据需要很长时间,并可能利用公共网络接口的带宽分配。 如果您的 主** 和** 备份** 服务器都是数字海洋 Dropplets, 那么如果你使用私人网络, 你就能更快和安全地完成 Unison 备份 。 关于免费数字海洋私人网络的更多信息,请参见[私人网络概览] (https://www.digitalocean.com/docs/networking/private-networking/overview/)文档. .
Published At
Categories with 技术
comments powered by Disqus