Я пытаюсь извлечь резервное копирование из старой двуличности, создают резервную копию (сделанный человечностью gui, я полагаю, что это был deja-дубликат).
Я скопировал все, что я мог от перестающего работать жесткого диска. Я имею
difftar.gz
файлы - некоторый 2014 и некоторый 2016..manifest
файл с 2014.sigtar.gz
файлыРезервные копии не шифруются - я разархивировал тот difftar.gz
файл и исследованный это в Hex-редакторе и я вижу много простого текста.
Выполнение некоторых команд:
% 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
Принятие я не могу больше извлекать файлы из исходного жесткого диска, у меня есть какие-либо опции извлечь файлы?
Я больше всего интересуюсь извлечением фотографий - если бы я мог бы извлечь файл фотографий без имен или метаданных файла, которые были бы победой в этой точке.
Я в целом следовал руководству в этом ответе, но я хотел подробно остановиться на некоторых точках:
difftar.gz
файлы - все просто tar.gz
файлы, никакое шифрование. И если Вы распаковываете их всех, они помещают свое содержание в файловую структуру. Верхний уровень имеет два каталога:
snapshot/
- это содержит простые файлы, но в моем случае это имело (очень) небольшое подмножество файлов, о которых я заботился о - приблизительно 100 МБ 100 ГБ, которых я хотел восстановить.multivol_snapshot/
- это содержит каталог для каждого простого файла. В каждом каталоге существует ряд файлов, которые имеют просто число как имя файла - 1
, 2
... Размер файла, кажется, всегда составляет 64 КБ (кроме последнего, конечно). Вы можете вручную кошка файлы вместе, которые работали бы обоснованно на небольшое количество файлов. У меня было много все же.Сначала я должен был распаковать весь tar gz файлы:
for f in duplicity-full.*.difftar.gz; do echo "$f"; tar xf "$f"; done
Ответу понравилось выше, имеет оболочку один лайнер, но это создает много названных файлов 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:]))
состояние набора находит цепочку в file:///home/hamish/poonbackup2014. так теоретически необходимо смочь восстановить целое резервное копирование. подписи только необходимы, чтобы восстановить единственные файлы/папки или перечислить содержание.
.. ede/duply.net