据我了解,LTO 磁带以“绕圈”的方式写入数据,第一圈将磁带解开放入驱动器,第二圈将其绕回磁带盒中。这个过程重复多次,其理念是,一旦磁带到达末尾,所有磁带都将回到磁带盒中,只需稍微倒带即可弹出。
然而,我注意到,当磁带到达末尾时,驱动器听起来就像是完成了最后一圈的一半,因此驱动器会花一些时间倒带然后再弹出磁带,即使它报告说已经到达磁带末尾。
这是因为磁带上有一些保留容量,用于重写故障块或跳过磁带的损坏部分而不减少总容量吗?还是有其他原因导致磁带明显提前耗尽?
答案1
如果您的驱动器是新的,并且磁带质量良好,那么您可以预期能够向磁带写入比官方容量更多的字节。从某种意义上说,您可以将其称为备用容量,但它并非未使用的。
随着驱动器磁头的磨损,容量会减少。如果再加上质量不佳的磁带,容量可能会进一步减少。
因为容量会发生变化,所以需要某种方式来向备份应用程序发出信号,告知其容量已用完。如果备份应用程序到达磁带末尾而又没有做好准备,那么它就会出现问题。最好提前向应用程序发出警告,以便它可以使用剩余空间来完成正在执行的操作。
如果您的操作系统恰好是 Linux,则 API 会这样:一旦到达磁带的最后部分,所有其他write
系统调用都会失败。如果您的备份应用程序不知道此功能,它会将第一个部分视为结尾,并且磁带上会剩下一些未使用的空间。ENOSPC
ENOSPC
我可以想象在其他操作系统上也会发生类似的事情。
答案2
感谢@kasperd,我做了进一步调查,发现问题确实出在这里。原来这个功能叫做 EWEOM(Early Warning End Of Media),指的是磁带制造商在磁带上放置的标记,因此不是驱动器在跟踪磁带卷绕了多少长度。
我为用于写入磁带的程序编写了一个补丁mbuffer
,果然,当我到达磁带末尾时,我 ENOSPC
在交替调用时收到错误write()
,但我可以继续写入更多数据。就我而言,数据量相当大 - 介于 8 到 19 GiB 之间,具体取决于对我的不太可压缩的数据的压缩。
有趣的是,达到 EWEOM 标记后,磁带写入速度急剧下降。它几乎从 80MB/秒减半到大约 47MB/秒。这似乎不是数据问题,因为在此之前,驱动器已经保持 80MB/秒的速度几个小时了。您可以听到驱动器电机以较慢的速度运转,并且重写整个磁带以重写此部分不会提高速度(因此,第一次写入的速度不会像在全新磁带的开头那样慢。)
我找不到任何关于 EWEOM 标记应在磁带上出现的时间的文档,因此我不确定它是否标准化。我所能找到的只是对 LTO-6/7 驱动器的模糊引用,该标记增加到磁带空间的 5%,这似乎很多。也许这是因为磁带的写入速度很快,因此可以刷新较大的缓冲区。
就 Linux API 而言,相关行位于st.c
SCSI磁带驱动程序源代码这种行为的解释是st
驱动程序文档。