【发布时间】:2020-07-20 02:01:50
【问题描述】:
我正在尝试编写一个程序来在磁带上存储大量数据(100 PB)。我正在使用 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 以某种方式破坏了 index.txt 末尾的 EOF 标记,所以我尝试只编辑文件的开头:
dd conv=notrunc count=10 bs=4k if=index.txt of=/dev/nst4
有线的事情是在那之后,我在磁带中的第一个条目将只有 40K! (每个 4k 10 个块)
我是否遗漏了 tape 和 dd 命令的行为?
P.S:数据作为对象存储在 Ceph 上,我需要下载它们,但我没有足够的空间来存储 1 个磁带
【问题讨论】:
-
这就是磁带的工作方式。它只能附加到。你最后一次停止写入的地方就是你的数据的结束。
-
如果您正在写入大量数据,您应该尝试写入磁带标记,因为许多系统可以向前或向后定位到磁带标记比定位到文件结尾快得多。
-
进一步的忠告...确保在磁带的开头写上标签(磁性,而不是用笔),这样如果您的外部条形码脱落或被损坏。
-
如果您不知道,有一个 ANSI/ISO 标准 80 字节磁带标签 ibm.com/support/knowledgecenter/en/SSLTBW_2.1.0/…
标签: tar dd data-persistence