web-dev-qa-db-ja.com

すべてのsigtarとほとんどのマニフェストファイルが見つからない場合、暗号化されていない複製バックアップを抽出します

私は古い複製のバックアップからバックアップを抽出しようとしています(ubuntu guiによって行われた、それはdeja-dupだったと思います)。

私は死にかけているハードドライブからできる限りコピーしました。私が持っています

  • たくさんの difftar.gzファイル-一部2014および一部2016。
  • 独身者 .manifest 2014年のファイル。
  • 番号 sigtar.gzファイル

バックアップは暗号化されていません-解凍しましたdifftar.gzファイルを作成し、16進エディタで検査すると、プレーンテキストがたくさん表示されます。

いくつかのコマンドを実行する:

% duplicity --no-encryption --ignore-errors collection-status file:///home/hamish/poonbackup2014
Running in 'ignore errors' mode due to --ignore-errors; please re-consider if this was not intended
Last full backup date: Mon Sep 15 19:37:44 2014
Collection Status
-----------------
Connecting with backend: BackendWrapper
Archive directory: /home/hamish/.cache/duplicity/c34b5c3ae7d763a715fd062ec5f49baa

Found 1 secondary backup chain.
Secondary chain 1 of 1:
-------------------------
Chain start time: Mon Sep 15 19:37:44 2014
Chain end time: Mon Sep 15 19:37:44 2014
Number of contained backup sets: 1
Total number of contained volumes: 2063
 Type of backup set:                            Time:   Number of volumes:
                Full         Mon Sep 15 19:37:44 2014              2063
-------------------------

No backup chains with active signatures found
No orphaned or incomplete backup sets found.



% duplicity --no-encryption --ignore-errors collection-status file:///home/hamish/poonbackup2016
Running in 'ignore errors' mode due to --ignore-errors; please re-consider if this was not intended
Warning, found incomplete backup sets, probably left from aborted session
Last full backup date: none
Collection Status
-----------------
Connecting with backend: BackendWrapper
Archive directory: /home/hamish/.cache/duplicity/37e66337a462669832db8b2b852f9c6f

Found 0 secondary backup chains.
No backup chains with active signatures found
Also found 0 backup sets not part of any chain,
and 2 incomplete backup sets.
These may be deleted by running duplicity with the "cleanup" command.


% duplicity --no-encryption --ignore-errors list-current-files file:///home/hamish/poonbackup2014
Running in 'ignore errors' mode due to --ignore-errors; please re-consider if this was not intended
Synchronising remote metadata to local cache...
Deleting local /home/hamish/.cache/duplicity/f152114ed2326b0ba48e42e6ec0a23d6/duplicity-full.20140915T183744Z.manifest (not authoritative at backend).
Last full backup date: none
Traceback (innermost last):
  File "/usr/bin/duplicity", line 1555, in <module>
    with_tempdir(main)
  File "/usr/bin/duplicity", line 1541, in with_tempdir
    fn()
  File "/usr/bin/duplicity", line 1393, in main
    do_backup(action)
  File "/usr/bin/duplicity", line 1476, in do_backup
    list_current(col_stats)
  File "/usr/bin/duplicity", line 702, in list_current
    sig_chain = col_stats.get_signature_chain_at_time(time)
  File "/usr/lib/python2.7/dist-packages/duplicity/collections.py", line 998, in get_signature_chain_at_time
    raise CollectionsError("No signature chains found")
 CollectionsError: No signature chains found

元のハードドライブからこれ以上ファイルを抽出できない場合、ファイルを抽出するオプションはありますか?

私は写真の抽出に最も興味があります。名前やファイルメタデータのない写真のファイルを抽出できたら、この時点で有利になります。

1
Hamish Downer

私は全体的に この回答のガイド に従いましたが、いくつかの点を詳しく説明したいと思います。

全体

difftar.gzファイルはすべて、単純なtar.gzファイルであり、暗号化されていません。そして、それらをすべて解凍すると、コンテンツがファイル構造に入れられます。トップレベルには2つのディレクトリがあります。

  • snapshot/-これにはプレーンファイルが含まれていますが、私の場合、気にしたファイルの(非常に)小さいサブセットがありました-回復したい100 GBのうち約100 MB。
  • multivol_snapshot/-各プレーンファイルのディレクトリが含まれます。各ディレクトリには、ファイル名として数字のみを含む一連のファイルがあります-12、... 。手動でファイルをまとめることができます。これは、少数のファイルに対して合理的に機能します。私はたくさん持っていました。

開梱

まず、すべてのtar gzファイルを解凍する必要がありました。

for f in duplicity-full.*.difftar.gz; do echo "$f"; tar xf "$f"; done

再構築

上記の答えにはシェルの1つのライナーがありますが、これによりcontentという名前の多数のファイルが元のコンテンツと混在して作成されます。ファイルシステムを作り直したかった。だから私は以下のpythonスクリプトを書きました、それは2つの引数を取ります:

  • 復元するビットを含むmultivol_snapshot/内のディレクトリ
  • 復元されたファイルを入れるディレクトリ。

すべてを再帰的に実行し、ファイルを再作成します。必要なチャンクがすべて揃っていれば、問題なく動作します...

#!/usr/bin/env python3
import argparse
from pathlib import Path
import shutil
import sys


class FileReconstructor():

    def __init__(self, unpacked_dir, restore_dir):
        self.unpacked_path = Path(unpacked_dir).resolve()
        self.restore_path = Path(restore_dir).resolve()

    def reconstruct_files(self):
        for leaf_dir in self.walk_unpacked_leaf_dirs():
            target_path = self.target_path(leaf_dir)
            target_path.parent.mkdir(parents=True, exist_ok=True)
            with target_path.open('wb') as target_file:
                self.copy_file_parts_to(target_file, leaf_dir)

    def copy_file_parts_to(self, target_file, leaf_dir):
        file_parts = sorted(leaf_dir.iterdir(), key=lambda x: int(x.name))
        for file_part in file_parts:
            with file_part.open('rb') as source_file:
                shutil.copyfileobj(source_file, target_file)

    def walk_unpacked_leaf_dirs(self):
        """
        based on the assumption that all leaf files are named as numbers
        """
        seen_dirs = set()
        for path in self.unpacked_path.rglob('*'):
            if path.is_file():
                if path.parent not in seen_dirs:
                    seen_dirs.add(path.parent)
                    yield path.parent

    def target_path(self, leaf_dir_path):
        return self.restore_path / leaf_dir_path.relative_to(self.unpacked_path)


def parse_args(argv):
    parser = argparse.ArgumentParser()
    parser.add_argument(
        'unpacked_dir',
        help='The directory with the unpacked tar files',
    )
    parser.add_argument(
        'restore_dir',
        help='The directory to restore files into',
    )
    return parser.parse_args(argv)


def main(argv):
    args = parse_args(argv)
    reconstuctor = FileReconstructor(args.unpacked_dir, args.restore_dir)
    return reconstuctor.reconstruct_files()


if __name__ == '__main__':
    sys.exit(main(sys.argv[1:]))
1
Hamish Downer

コレクションステータスはfile:/// home/hamish/poonbackup2014でチェーンを見つけます。したがって、理論的にはwholeバックアップを復元できるはずです。署名は、単一のファイル/フォルダーを復元する場合、または内容をリストする場合にのみ必要です。

..ede/duply.net

1
ede