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