перезаписать файл на ленту - PullRequest
0 голосов
/ 07 апреля 2020

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

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

# 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 Mark в конце index.txt, поэтому я попытался отредактировать только начало файла:

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

За этим следует проводная связь, моя первая запись в ленте будет иметь только 40K! (10 блоков каждые 4k)

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

PS: данные хранятся на Ceph как объекты, и мне нужно их загрузить, и У меня недостаточно места для хранения 1 ленты

1 Ответ

0 голосов
/ 23 апреля 2020

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

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

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

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

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

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

...