我丢失了驱动器以及安装在其中的 Ubuntu 操作系统,我使用 Duplicity 创建了备份,但我不知道如何恢复仍保存在另一个驱动器中的存档文件。它们都遵循以下 4 个符号
duplicity-full.20140106T111233Z.manifest
duplicity-full-signatures.20140106T111233Z.sigtar.gz
duplicity-full.20140106T111233Z.volxxx.difftar.gz (multiple volumes)
duplicity-full.20140106T111233Z.volxxx.difftar (multiple volumes)
我需要恢复一些重要数据。我能做什么?使用 gzip 就够了吗?如果可以,我该如何轻松地提取所有数据?
编辑1尝试您的建议,使用恢复和--gio选项,我得到了以下文本:
duplicity restore file://media/ubuntu/Toshiba\ HDD/BACKUPS/Documents/ /media/ubuntu/9fb63c8e-ecb5-4c55-b4e0-282e7b4a82ff/tmp/docs/
Local and Remote metadata are synchronized, no sync needed.
Last full backup date: none
GnuPG passphrase:
Traceback (most recent call last):
File "/usr/bin/duplicity", line 1494, in <module>
with_tempdir(main)
File "/usr/bin/duplicity", line 1488, in with_tempdir
fn()
File "/usr/bin/duplicity", line 1337, in main
do_backup(action)
File "/usr/bin/duplicity", line 1422, in do_backup
restore(col_stats)
File "/usr/bin/duplicity", line 697, in restore
restore_get_patched_rop_iter(col_stats)):
File "/usr/bin/duplicity", line 719, in restore_get_patched_rop_iter
backup_chain = col_stats.get_backup_chain_at_time(time)
File "/usr/lib/python2.7/dist-packages/duplicity/collections.py", line 952, in get_backup_chain_at_time
raise CollectionsError("No backup chains found")
CollectionsError: No backup chains found
/media/ubuntu/Toshiba\ HDD/BACKUPS/Documents/是所有 duplicity 文件所在的位置,并且/媒体/ubuntu/9fb63c8e-ecb5-4c55-b4e0-282e7b4a82ff/tmp/docs/我想要将文件还原到的临时目标文件夹。
编辑2更正了 file://media.... 中缺失的斜线。现在我得到了恢复的文件,但并不完全符合我的预期。有很多文件丢失(其中最多 24 GB!)
root@ubuntu:/media/ubuntu/Toshiba HDD/BACKUPS/Documents# ls -la /tmp/docs/home/luis/
total 4176
drwx------ 16 root root 1000 Jun 30 19:13 .
drwx------ 3 root root 60 Jun 30 19:13 ..
drwx------ 3 1000 1000 60 Oct 23 2013 .activestate
drwxr-xr-x 2 1000 1000 60 Oct 23 2013 .ActiveState
drwx------ 3 1000 1000 60 Dec 28 2012 .adobe
-rw------- 1 1000 1000 32120 Jan 4 12:56 .bash_history
-rw-r--r-- 1 1000 1000 220 Dec 28 2012 .bash_logout
-rw-r--r-- 1 1000 1000 3637 Dec 28 2012 .bashrc
drwx------ 3 1000 1000 60 Jan 3 14:01 .cache
drwxr-xr-x 3 1000 1000 60 Nov 16 2013 .cddb
-rw-rw-r-- 1 1000 1000 740 Jan 10 2013 .cola
drwx------ 3 1000 1000 60 Dec 29 2012 .compiz
drwxrwxr-x 3 1000 1000 80 Oct 1 2013 .composer
drwx------ 46 1000 1000 1020 Dec 8 2013 .config
drwx------ 3 1000 1000 60 Dec 28 2012 .dbus
-rw-r--r-- 1 1000 1000 25 Jul 13 2013 .dmrc
drwx------ 3 1000 1000 380 Jan 6 10:31 .dropbox
drwxr-xr-x 6 1000 1000 1660 Dec 17 2013 .dropbox-dist
drwx------ 3 root root 60 Jun 30 19:13 .eclipse
-rw------- 1 1000 1000 50282 Jan 6 10:29 .ICEauthority
drwxrwxr-x 14 1000 1000 340 Dec 7 2013 .PlayOnLinux
-rw-r--r-- 1 root root 2077491 Nov 23 2013 .Soulseek.1385165090491
-rw-r--r-- 1 root root 2076644 Nov 23 2013 .Soulseek.1385166430938
-rw-r--r-- 1 1000 1000 9986 Dec 30 20:02 .Soulseek.1388433748295
drwxrwxr-x 2 1000 1000 60 Oct 13 2013 .SyncWall
-rw------- 1 1000 1000 109 Jan 6 10:29 .Xauthority
-rw-rw-r-- 1 1000 1000 0 Jul 29 2013 .Xauthority.25Y20W
-rw-rw-r-- 1 1000 1000 0 Jul 13 2013 .Xauthority.7K14ZW
-rw-rw-r-- 1 1000 1000 0 Jul 7 2013 .Xauthority.7K7SZW
-rw-rw-r-- 1 1000 1000 0 Jul 13 2013 .Xauthority.9X1E0W
-rw-rw-r-- 1 1000 1000 0 Sep 1 2013 .Xauthority.A3D52W
-rw-rw-r-- 1 1000 1000 0 Sep 1 2013 .Xauthority.CEUV2W
-rw-rw-r-- 1 1000 1000 0 Jul 27 2013 .Xauthority.CP7Q0W
-rw-rw-r-- 1 1000 1000 0 Sep 8 2013 .Xauthority.E1ET2W
-rw-rw-r-- 1 1000 1000 0 Aug 26 2013 .Xauthority.E32K2W
-rw-rw-r-- 1 1000 1000 0 Sep 14 2013 .Xauthority.EKK92W
-rw-rw-r-- 1 1000 1000 0 Jul 12 2013 .Xauthority.F4QRZW
-rw-rw-r-- 1 1000 1000 0 Jul 25 2013 .Xauthority.ISVZ0W
-rw-rw-r-- 1 1000 1000 0 Jul 11 2013 .Xauthority.JU3UZW
-rw-rw-r-- 1 1000 1000 0 Aug 31 2013 .Xauthority.M30S2W
-rw-rw-r-- 1 1000 1000 0 Aug 1 2013 .Xauthority.M3H20W
-rw-rw-r-- 1 1000 1000 0 Sep 9 2013 .Xauthority.MKIN2W
-rw-rw-r-- 1 1000 1000 0 Aug 28 2013 .Xauthority.RWHB2W
-rw-rw-r-- 1 1000 1000 0 Jul 15 2013 .Xauthority.SN85ZW
-rw-rw-r-- 1 1000 1000 0 Sep 15 2013 .Xauthority.T22C3W
-rw-rw-r-- 1 1000 1000 0 Jul 14 2013 .Xauthority.T6CB0W
-rw-rw-r-- 1 1000 1000 0 Jul 31 2013 .Xauthority.VF7Q0W
-rw-rw-r-- 1 1000 1000 0 Sep 9 2013 .Xauthority.WGEX2W
-rw-rw-r-- 1 1000 1000 0 Aug 31 2013 .Xauthority.WZR52W
-rw-rw-r-- 1 1000 1000 0 Jul 25 2013 .Xauthority.YQIR0W
最奇怪的是,除了所有以点开头的文件之外,我无法使用 Nautilus 浏览 home/luis 目录,而事实上我的所有备份数据都位于该目录下。
答案1
CLI 提取 duplicity 档案
用于
duplicity
提取它:duplicity restore file:///path_to_folder_contains_backups/ path_where_to_extract_it/
输入 GnuPG 密码,按Enter
默认情况下,Duplicity 会恢复源文件夹中的最后一个备份(比较时间),即使它不是同一文件夹的备份。如果您有不同文件夹的多个备份,或者您想要同一文件夹的特定时间,请使用--time
选项示例:
duplicity restore --time 20140106T111233Z file:///path_to_folder_contains_backups/ path_where_to_extract_it/
在所有档案中搜索特定的文件名模式
无法看到您正在寻找的文件,请尝试:
创建列出源文件夹中所有完整/增加备份中包含的所有文件的函数:
ldup () { for f in $(ls $1/duplicity-*.manifest.gpg); do echo "========================================================================"; echo $f; n=$(basename $f .manifest.gpg); prefix=$(echo $n | awk 'BEGIN { FS = "." } ;{ print $1 }'); if [[ "$prefix" == "duplicity-full" ]]; then t=$(echo $n | awk 'BEGIN { FS = "." } ;{ print $2 }'); else t=$(echo $n | awk 'BEGIN { FS = "." } ;{ print $4 }'); fi; echo -e "Creation time:\t" $t; echo "------------------------------------------------------------------------"; duplicity list-current-files --time $t file://$1/ | grep "$2"; done; }
要么吼叫
列出所有文件(注意没有 tail
/
):ldup /path_to_folder_contains_backups
在文件名中搜索模式:
ldup /path_to_folder_contains_backups pattern
脚本函数不支持文件夹或档案名称中的空格。
参考:man duplicity
答案2
首先尝试使用 duplicity 进行恢复。
duplicity --gio file:///media/backup /tmp/restore
有一些相当详细的(和大多正确的)步骤在这里。
关键细节
关键点是将所有duplicity-full.*.difftar.gz
文件解压到同一个地方,这样就只剩下两个snapshot/
目录multivol_snapshot/
。
如果您的文件在,那么您就大功告成了。否则,请在文件原来的路径中snapshot/
找到目录:您需要将此目录中的所有文件合并在一起以重新创建原始文件。这些文件已编号,可以使用命令合并在一起。根据原始文件的大小,可能会有很多部分。multivol_snapshot/
cat
原始说明存在问题
上面链接的说明建议使用cat * > rescued-file
。不幸的是,如果您有超过 9 个部分,这种简单的方法就会失败。由于*
以字典顺序而不是数字顺序展开,因此10
将在 之前列出2
,并且文件将以错误的顺序重建。
解决方法
一个简单的方法是记住字典顺序做当数字长度相同且?
匹配单个字符时有效。因此,如果您的最大文件有三数字,您可以手动输入:
cat ? ?? ??? > rescued-file
?
根据最大文件数量,根据需要添加或删除模式。
脚本
如果您有很多文件需要恢复,但又不想为所有文件都输入这些代码,那么您可能更愿意使用这样的脚本。它会列出每个文件的包含目录,从列表中删除重复项,然后转到每个目录并content
从其中的片段创建一个文件。(spacer
只是为了$1
工作。)
find multivol_snapshot/ -type f -printf '%h\0' | \
sort -uz | \
xargs -0 -n 1 sh -c 'cd "$1" ; cat $(ls | sort -n) > content' spacer
现在您只需将其添加/content
到您要查找的任何文件名的末尾,就可以找到它。
限制
这不会恢复任何原始文件权限或所有权。它也不处理增量备份,但链接指令在这一点上也遇到了一些死胡同——他们只是建议使用rdiff
“将文件缝合在一起”并让读者参考man rdiff
。