перезаписать файл на ленте

Я пытаюсь написать программу для хранения большого объема данных (100 ПБ) на лентах. Я использую tar для группировки файлов, но по техническим причинам я решил записать несколько tar на одну ленту.

Чтобы легко найти, какие данные находятся на ленте, я решил создать небольшой индекс и записать его в начале ленты. Итак, я делаю что-то вроде этого:

# create an empty index file
head -c 1M < /dev/urandom > index.txt

# rewind tape
mt -f /dev/nst0 rewind

# write index to the beginning of the tape
dd bs=4k if=index.txt of=/dev/nst0


# write tar file to tape
dd bs=4k if=one.tar of=/dev/nst0
...

После того, как я скопировал все tar-файлы, я создаю новый index.txt точно такого же размера и копирую его в начало ленты:

mt -f /dev/nst0 rewind
dd bs=4k if=index.txt of=/dev/nst0

Но это портит остальные данные. Под повреждением я подразумеваю, что если я перематываю ленту и пытаюсь читать с нее, я могу прочитать только файл index.txt, после чего он больше не может читать данные, и mt status приводит к:

SCSI 2 tape drive:
File number=1, block number=-1, partition=0.
Tape block size 0 bytes. Density code 0x5c (LTO-7).
Soft error count since last status=0
General status bits on (9010000):
 EOD ONLINE IM_REP_EN

В начале я, хотя dd как-то испортил метку EOF в конце index.txt, поэтому я попытался отредактировать только начало файла:

dd conv=notrunc count=10 bs=4k if=index.txt of=/dev/nst4

Дело в том, что после этого моя первая запись в ленте будет иметь только 40К! (10 блоков по 4к)

Я что-то упустил в поведении команды tape и dd?

P.S: Данные хранятся на Ceph в виде объектов и мне нужно их скачать, а у меня не хватает места для хранения 1 ленты


person mmohaveri    schedule 07.04.2020    source источник
comment
Так работает лента. Его можно только дополнить. Там, где вы в последний раз остановились, ваши данные закончились.   -  person Mark Setchell    schedule 07.04.2020
comment
Если вы записываете много данных, вам следует поэкспериментировать с записью меток ленты, поскольку многие системы могут перемещаться вперед или назад к меткам ленты значительно быстрее, чем к концу файла.   -  person Mark Setchell    schedule 07.04.2020
comment
Еще один совет... обязательно напишите этикетку (на магните, а не ручкой) в начале ленты, чтобы не потеряться, если ваши внешние штрих-коды отклеятся или повредятся.   -  person Mark Setchell    schedule 07.04.2020
comment
Если вы не знали, существует стандартная 80-байтовая метка ленты ANSI/ISO ibm.com/support/knowledgecenter/en/SSLTBW_2.1.0/   -  person Mark Setchell    schedule 08.04.2020


Ответы (2)


У меня была такая же идея, и я столкнулся с той же проблемой. Я работаю над простой программой резервного копирования на ленту, которая в основном является оболочкой для tar, которая также включает в себя оглавление в начале, которое можно получить с помощью функции списка. Он также имеет функцию проверки, чтобы проверить, соответствуют ли файлы в архиве их исходной контрольной сумме или что-то было повреждено.

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

Однако моя программа резервного копирования под названием «TOCTAR» также имеет проверку безопасности, которая не позволяет администратору перезаписать первый архив на ленте, если не указан параметр индекса файла ленты. Он также имеет функцию автоматического добавления, которая пытается найти все архивы (которые были созданы этой программой), оставляя их нетронутыми, и создает в конце новый файл ленты. Возможно, это будет полезно для вашего случая использования. Не стесняйтесь открывать проблему на Github, если вы обнаружите, что что-то не так или отсутствует.

Вкратце: мне не удалось перезаписать участок ленты, не обрезав его. Но вы можете создать столько архивов на ленте, сколько сможете сосчитать, и моя программа резервного копирования на ленту "TOCTAR" может помочь вам в этом. (Бесстыдная самореклама.)

Я бы разместил URL-адрес Github здесь, но Github в настоящее время не работает (тайм-аут 504 Gateway). Какой грустный день.

Обновление: https://github.com/c0xc/toctar.git

person c0xc    schedule 23.04.2020

Поскольку вы пишете на LTO-7, почему бы не использовать LTFS? Он делает именно то, что вы пытаетесь сделать, только намного лучше. Работает с LTO›=5.

Короче говоря, вы можете монтировать ленту как файловую систему, затем создавать каталоги и записывать на нее файлы, как и в любой другой файловой системе. Единственная разница в том, что при записи на ленту вы получаете очень высокую скорость передачи и очень долгое время поиска.

person dizzy    schedule 19.11.2020
comment
Причина, по которой я не использую LTFS, заключается в том, что LTFS была разработана для многих ситуаций чтения, многих ситуаций записи, но моя рабочая нагрузка больше похожа на тип записи один раз, чтение много раз. Поскольку LTFS предназначена для этой более широкой цели, ей пришлось пойти на некоторые компромиссы. В частности, мне не понравилось, как LTFS хранит свой индексный каталог. - person mmohaveri; 18.12.2020