我正在试着写一个程序来在磁带上存储大量的数据(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块)
我是否在磁带和dd命令的行为中遗漏了什么?
P.S:The数据作为对象存储在Ceph上,我需要下载它们,但是我没有足够的空间来存储1盘磁带
发布于 2020-04-23 21:47:58
我有同样的想法,我遇到了同样的问题。我正在开发一个简单的磁带备份程序,它基本上是tar的包装器,它还在开头包含一个目录,可以使用list函数检索它。它还具有验证功能,用于检查存档中的文件是否仍与其原始校验和匹配,或者是否已损坏。
我想实现一个真正的append函数,但令我惊讶的是,在一开始更新TOC之后,似乎不可能阻止系统写入文件标记(在错误的位置,在归档中)。
但是,我的备份程序(名为"TOCTAR“)也有一个安全检查,可以防止管理员在没有提供磁带文件索引选项的情况下覆盖磁带上的第一个存档。它还有一个自动附加功能,它试图找到所有存档(由该程序创建),保持它们不变,并在最后创建一个新的磁带文件。也许它会对你的用例有用。如果你发现一些错误或丢失的东西,请随时打开Github问题。
简而言之:我没有设法在不截断的情况下覆盖磁带的一部分。但是你可以在一盘磁带上创建尽可能多的存档文件,我的磁带备份程序"TOCTAR“可能会帮助你做到这一点。(无耻的自我推销。)
我想在这里发布Github的url,但Github目前已关闭(504网关超时)。多么悲哀的一天啊。
发布于 2020-11-19 17:50:46
既然您是在LTO-7上编写代码,为什么不使用LTFS呢?它做的就是你想做的事情,只是效果更好。它适用于LTO>=5。
简而言之,您可以将磁带挂载为文件系统,然后像任何其他文件系统一样在其上创建目录和写入文件。唯一的区别是,在磁带上备份时,您可以获得非常高的传输率和非常长的寻道时间。
https://stackoverflow.com/questions/61087471
复制相似问题