Я пытаюсь написать программу для хранения большого объема данных (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 ленты