覆写

问题描述 投票:0回答:1

我想写一个程序来存储大量的数据(100s 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
...

当我复制了所有的焦油文件后,我创建了一个新的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了!(10块每块4K)

我是否在磁带和dd命令的行为中遗漏了什么?

P.S:数据以对象的形式存储在Ceph上,我需要下载它们,但我没有足够的空间来存储1盘磁带。

tar dd data-persistence
1个回答
0
投票

我有同样的想法,我遇到了同样的问题。我正在开发一个简单的磁带备份程序,它基本上是tar的一个包装,它还在开头包含了一个内容表,可以用list功能检索。它还有一个验证功能,用来检查存档中的文件是否仍然符合它们的原始校验和,或者是否有什么东西被损坏了。

我想实现一个真正的追加功能,但令我惊讶的是,在更新了开头的TOC后,似乎无法防止系统写入一个文件标记(在错误的位置,在档案中)。

然而,我的备份程序,名为 "TOCTAR",也有一个安全检查,如果没有提供磁带文件索引选项,可以防止管理员覆盖磁带上的第一个存档。它还有一个自动追加的功能,它试图找到所有的存档(是由该程序创建的),而不去碰它们,并在最后创建一个新的磁带文件。也许它对你的用例会有用。如果你发现有什么地方是错误的或遗漏的,请随时开一个Github问题。

简而言之:我还没办法在不截断的情况下覆盖磁带的一部分。但你可以在一盘磁带上创建尽可能多的存档,我的磁带备份程序 "TOCTAR "可能会帮助你。(无耻的自我宣传。)

我本想把Github的网址贴在这里,但Github目前已经关闭了(504网关超时)。多么悲伤的一天。

更新。https:/github.comc0xctoctar.git.

© www.soinside.com 2019 - 2024. All rights reserved.