我有一台运行 AIX 5.3 的 AIX P720 服务器。当运行tar -xvf /dev/rmt0
从磁带(IBM TS3100 磁带库)提取时,出现以下错误:“ There is not enough memory available now
”。当我尝试使用cp
复制文件时也会发生这种情况。我显着增加了分页空间,但问题仍然存在。
答案1
Unix 下的磁带设备有点独特,因为它们是面向记录的而不是字节流。因此,写入磁带的每条记录必须是某个块大小(通常为 512 字节)的整数倍,并且必须在单次write
调用中完成。每个磁带设备都有记录大小的下限和上限。同样,您必须在一次调用中读取记录read
,并为其提供至少与实际记录大小一样大的缓冲区。如果您尝试读取的大小小于记录大小,Unix 将不会返回部分记录;它会返回ENOMEM
错误。
选择记录大小取决于应用程序。 Tar 有一个b
选项,调用阻断因子;值 20 表示 20*512 字节。较旧的操作系统将缓冲区限制为 64kbyte,因此流行的阻塞因子是 126,但更新、更快的磁带驱动器需要更大的最小记录大小。 cpio 使用该C
选项来设置缓冲区大小。为了保持理智,通常最好使用dd
给定的块大小(使用bs=
或ibs=
选项)从磁带驱动器读取数据,然后将其通过管道传输到任何将解压数据的程序。
所以试试这个:
dd if=/dev/rmt0 bs=1024k | tar xvf -
答案2
我想知道您是否可以在不尝试恢复的情况下列出文件。你可以尝试这样做tar -tvf /dev/rmt0
另外,您是否可以将输出捕获到文件而不是 STDOUT(您的屏幕)?
tar -tvf /dev/rmt0 1>/tmp/rest.out 2>/tmp/rest.err
还有其他几个方面值得关注。它实际上是物理内存吗?如果是这样,您应该会使用 lsps -a 命令或使用 nmon(用于内存的选项 m)或 topas 等实用程序看到对分页空间的一些命中。
另一种想法是:这并不像 NCARGS 那样简单。根据记忆(请原谅双关语),这会给出不同的错误,例如“参数列表太长”。但可能值得使用以下方法进行检查: lsattr -El sys0 -a ncargs
其他一些选项是尝试在不同的 LPAR 上进行还原,假设您确实有另一个 LPAR 可以分配给它或另一个磁带驱动器。
答案3
这非常有趣:使用 dd 命令的错误块大小也会生成内存不足错误。
使用“dd”(磁盘转储)验证 Tivoli Storage Manager 磁带卷标签
要查看或更改磁带驱动器上的块大小,您可以使用:
lsattr -El rmt0 -a block_size
并改变它,例如变量,
chdev -l rmt0 -a block_size=0
但我希望您在成功恢复结束后将其更改回来。