介绍
Duplicity 是一个多功能的本地和远程备份程序,可以实现一系列传输协议和第三方存储解决方案。
在本指南中,我们将讨论如何在Ubuntu 12.04 VPS上安装重复性,我们将从源头安装,然后配置以利用GPG加密。
要继续下去,你需要访问两个机器,一个Ubuntu 12.04 VPS,它将被备份,另一个Linux机器或VPS的任何品种可以通过SSH访问。
如何在Ubuntu上安装源代码
我们正在为本指南使用Ubuntu 12.04 VPS。默认存储库中的重复包已经过时,并且实际上由于后端的变化而与远程主机连接有某些问题。
我们将通过获取源文件并手动安装来避免这些问题。
登录到您将备份的 Ubuntu 12.04 VPS, 作为 root。
安装前提包
虽然我们正在从源头安装重复性,但我们将从默认的Ubuntu存储库中获得前提条件。
更新源数据库,然后使用以下两个命令安装所需的包:
1apt-get update
2apt-get install ncftp python-paramiko python-pycryptopp lftp python-boto python-dev librsync-dev
这将安装一系列不同的处理器来将数据传输到远程计算机. 我们不会在本指南中使用大多数这些,但它们是很好的选择。
下载和安装从源的重复性
重复性源文件存储在 launchpad.net。我们将下载到 root 用户的主目录。
1cd /root
2wget http://code.launchpad.net/duplicity/0.6-series/0.6.22/+download/duplicity-0.6.22.tar.gz
解包源并进入创建的包目录:
1tar xzvf duplicity*
2cd duplicity*
接下来,我们将用以下命令完成实际安装:
1python setup.py install
由于这是从源头安装的包,它将被放置在 /usr/local/bin/
目录中。
创建SSH和GPG密钥
我们的重复配置将使用两种不同类型的密钥来实现便利性和安全性之间的漂亮交叉点。
我们将使用SSH密钥安全地与远程系统进行身份验证,而无需提供密码,我们还将使用GPG来加密数据,然后将其转移到备份位置。
创建 SSH 密钥
我们将为我们的 root 用户生成一个 RSA 加密的 SSH 密钥,以允许无密码登录到将托管备份的机器。
如果您尚未这样做,请确保您在将数据传输给的机器上配置了根密码,您可以通过登录机器为根(如果这是VPS,则通过SSH或Console Access按钮在Dropplets页面上)并发出以下命令来完成此操作:
1passwd
回到与重复性的滴滴中,我们将用以下命令生成一个密钥对:
1ssh-keygen -t rsa
在提示中按 Enter 以创建与默认设置无密码的 SSH 密钥。
将其传输到将用此命令托管您的备份的系统:
1ssh-copy-id root@backupHost
回答是
以接受未经验证的主机,然后输入远程系统的根密码以传输您的公共密钥。
测试你现在可以登录没有密码从你的重复滴通过发出:
1ssh root@backupHost
您应该登录,而无需提供任何进一步的凭证。
当你通过SSH登录时,创建将收藏我们的备份文件的目录结构:
1mkdir -p /remotebackup/duplicityDroplet
您可以随心所欲命名目录,但请记住值,以便稍后指定。
当你完成时,退出回你的重复滴:
1exit
创建 GPG 密钥
我们将使用GPG进行额外的安全和加密,这些命令将将我们的密钥存储在一个隐藏的目录中,在 /root/.gnupg/
:
1gpg --gen-key
您将被问到一系列的问题,这些问题将配置关键对的参数。
1Please select what kind of key you want:
2 (1) RSA and RSA (default)
3 (2) DSA and Elgamal
4 (3) DSA (sign only)
5 (4) RSA (sign only)
6Your selection?
7RSA keys may be between 1024 and 4096 bits long.
8What keysize do you want? (2048)
9Requested keysize is 2048 bits
10Please specify how long the key should be valid.
11 0 = key does not expire
12 <n> = key expires in n days
13 <n>w = key expires in n weeks
14 <n>m = key expires in n months
15 <n>y = key expires in n years
16Key is valid for? (0)
17Key does not expire at all
18Is this correct? (y/N) y
按 enter 以接受默认的RSA 和 RSA
键。
输入 y 以确认您的参数。
1You need a user ID to identify your key; the software constructs the user ID
2from the Real Name, Comment and Email Address in this form:
3 "Heinrich Heine (Der Dichter) <[email protected]>"
4
5Real name: Your Name
6Email address: your_email@example.com
7Comment:
8You selected this USER-ID:
9 "Your Name <[email protected]>"
10
11Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? o
输入姓名、电子邮件地址和可选的评论,将与此密钥相关联。
接下来,您将设置一个用于GPG的passsphrase。与SSH密钥不同,我们默认不允许在背景下操作的passsphrase,您应该为此步骤提供一个passsphrase,以允许您的数据的安全加密和解密。
1Enter passphrase:
2Repeat passphrase:
在此时,您将被要求生成。基本上是一个描述系统中有多么不可预测的词。
1We need to generate a lot of random bytes. It is a good idea to perform
2some other action (type on the keyboard, move the mouse, utilize the
3disks) during the prime generation; this gives the random number
4generator a better chance to gain enough entropy.
5
6Not enough random bytes available. Please do some other work to give
7the OS a chance to collect more entropy! (Need 280 more bytes)
如果你需要一些帮助创建,有指南 使用Haveged生成在这里. 在我的经验中,仅仅安装一些包从apt就足以生成所需。
当你产生了足够的随机信息时,你的密钥将被创建:
1gpg: /root/.gnupg/trustdb.gpg: trustdb created
2gpg: key 05AB3DF5 marked as ultimately trusted
3public and secret key created and signed.
4
5gpg: checking the trustdb
6gpg: 3 marginal(s) needed, 1 complete(s) needed, PGP trust model
7gpg: depth: 0 valid: 1 signed: 0 trust: 0-, 0q, 0n, 0m, 0f, 1u
8pub 2048R/05AB3DF5 2013-09-19
9 Key fingerprint = AF21 2669 07F7 ADDE 4ECF 2A33 A57F 6998 05AB 3DF5
10uid Your Name <[email protected]>
11sub 2048R/32866E3B 2013-09-19
上面提到的部分是您的公钥ID,您将需要此后加密您将传输的数据。
如果你忘了写下你的公钥ID,你可以通过查询 gpg 密钥来重新获取它:
1gpg --list-keys
1/root/.gnupg/pubring.gpg
2------------------------
3pub 2048R/05AB3DF5 2013-09-19
4uid Your Name <[email protected]>
5sub 2048R/32866E3B 2013-09-19
我们现在拥有所有必要的组件,以使用重复性安全地备份。
如何使用重复性
运行初步测试
我们将通过创建一个 dummy 文件文件文件夹来运行我们的重复性系统的初始测试,以备份。
1cd ~
2mkdir test
3touch test/file{1..100}
这将创建一个名为测试
的目录在根源主目录中,然后将目录填充到编号为1 - 100的文件。
我们将将文件移动到远程服务器,首先没有我们生成的GPG密钥,我们将使用sftp
,这是一个安全的协议,包含在SSH中,它复制了FTP的功能。
1duplicity /root/test sftp://root@backupHost//remotebackup/duplicityDroplet
注意远程主机和文件路径之间的双重切割,这是因为我们指定了一个绝对路径,如果它是从默认目录中的相对路径,sftp将我们放入,我们只能使用一个切割。
您将被要求接受远程主机,然后被要求创建并确认使用密钥来加密数据. 正如您所看到的,GPG仍然会被使用,除非我们具体告诉它不要。
1Import of duplicity.backends.dpbxbackend Failed: No module named dropbox
2The authenticity of host '162.243.2.14' can't be established.
3SSH-RSA key fingerprint is 1f:4b:ae:1c:43:91:aa:2b:04:5b:a4:8e:cd:ea:e6:60.
4Are you sure you want to continue connecting (yes/no)? yes
5Local and Remote metadata are synchronized, no sync needed.
6Last full backup date: none
7GnuPG passphrase:
8Retype passphrase to confirm:
备份然后运行,当过程完成时,您将收到统计数据:
1No signatures found, switching to full backup.
2--------------[ Backup Statistics ]--------------
3StartTime 1379614581.49 (Thu Sep 19 18:16:21 2013)
4EndTime 1379614581.60 (Thu Sep 19 18:16:21 2013)
5ElapsedTime 0.11 (0.11 seconds)
6SourceFiles 101
7SourceFileSize 4096 (4.00 KB)
8NewFiles 101
9NewFileSize 4096 (4.00 KB)
10DeletedFiles 0
11ChangedFiles 0
12ChangedFileSize 0 (0 bytes)
13ChangedDeltaSize 0 (0 bytes)
14DeltaEntries 101
15RawDeltaSize 0 (0 bytes)
16TotalDestinationSizeChange 1022 (1022 bytes)
17Errors 0
18-------------------------------------------------
如果我们将SSH插入我们的远程系统,我们可以看到备份成功完成:
1ssh root@backupHost
2cd /remotebackup/duplicityDroplet
3ls
4
5duplicity-full.20130919T181705Z.manifest.gpg
6duplicity-full.20130919T181705Z.vol1.difftar.gpg
7duplicity-full-signatures.20130919T181705Z.sigtar.gpg
这些文件包含备份信息. 因为这只是一个测试,我们可以通过运行来删除它们:
1rm duplicity*
退出,回到重复滴:
1exit
我们现在可以删除测试目录及其所有内容:
1rm -r /root/test
创建你的第一个备份
我们将使用以下通用语法创建我们的第一个真正的备份:
1duplicity --encrypt-key key_from_GPG --exclude files_to_exclude --include files_to_include path_to_back_up sftp://root@backupHost//remotebackup/duplicityDroplet
我们将备份我们的整个根目录,除了/proc
,/sys
和/tmp
。我们将使用我们创建的GPG密钥。
1PASSPHRASE="passphrase_for_GPG" duplicity --encrypt-key 05AB3DF5 --exclude /proc --exclude /sys --exclude /tmp / sftp://root@backupHost//remotebackup/duplicityDroplet
上面的命令将需要一些时间,因为这是我们第一次运行备份,重复性将创建一个完整的备份,重复性将数据片段分成卷,以简化文件传输。
1--------------[ Backup Statistics ]--------------
2StartTime 1379621305.09 (Thu Sep 19 20:08:25 2013)
3EndTime 1379621490.47 (Thu Sep 19 20:11:30 2013)
4ElapsedTime 185.38 (3 minutes 5.38 seconds)
5SourceFiles 33123
6SourceFileSize 813465245 (776 MB)
7NewFiles 33123
8NewFileSize 813464221 (776 MB)
9DeletedFiles 0
10ChangedFiles 0
11ChangedFileSize 0 (0 bytes)
12ChangedDeltaSize 0 (0 bytes)
13DeltaEntries 33123
14RawDeltaSize 802133584 (765 MB)
15TotalDestinationSizeChange 369163424 (352 MB)
16Errors 0
17-------------------------------------------------
在新鲜的滴滴中,我的配置创建了15卷,这些卷被转移到远程系统中。
由于我们现在在远程系统上拥有完整的备份,我们的下一个备份将自动是增量备份,这些备份更快,需要更少的数据传输,我的第一次运行时间超过三分钟,而我的增量备份时间不到八秒。
1--------------[ Backup Statistics ]--------------
2StartTime 1379621776.23 (Thu Sep 19 20:16:16 2013)
3EndTime 1379621783.80 (Thu Sep 19 20:16:23 2013)
4ElapsedTime 7.57 (7.57 seconds)
5SourceFiles 33128
6SourceFileSize 820560987 (783 MB)
7NewFiles 11
8NewFileSize 12217723 (11.7 MB)
9DeletedFiles 3
10ChangedFiles 1
11ChangedFileSize 600 (600 bytes)
12ChangedDeltaSize 0 (0 bytes)
13DeltaEntries 15
14RawDeltaSize 12197851 (11.6 MB)
15TotalDestinationSizeChange 12201207 (11.6 MB)
16Errors 0
17-------------------------------------------------
要强迫另一个完整的备份,您可以在任何选项之前将完整
命令添加到重复呼叫中:
1PASSPHRASE="passphrase_for_GPG" duplicity full --encrypt-key 05AB3DF5 --exclude /proc --exclude /sys --exclude /tmp / sftp://root@backupHost//remotebackup/duplicityDroplet
恢复备份
重复性使恢复变得容易. 您可以通过简单地逆转远程和本地参数来恢复。
我们不需要加密密钥选项,因为我们只是解密数据,我们也不需要排除参数,因为它们首先不包括在备份中。
例如,如果我们想要完全恢复我们刚刚备份的数据,我们可以使用以下命令:
1PASSPHRASE="passphrase_for_GPG" duplicity sftp://root@backupHost//remotebackup/duplicityDroplet /
也许更安全的选项是只恢复您需要的文件或目录,您可以通过添加一个选项到上面的命令来做到这一点:
1PASSPHRASE="passphrase_for_GPG" duplicity --file-to-restore /path/to/file sftp://root@backupHost//remotebackup/duplicityDroplet /path/to/restore/file
确保你测试你的恢复能力正确,这样你不会遇到麻烦,当你处于一个艰难的局面。
自动备份
我们可以通过创建几个cron工作来自动化重复性,点击此处 了解如何配置cron。
创建一个 Passphrase 文件
我们将创建一个受保护的文件来存储我们的 GPG 密码,以便我们不必直接将其放入我们的自动化脚本中。
转到 root 用户的主目录,并使用文本编辑器创建一个新的隐藏文件:
1cd /root
2nano .passphrase
我们只需要在这个文件中放置的唯一东西是您之前的重复命令的passsphrase规格:
1PASSPHRASE="passphrase_for_GPG"
保存并关闭文件。
通过执行,只通过 root 可读:
1chmod 700 /root/.passphrase
设置每日增量备份
我们将设置重复性来创建每日增量备份,这将使我们的备份保持最新。
在/etc/cron.daily
中列出的脚本每天运行一次,所以这是创建我们的备份脚本的完美场所。
导航到该文件夹并创建一个名为duplicity.inc
的文件:
1cd /etc/cron.daily
2nano duplicity.inc
将下面的 bash 脚本复制到文件中. 用您想要使用的命令来备份您的系统来替换重复命令。
1#!/bin/sh
2
3test -x $(which duplicity) || exit 0
4. /root/.passphrase
5
6export PASSPHRASE
7$(which duplicity) --encrypt-key 05AB3DF5 --exclude /proc --exclude /sys --exclude /tmp / sftp://root@backupHost//remotebackup/duplicityDroplet
保存并关闭文件。
通过键入以下命令使其可执行:
1chmod 755 duplicity.inc
测试它,称之为:
1./duplicity.inc
它应该完成,没有任何错误。
设置每周完整的备份
增量备份是从完整的备份中构建出来的,这意味着随着更改的堆积,它们将变得越来越模糊,我们将每周配置完整的备份来更新基础。
我们将通过在 /etc/cron.weekly
目录中创建类似的脚本来做到这一点。
导航到目录并创建一个新的文件:
1cd /etc/cron.weekly
2nano duplicity.full
将下面的 bash 脚本复制到文件中. 请注意,我们包括了完整
命令,强迫重复执行完整的备份。
1#!/bin/sh
2
3test -x $(which duplicity) || exit 0
4. /root/.passphrase
5
6export PASSPHRASE
7$(which duplicity) full --encrypt-key 05AB3DF5 --exclude /proc --exclude /sys --exclude /tmp / sftp://root@backupHost//remotebackup/duplicityDroplet
我们还将添加一个额外的重复命令,以清除旧的备份文件. 我们将保留总共三个完整的备份和相关的增量备份。
将此添加到文件的末尾
1$(which duplicity) remove-all-but-n-full 3 --force sftp://root@backupHost//remotebackup/duplicityDroplet
保存并关闭文件。
用以下命令使它可执行:
1chmod 755 duplicity.full
通过打电话来测试:
1./duplicity.full
它应该做一个完整的备份,然后删除任何必要的文件。
结论
您现在应该有一个全功能的自动备份解决方案,确保定期验证您的备份,以免成为虚假安全感的受害者。
有许多其他备份工具可用,但重复性是一种灵活、简单的解决方案,可满足许多用户的需求。