Створення файлу tar з включеними контрольними сумами


16

Ось моя проблема: мені потрібно архівувати для tar-файлів багато (до 60 ТБ) великих файлів (зазвичай від 30 до 40 ГБ кожен). Я хотів би зробити контрольні суми (md5, sha1, що завгодно) цих файлів перед архівуванням; однак не читання кожного файлу двічі (один раз для контрольної суми, два рази для тарінгу) - це більш-менш необхідність для досягнення дуже високої продуктивності архівації (LTO-4 хоче підтримувати 120 Мб / с, а вікно резервного копіювання обмежене).

Тож мені знадобиться якийсь спосіб прочитати файл, подати інструмент контрольної суми з одного боку та створити дьоготь для стрічки з іншого боку, щось поряд:

tar cf - files | tee tarfile.tar | md5sum -

За винятком того, що я не хочу контрольної суми всього архіву (цей зразок коду оболонки робить саме це), а контрольної суми для кожного окремого файлу в архіві.

Я вивчив варіанти GNU tar, Pax, Star. Я подивився джерело з Архів :: Tar . Я не бачу очевидного способу цього досягти. Схоже, мені доведеться скласти щось на C або подібному, щоб досягти того, що мені потрібно. Perl / Python / і т.д. просто не знижуватимуть її ефективність, а різні програми tar вимагають необхідної "архітектури плагінів". Хтось знає про якесь існуюче рішення цього рішення, перш ніж я розпочну шифрування коду?


3
Звичайно, це є корисним доповненням, tarякщо ви вирішите його написати;)

1
Чи не ваше запитання, але 7zви можете вибрати хеш і надрукувати його таким чином , що sha1sumі sha256sumможна зрозуміти: 7zip.bugaco.com/7zip/7zip_15_09/MANUAL/cmdline/commands / ...sami-lehtinen.net/blog / ... ) Спробуйте: 7z h -scrcsha256 mydir/* | sed --regexp-extended 's, +[0-9]+ +, ,g' > mydir.sha256sum ; sha256sum -c mydir.sha256sum(тестовано на версії p7zip версії 15.09 бета)
Немо

Відповіді:


15

Перш ніж продовжувати та перезаписувати тар, ви, можливо, захочете проаналізувати швидкий і простий метод читання даних двічі, оскільки це може бути не набагато повільніше, ніж робити це за один прохід.

Тут реалізований метод двох проходів:

http://www.g-loaded.eu/2007/12/01/veritar-verify-checksums-of-files-within-a-tar-archive/

за допомогою одного вкладиша:

  tar -cvpf mybackup.tar myfiles/| xargs -I '{}' sh -c "test -f '{}' && 
  md5sum '{}'" | tee mybackup.md5

Хоча правда, що md5sum читає кожен файл з диска паралельно з tar, замість того, щоб передавати дані, що передаються через трубу, кешування керування дисками Linux повинно зробити це друге читання простим читанням з буфера пам'яті, яке насправді не повинно бути повільніше, ніж stdin читати. Вам просто потрібно переконатися, що у кеш диска у вас є достатньо місця, щоб зберігати достатньо кожного файлу, який 2-й читач завжди читає з кеша і не заходить досить далеко, щоб отримати необхідність з диска


3
Насправді це працює дуже добре, виглядає обмеженою здатністю процесора розчавлювати md5 (~ 280 Мб / с на одному ядрі).
wazoox

4

Ось приклад сценарію Python. Він обчислює контрольну суму файлу як його додавання до архіву. В кінці сценарію файл контрольної суми додається до архіву.

import hashlib,os
import tarfile
def md5(filename):
    ''' function to get md5 of file '''
    d = hashlib.md5()
    try:
        d.update(open(filename).read())
    except Exception,e:
        print e
    else:
        return d.hexdigest()

root="/home"
outtar=os.path.join(root,"path1","output.tar")
path = os.path.join(root,"path1")
chksum_file=os.path.join(root,"path","chksum.txt")
tar = tarfile.open(outtar, "w")
o_chksum=open(chksum_file,"w")
for r,d,f in os.walk(path):
    for files in f:
        filename=os.path.join(r,files)
        digest="%s:%s"%(md5(filename) , filename)
        o_chksum.write(digest+"\n")
        tar.add(os.path.join(r,files))

tar.add(chksum_file)
tar.close()
o_chksum.close()

Коли ви знімаєте знімок, використовуйте chksum_file для підтвердження контрольної суми


1
Так, це щось подібне, про що я думав, але зазвичай такі бібліотеки завантажують файл в оперативну пам’ять перед тим, як маніпулювати ним, а мої файли принаймні 20 ГБ ....
wazoox

1

Я думаю, що вашою проблемою є проблема дизайну tar, оскільки tar не дозволяє випадковий доступ / позиціонування всередині архіву через таблицю вмісту, таким чином, усі протоколи будуть базуватися на файлах, а не на буфері.
Таким чином, ви можете переглянути різні формати, такі як PAX або DAR, які дозволяють отримати випадковий доступ.


1
На жаль, показник дьогтю є обов'язковим, оскільки саме на цьому ґрунтується робочий процес.
wazoox

0

Останні формати архівів, як правило, включають деякий хеш для перевірки файлів, але у них є аналогічна проблема: ви не завжди можете вибрати власну функцію хешування, а також зберігати локальну копію хешей.

Ви можете зберегти локальну копію хешей, відмінну від тієї, яка вбудована в сам архів: наприклад, якщо архів зберігається в автономному режимі (на стрічках або в центрі обробки даних, з яких дорого читати), і ви хочете перевірити локальна копія файлу / каталогу.

7zip має декілька варіантів, як 7z hзі спеціальним хешем, і 7z l -sltперераховувати всі хеші та багато іншого, але що робити, якщо ви хочете список хедів md5 або sha1? Ви можете використовувати -bbта-bs контролювати багатослів’я та повторно використовувати метод Джорджа Нотараса, згаданий у прийнятій відповіді:

7z a -bsp1 -bb3 dir.7z dir 2>&1 \
| grep "^+" | sed 's,^+ ,,g' | xargs -d "\n" -I § -P 1 sh -c "test -f '§' && sha1sum '§'" \
| tee dir.sha1
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.