我正在努力将旧版 Ubuntu 安装的备份恢复到 Ubuntu 16.04 上的新安装。尝试恢复时出现以下错误:
Failed with an unknown error
其次是:
Traceback (most recent call last):
File "/usr/bin/duplicity", line 1532, in <module>
with_tempdir(main)
File "/usr/bin/duplicity", line 1526, in with_tempdir
fn()
File "/usr/bin/duplicity", line 1380, in main
do_backup(action)
File "/usr/bin/duplicity", line 1461, in do_backup
list_current(col_stats)
File "/usr/bin/duplicity", line 698, in list_current
for path in path_iter:
File "/usr/lib/python2.7/dist-packages/duplicity/diffdir.py", line 354, in combine_path_iters
refresh_triple_list(triple_list)
File "/usr/lib/python2.7/dist-packages/duplicity/diffdir.py", line 341, in refresh_triple_list
new_triple = get_triple(old_triple[1])
File "/usr/lib/python2.7/dist-packages/duplicity/diffdir.py", line 327, in get_triple
path = path_iter_list[iter_index].next()
File "/usr/lib/python2.7/dist-packages/duplicity/diffdir.py", line 239, in sigtar2path_iter
for tarinfo in tf:
File "/usr/lib/python2.7/tarfile.py", line 2508, in next
tarinfo = self.tarfile.next()
File "/usr/lib/python2.7/tarfile.py", line 2350, in next
raise ReadError("unexpected end of data")
ReadError: unexpected end of data
备份已成功完成,但我无法恢复它。
提前致谢!
答案1
编辑:免责声明 - 我对 Python 或 duplicity 的代码没有太多经验,所以我不能说这种修改是否会导致任何有害影响。对我来说,我可以通过添加下面的代码行来完成恢复。
解决方案:我能够通过为该volume_name_dict
对象插入密钥检查来越过这一难关。
新队:if vol_num in backup_set.volume_name_dict.keys():
在 duplicity 0.7.06 中,你可以在第 752 行替换此方法:
def get_fileobj_iter(backup_set):
"""Get file object iterator from backup_set contain given index"""
manifest = backup_set.get_manifest()
volumes = manifest.get_containing_volumes(index)
for vol_num in volumes:
if vol_num in backup_set.volume_name_dict.keys():
yield restore_get_enc_fileobj(backup_set.backend,
backup_set.
volume_name_dict[vol_num],
manifest.
volume_info_dict[vol_num])
cur_vol[0] += 1
log.Progress(_('Processed volume %d of %d') %
(cur_vol[0], num_vols),
cur_vol[0], num_vols)
if hasattr(globals.backend, 'pre_process_download'):
file_names = []
for backup_set in backup_setlist:
manifest = backup_set.get_manifest()
volumes = manifest.get_containing_volumes(index)
for vol_num in volumes:
file_names.append(backup_set.volume_name_dict[vol_num])
globals.backend.pre_process_download(file_names)
fileobj_iters = list(map(get_fileobj_iter, backup_setlist))
tarfiles = list(map(patchdir.TarFile_FromFileobjs, fileobj_iters))
return patchdir.tarfiles2rop_iter(tarfiles, index)
如果您不熟悉 Python(我不是),您可以在这里验证代码:http://pep8online.com/- 压痕必须正确对齐。
答案2
这对我有用:
1/ 下载最新版本的 duplicity (目前是 v0.7.14):
2/ 移至 /usr/local:
% cd /usr/local
3/ 解压压缩包
% tar -xvf <DuplicityTarBallHome>/duplicity-0.7.14.tar.gz
4/ 移动到解压目录
% cd /usr/local/duplicity-0.7.14
5/ 安装 duplicity 版本:
% python setup.py install
-> 安装应该顺利完成
6/ 验证后一个版本的安装:
% duplicity --version
-> 重复 0.7.14
7/ 最后恢复备份:
% duplicity restore file:<BACKUP_HOME> <DESTINATION_HOME>
-> 文件已正确恢复
答案3
我将添加这一点信息,因为我在这里也有类似的问题Déjà Dup 备份在 Ubuntu 16.04 上因 python 堆栈跟踪而失败被标记为重复(它实际上并不是重复,我并没有尝试恢复备份,而是尝试创建备份,尽管错误是一样的)。
在我发布问题后,我没有使用 Déjà Dup;由于它不起作用,我关闭了计划。然后,当 Victor Doors 也发布了对我问题的回答时,我再次尝试,没有做任何更改,看看是否仍然收到错误。Déjà Dup 说它正在进行完整备份,这可能需要更长时间,但它成功了。然后我重新启用了每日计划,昨晚增量备份也成功了。所以,我认为我的问题可能已在某个 Ubuntu 更新中得到修复。我机器上的 duplicity 版本目前是 0.7.06。 因此,我会尝试进行软件更新,看看是否能先解决问题。