如何确定 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-utils
或sg3_utils
,然后运行脚本。您将看到“分区中的剩余容量”以及“分区中的最大容量”。