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