恢复 Ubuntu 16.04 备份失败

恢复 Ubuntu 16.04 备份失败

我正在努力将旧版 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):

http://duplicity.nongnu.org/

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。 因此,我会尝试进行软件更新,看看是否能先解决问题。

相关内容