RMT 特殊文件
用途
提供对顺序存取批量存储介质设备驱动程序的访问。
描述
磁带主要用于备份,文件归档和其他离线存储。 磁带通过 /dev/rmt0, ... , /dev/rmt255 特殊文件进行访问。 特殊文件名中的 R 指示 原始 通过字符特殊文件接口进行访问。 磁带设备本身不适合块设备的类别。 因此,仅提供字符接口特殊文件。
与每个磁带设备关联的 特殊文件 确定在打开或关闭操作期间执行的操作。 对于适用的设备,这些文件还规定了要写入磁带的数据密度。 下表显示了这些特殊文件的名称及其相应的特征:
| 特殊文件名 | 特点 |
|---|---|
| /dev/rmt* |
|
| /dev/rmt*.1 |
|
| /dev/rmt*.2 |
|
| /dev/rmt*.3 |
|
| /dev/rmt*.4 |
|
| /dev/rmt*.5 |
|
| /dev/rmt*.6 |
|
| /dev/rmt*.7 |
|
- 密度设置 #1 和密度设置 #2 的值来自可以使用 SMIT 来设置的磁带机属性。 通常,密度设置 #1 设置为磁带机的最高可能密度,而密度设置 #2 设置为更低的密度。 但是,不需要密度设置就可以遵循此模式。
- 当使用不支持多个密度的磁带设备时,将忽略密度值 (字节/英寸)。 对于支持多种密度的磁带机,仅当写入磁带时才会应用密度值。 当读取时,磁带机缺省为磁带写入密度。
- 大多数磁带机都使用 512 字节的块大小。 8mm 磁带机使用的最小块大小为 1024 字节。 使用 SMIT 来降低块大小,将浪费空间。
使用注意事项
大多数磁带操作是使用 开, 读, 写和 关闭 子例程实现的。 但是,出于诊断目的,需要 奥佩克斯 子例程。
打开和关闭子例程
在写完文件后关闭文件时应注意。 如果应用程序对刚刚写入的数据进行反转,那么将不会写入任何文件标记。 但是,对于允许进行块更新的磁带设备,除非在相反方向上的应用程序空间或将磁带位置返回到磁带开头 (BOT) ,否则在关闭设备时将写入一到两个文件标记。 (文件标记的数量取决于特殊的文件类型。)
对于多磁带作业,必须对每个磁带打开并关闭特殊文件。 如果打开了特殊文件并且磁带已被更改,那么不允许用户继续。
奥佩克斯 子例程主要是由诊断命令和实用程序使用的。 执行需要相应的权限。 若未获得适当权限而执行此子程序,将返回值 -1 ,同时全局变量errno 被设置为EPERM。
读写子例程
当打开以进行读或写时,假定磁带被定位为期望的位置。 当磁带作为 no-rewind-on-close (/dev/rmt*.1) 打开并且写入一个文件时,在关闭磁带时将写入单个文件标记。 当磁带在关闭时作为倒带打开 (/dev/rmt *) 并写入文件时,将在关闭磁带时写入双文件标记。 当磁带以 "关闭时不倒带" 方式打开并从文件中读取时,磁带将在关闭时位于刚刚读取的数据之后的文件结束符 (EOF) 标记之后。
通过专门选择 雷姆特 文件,就可以创建多个文件磁带。
虽然磁带是通过字符接口特殊文件访问的,但读操作或写操作所需的字节数必须是为磁带设备定义的块大小的倍数。 当磁带机处于可变块方式时,对于小于磁带块大小的读请求将返回所请求的字节数,并将 错误号 全局变量设置为值 0。 在这种情况下, 读 子例程的 扩展 参数必须设置为 TAPE_SHORT_READ。
在读取期间,将以读取的字节数形式返回记录大小,直至达到指定的缓冲区大小为止。 如果迂到 EOF 条件,那么会返回零长度读取,并将磁带定位在 EOF 之后。
在读或写操作期间迂到的介质结束 (EOM) 条件将导致返回成功就绪或已写入的字节数。 当设备到达行尾(EOM)后尝试写入时,将 -1 返回值,同时全局变量 errno 被设置为ENXIO 值。 在设备达到 EOM 后尝试进行读取时,将返回零长度的读取。 连续读取将继续返回零长度的读取。
使用磁带设备进行数据缓冲: 某些磁带设备包含数据缓冲区,以在写入磁带时最大限度提高数据传输速度。 当将数据传送至磁带设备的数据缓冲区时,发送至磁带的写操作将返回为完成。 然后,缓冲区中的数据将异步写入磁带。 因此,由于主机不需要等待 I/O 完成,因此数据传输速度会提高。
磁带设备驱动程序提供了两种方式,以方便使用这些数据缓冲区。 非缓冲方式会导致对磁带的写操作绕过数据缓冲区并直接转至磁带。 在缓冲方式下,当传输数据已成功写入磁带设备缓冲区时,所有写子例程都将返回为完成。 直到关闭特殊文件或迂到 EOM 条件后,设备驱动程序才会清空数据缓冲区。
如果在以缓冲方式运行时迂到 EOM 条件,那么设备会尝试刷新设备数据缓冲区。 在缓冲方式下,残差计数可能超过写传输长度。 在某些情况下,清空剩余数据实际上可能会将磁带从卷盘中拉出。 无论哪种情况都被视为失败,并返回值, -1 同时将全局变量 errno 设置为 EIO。 这些错误可能需要用户在非缓冲方式下运行。
rmt 特殊文件注意事项: 在读取或写入磁带时导致设备重置的故障需要关闭特殊文件并重新启动作业。 在此条件发生后直至特殊文件关闭期间发出的任何命令,都会导致返回 -1 值为,同时全局变量errno被设置为EIO。 非重置类型错误 (即,介质或硬件错误) 会导致磁带留在发生错误的位置。
对于多磁带作业,必须对每个磁带打开和关闭特殊文件。 如果打开了特殊文件并且磁带已被更改,那么不允许用户继续。
由磁带设备驱动程序接收到的信号将导致当前命令异常中止。 因此,应用程序会暂停耗时的命令 (例如,擦除操作) ,而不会重新启动磁带机电源或等待超时发生。
使用零 (0) 作为块大小参数指示块大小是可变长度的。
ioctl 子例程
为使用 ioctl 子例程的所有设备驱动程序定义了一个 ioctl 操作 IOCINFO。 对于 雷姆特 特殊文件,也已定义了 STIOCTOP 操作。
IOCINFO ioctl 操作: IOCINFO ioctl 操作返回 /usr/include/sys/devinfo.h 文件中定义的结构。
STIOCTOP ioctl 操作: STIOCTOP ioctl 操作提供命令执行操作,例如,擦除和重新拉紧。 使用 STIOCTOP 操作的 ioctl 子例程的参数指定 stop 结构的地址,如 /usr/include/sys/tape.h 文件中所定义。
在以下位置找到的操作:st_op执行 停 结构中的字段st_count次,除了倒带,擦除和再张力操作。 可用的操作包括:
| 项 | 描述 |
|---|---|
| 流 | 倒过来 |
| STOFFL | 倒带和卸载磁带。 必须先插入磁带,然后才能再次使用该设备。 |
| 斯特酶 | 擦除磁带; 在装入点离开。 |
| 斯特雷滕 | 重新拉紧磁带; 在装入点离开。 |
| STWEOF | "写" 和 "文件结束" 标记。 |
| STFSF | 转发空间文件。 |
| STFSR | 转发空间记录。 |
| STRSF | 反向空间文件。 |
| STRSR | 反向空间记录。 |
| STDEOF | 禁用 "文件结束" 检查。 注: 使用 STDEOF 命令使应用程序能够在磁带结束后进行写操作。 通过发出 STDEOF 命令来禁用文件结束检查时,应用程序应负责防止使用此命令时可能发生的错误情况。
|
错误代码
除了针对 ioctl, 开, 读和 写 子例程列出的一般错误代码外,还可能发生以下特定错误代码:
| 项 | 描述 |
|---|---|
| 再一次 | 已尝试对已打开的设备执行打开操作。 |
| EBUSY | 目标设备由另一个发起方保留。 |
| EINVAL | O_APPEND 是作为打开方式提供的。 |
| EINVAL | 读 或 写 子例程的 nbyte 参数不是 blocksize 的偶数倍。 |
| EINVAL | ioctl 子例程的某个参数无效。 |
| EINVAL | 请求的 ioctl 操作在当前设备上不受支持。 |
| EIO | 无法将空间向前或反向st_count在迂到 EOM 条件或文件标记之前记录。 |
| EIO | 无法将空间向前或反向st_count迂到 EOM 条件之前的文件标记。 |
| EMEDIA | 磁带设备迂到了不可恢复的介质错误。 |
| ENOMEM | 为读取磁带上的可变长度记录而请求的字节数小于可变长度记录的实际大小 (以字节为单位)。 |
| 准备就绪 | 磁带机中没有磁带,或者磁带机未准备好。 |
| ENXIO | 当磁带处于 EOM 时,尝试执行写操作。 |
| EPERM | 请求的子例程需要适当的权限。 |
| 时间已到 | 某个命令已超时。 |
| EWRPROTET | 已尝试对只读磁带执行打开操作以进行读/写操作。 |
| EWRPROTET | 在只读磁带上尝试了影响介质的 ioctl 操作。 |