确定LTO磁带的剩余容量

确定LTO磁带的剩余容量

如何确定 LTO 磁带上剩余多少空间?

如果我查找到末尾并检查状态,我可以看到我位于文件编号 17 上,但我不知道每个文件有多大。

$ mt -f /dev/nst1 eod
$ mt -f /dev/nst1 status
SCSI 2 tape drive:
File number=17, block number=0, partition=0.
Tape block size 0 bytes. Density code 0x44 (LTO-3).
Soft error count since last status=0
General status bits on (81010000):
 EOF ONLINE IM_REP_EN

除了读取整个带子外,我怎样才能确定磁带的已用/可用容量?

答案1

您可以在 SCSI 日志中找到剩余的磁带容量,以及许多其他有趣的信息,例如压缩率、读/写失败、驱动器/磁带历史记录等。

sg_logs -a /dev/nst1

sg3-utils此实用程序在通常名为或 的发行版包中可用sg3_utils

您正在寻找如下的行:

  • Main partition remaining capacity (in MiB)
  • Megabytes written to tape(从未压缩容量中减去)
  • Data bytes written to media by WRITE commands(从未压缩容量中减去)

如果做不到这一点,你可以尝试特定供应商的工具。例如,HP 有HPE 库和磁带工具,适用于所有 HP 兼容* 驱动器。在其菜单中,您可以找到创建和查看驱动器报告的功能,该报告提供在 中找到的所有信息sg_logs以及更多信息。


如果以上方法都失败了,那么你只能写入不可压缩的数据直到磁带用完,然后对写入的块进行计算以计算出剩余的数据(不用说,这有点糟糕):

dd if=/dev/urandom of=/dev/nst1 bs=1M status=progress iflag=fullblock

或者

openssl enc -aes-256-ctr -pass pass:"$(dd if=/dev/urandom bs=128 count=1 2>/dev/null | base64)" -nosalt < /dev/zero | dd of=/dev/nst1 bs=1M status=progress iflag=fullblock


我一直在整个答案中使用它,nst1因为这是原始问题中的设备,并根据需要进行更新。

答案2

在 Linux 上,您需要的是 sg3-utils 或 sg3_utils(名称取决于发行版)。

sg_read_attr 为您提供您想要的一切,即属性:

0x0000:       8       binary  Remaining capacity in partition [MiB]
0x0001:       8       binary  Maximum capacity in partition [MiB]

您可以使用以下方式获取所有可用属性

$ sg_read_attr -e                  
Attribute ID    Length  Format  Name
------------------------------------------
  0x0000:       8       binary  Remaining capacity in partition [MiB]
  0x0001:       8       binary  Maximum capacity in partition [MiB]
  0x0002:       8       binary  TapeAlert flags
  0x0003:       8       binary  Load count
  0x0004:       8       binary  MAM space remaining [B]
  0x0005:       8       ascii   Assigning organization
  0x0006:       1       binary  Format density code
  0x0007:       2       binary  Initialization count
  0x0008:       32      ascii   Volume identifier
  0x0009:       -1      binary  Volume change reference
  0x020a:       40      ascii   Density vendor/serial number at last load
  0x020b:       40      ascii   Density vendor/serial number at load-1
  0x020c:       40      ascii   Density vendor/serial number at load-2
  0x020d:       40      ascii   Density vendor/serial number at load-3
  0x0220:       8       binary  Total MiB written in medium life
  0x0221:       8       binary  Total MiB read in medium life
  0x0222:       8       binary  Total MiB written in current/last load
  0x0223:       8       binary  Total MiB read in current/last load
  0x0224:       8       binary  Logical position of first encrypted block
  0x0225:       8       binary  Logical position of first unencrypted block
                                after first encrypted block
  0x0340:       90      binary  Medium usage history
  0x0341:       60      binary  Partition usage history
  0x0400:       8       ascii   Medium manufacturer
  0x0401:       32      ascii   Medium serial number
  0x0402:       4       binary  Medium length [m]
  0x0403:       4       binary  Medium width [0.1 mm]
  0x0404:       8       ascii   Assigning organization
  0x0405:       1       binary  Medium density code
  0x0406:       8       ascii   Medium manufacture date
  0x0407:       8       binary  MAM capacity [B]
  0x0408:       1       binary  Medium type
  0x0409:       2       binary  Medium type information
  0x040a:       -1      unknown Numeric medium serial number
  0x0800:       8       ascii   Application vendor
  0x0801:       32      ascii   Application name
  0x0802:       8       ascii   Application version
  0x0803:       160     text    User medium text label
  0x0804:       12      ascii   Date and time last written
  0x0805:       1       binary  Text localization identifier
  0x0806:       32      ascii   Barcode
  0x0807:       80      text    Owning host textual name
  0x0808:       160     text    Media pool
  0x0809:       16      ascii   Partition user text label
  0x080a:       1       binary  Load/unload at partition
  0x080a:       16      ascii   Application format version
  0x080c:       -1      binary  Volume coherency information
  0x0820:       36      binary  Medium globally unique identifier
  0x0821:       36      binary  Media pool globally unique identifier

SA_value        Acronym Description
------------------------------------------
  0:            av      attribute values
  1:            al      attribute list
  2:            lvl     logical volume list
  3:            pl      partition list
  4:            smc     SMC-2 should define this
  5:            sa      supported attributes

读取属性:

# sg_read_attr -f 0x0 /dev/sg0
Remaining capacity in partition [MiB]: 587625
# sg_read_attr -f 0x1 /dev/sg0
Maximum capacity in partition [MiB]: 2499053

答案3

首先,这并不容易。

磁带盒中有一个芯片,可提供各种信息。该芯片称为 MAM(介质辅助存储器)。装入磁带时,可以使用磁带驱动器上的 SCSI 命令“READ ATTRIBUTE”读取信息。其中一个属性是“分区中的剩余容量”。它包含可写入当前磁带分区的字节数。这引出了一个问题:什么是磁带分区?最近版本的 LTO(LTO 5 及更新版本)磁带可以分区(LTFS 使用两个分区)。

如果您的磁带已分区,则每个分区都会有一定数量的可用空间,并且您需要循环遍历所有分区以获取每个分区的可用空间信息。

如果您想了解有关 MAM 的更多信息,请查看IBM 的 LTO-8 SCSI 参考详细解释了这一点(第 355 页开始的第 6.5 节包含有趣的内容)。如果你需要了解如何实现这一点,也许你应该看看信息管理系统或者sg3_utils 问题跟踪器中的此问题

我不确定这些信息在写入磁带后是否会立即更新。也许它只在卸载时更新,这会使检索准确信息变得更加困难。我也不确定当您覆盖磁带时这会如何表现。您可能必须自己弄清楚。

答案4

这里还有一个软件解决方案: https://github.com/Kevin-Nakamoto/LTO-CM-Read

这是一个开源 Linux bash 脚本,允许我们通过 SCSI 命令读取 MAM 信息。这是 Andreas 在上一篇文章中建议的“READ ATTRIBUTE”命令的一种软件包装器。您所要做的就是安装sg3-utilssg3_utils,然后运行脚本。您将看到“分区中的剩余容量”以及“分区中的最大容量”。

相关内容