2016-07-17 14 views
2

Существует резервная программа bup (https://github.com/bup/bup) на основе некоторых идей и некоторых функций от системы управления версиями git для компактного хранения изображений виртуальной машины.Как сделать резервное копирование изображений на основе байт (на основе git) вычисляет хэши хранящихся объектов

В bup есть bup ls субкоманды, который может показать некоторые SHA1-как хэш (тот же длиной гекса) объектов, хранящихся в резервной копии, когда передается -s варианта (в man bup-ls есть только "-s, --hash : показать хэш для каждого файла/каталога. "). Но sha1-подобный хеш не равен sha1sum вывода исходного файла.

Оригинал git вычисляет SHA1 хэш данных предваряя данные с `сгустка NNN \ 0' строка, где NNN является размер объекта в байтах, записывается в виде десятичной дроби, в соответствии с How does git compute file hashes? и https://stackoverflow.com/a/28881708/

я тестировал префикс` блоба NNN \ 0 'и все еще не такая же сумма sha1.

Что такое метод вычисления хэш-суммы для файлов, используется в bup? Это линейный sha1 или какой-то древовидный вариант, например, деревья Меркле? Что такое хэш каталога?

Источник команды ls команды bup: https://github.com/bup/bup/blob/master/lib/bup/ls.py, а хеш просто напечатан в шестнадцатеричном формате, но где был создан хеш?

def node_info(n, name, 
    ''' .... 
    if show_hash: 
     result += "%s " % n.hash.encode('hex') 

Это хэш генерируется на создание резервной копии БУП (когда файл помещается внутрь архива, bup index + bup save команд) и просто распечатать на bup ls; или он пересчитывается на каждые bup ls и может использоваться как проверка целостности резервной копии bup?

+0

https://github.com/bup/bup/blob/master/DESIGN – torek

+0

Торека, уже проверил, нет точной информации о хэше вычисление (есть тип sha1, но * не равно sha1sum *) – osgx

+0

bup разделяет файлы-данные на множество файлов, используя описанную там технику. Таким образом, «bup hash» файла не является хэш-файлом git, потому что нет единственного git blob, соответствующего файлу или каталогу, который является bup-save-d. Итак, см. Строки 556-560. Здесь * есть * один объект git * tree * для такого файла и, вероятно, это хэш-код bup. В любом случае целостность всей резервной копии (или даже одного элемента группы в ней) явно не проверяется, не проверяя все базовые объекты git, что требует запуска 'git fsck' или эквивалентного. – torek

ответ

0

bup хранит все данные в голом репозитории git (который по умолчанию расположен по адресу ~/.bup). Поэтому метод вычисления хеша bup точно повторяет тот, который используется git.

Однако важное отличие от git заключается в том, что bup может разбивать файлы на куски. Если bup решает разбить файл на куски, тогда файл представляется в репозитории как дерево, а не как blob. В этом случае хэш файла bup совпадает с хэшем git соответствующего дерева.

Следующий сценарий показывает, что:

bup_hash_test

#!/bin/bash 

bup init 
BUPTEST=/tmp/bup_test 
function test_bup_hash() 
{ 
    bup index $BUPTEST &> /dev/null 
    bup save -n buptest $BUPTEST &> /dev/null 
    local buphash=$(bup ls -s buptest/latest$BUPTEST|cut -d' ' -f 1) 
    echo "bup's hash: $buphash" 
    echo "git's hash: $(git hash-object $BUPTEST)" 
    echo git --git-dir \~/.bup cat-file -p $buphash 
    git --git-dir ~/.bup cat-file -p $buphash 
} 

cat > $BUPTEST <<'END' 
    http://pkgsrc.se/sysutils/bup 
    http://cvsweb.netbsd.org/bsdweb.cgi/pkgsrc/sysutils/bup/ 
END 

test_bup_hash 

echo 
echo 

echo " -1" >> $BUPTEST 

echo "After appending ' -1' line:" 
test_bup_hash 

echo 
echo 

echo "After replacing '-' with '#':" 
sed -i 's/-/#/' $BUPTEST 
test_bup_hash 

Выход:

$ ./bup_hash_test 
Initialized empty Git repository in ~/.bup/ 
bup's hash: b52baef90c17a508115ce05680bbb91d1d7bfd8d 
git's hash: b52baef90c17a508115ce05680bbb91d1d7bfd8d 
git --git-dir ~/.bup cat-file -p b52baef90c17a508115ce05680bbb91d1d7bfd8d 
    http://pkgsrc.se/sysutils/bup 
    http://cvsweb.netbsd.org/bsdweb.cgi/pkgsrc/sysutils/bup/ 


After appending ' -1' line: 
bup's hash: c95b4a1fe1956418cb0e58e0a2c519622d8ce767 
git's hash: b5bc4094328634ce6e2f4c41458514bab5f5cd7e 
git --git-dir ~/.bup cat-file -p c95b4a1fe1956418cb0e58e0a2c519622d8ce767 
100644 blob aa7770f6a52237f29a5d10b350fe877bf4626bd6 00 
100644 blob d00491fd7e5bb6fa28c517a0bb32b8b506539d4d 61 


After replacing '-' with '#': 
bup's hash: cda9a69f1cbe66ff44ea6530330e51528563e32a 
git's hash: cda9a69f1cbe66ff44ea6530330e51528563e32a 
git --git-dir ~/.bup cat-file -p cda9a69f1cbe66ff44ea6530330e51528563e32a 
    http://pkgsrc.se/sysutils/bup 
    http://cvsweb.netbsd.org/bsdweb.cgi/pkgsrc/sysutils/bup/ 
#1 

Как мы можем видеть, когда bup 's и git' матч хэши s , соответствующий объект в bup репозиторий - это blob с ожидаемым содержимым. Когда bup и хеши git НЕ совпадают, объект с хешем bup является деревом.Содержание сгустков в этом дереве соответствует фрагментам полного файла:

$ git --git-dir ~/.bup cat-file -p aa7770f6a52237f29a5d10b350fe877bf4626bd6 
    http://pkgsrc.se/sysutils/bup 
    http://cvsweb.netbsd.org/bsdweb.cgi/pkgsrc/sysutils/bup/ 
-$ git --git-dir ~/.bup cat-file -p d00491fd7e5bb6fa28c517a0bb32b8b506539d4d 
1 
+0

Что я? Я поставил файл 40 ГБ (изображение раздела) в двух версиях в bup, а затем использовал sha1sum на bup-fuse для повторной проверки. Я хочу иметь более простой способ проверки правильности резервного копирования. Теперь у меня есть dd из раздела в папку tmp (первое считывание с диска), индекс, сохранение (чтение из tmp; работа с bup), монтирование bup-fuse, запуск sha1sum на раздел и файл в плавких предохранителях (3-е считывание с диска, второе считывание от bup). Я хочу: dd, который будет вычислять правильный sha1 на копии (на лету) - пропустить отсчет источника. И получить реальную сумму сохраненного файла (bup на медленном диске тоже, высокая загрузка процессора из плавкого предохранителя). (Я знаю ответ на свой q, это – osgx

+0

Bup не git! Он просто украл некоторые идеи/форматы из git, но у него есть свой СОБСТВЕННЫЙ вариант хэша. Он скрыт в источниках bup, но его можно найти. Имя переменной «sha» не является истинной sha1, это некоторый (переменный) префикс, как в git-приложении, но не тот же префикс. Что такое префикс? Какой вариант sha используется для commit-id? не связанный с вопросом, можете ли вы перенаправить его непосредственно в качестве проблемы в github bup/bup? PS: И эта ошибка указывает на то, что значение хэша, напечатанное 'bup ls -s', не задокументировано (какая у вас версия bup?) – osgx

+0

@osgx См. обновленный ответ. Он содержит окончательное доказательство того, что bup полностью зависит от git для вычисления хеша. – Leon

 Смежные вопросы

  • Нет связанных вопросов^_^