PDA

View Full Version : Solaris 10, x86, amrestore: Error reading Amanda header.



bschneiders
May 14th, 2009, 06:57 AM
I have a set of LTO4 tapes, created with Amanda 2.6.1 on a RHEL 5.2 server, using a 2048K (2MB) block size. The tapes could successfully be restored on that server.

Now the tape library has been moved to a Solaris 10, x86 server with Amanda 2.6.1. I need to restore the data from those tapes. However, no matter what blocksize I try to use, I get:


# amrestore -b 2097152 -p /dev/rmt/0bn no-such-host
amrestore: Error reading volume label: Error reading Amanda header.

I used 'truss' to verify amrestore was using the specified blocksize:

7958: open64("/dev/rmt/0bn", O_RDWR) = 4
7958: fcntl(4, F_SETFD, 0x00000001) = 0
7958: ioctl(4, (('m'<<8)|1), 0x08046948) = 0
7958: ioctl(4, (('m'<<8)|2), 0x08046930) = 0
7958: time() = 1242312225
7958: time() = 1242312225
7958: ioctl(4, (('m'<<8)|1), 0x08046960) = 0
7958: brk(0x08076370) = 0
7958: brk(0x08276370) = 0
7958: read(4, 0x08075298, 2097152) Err#12 ENOMEM
7958: time() = 1242312295
7958: time() = 1242312295
7958: ioctl(4, (('m'<<8)|1), 0x08046960) = 0
7958: write(10, " 1 2 4 2 3 1 2 2 9 5 . 0".., 88) = 88
7958: write(10, " 1 2 4 2 3 1 2 2 9 5 . 0".., 165) = 165
7958: write(10, " 1 2 4 2 3 1 2 2 9 5 . 0".., 106) = 106
7958: fstat64(2, 0x08045790) = 0
7958: write(2, " a m r e s t o r e", 9) = 9
7958: write(2, " : ", 2) = 2
7958: write(2, " E r r o r r e a d i n".., 57) = 57
7958: write(2, "\n", 1) = 1
7958: _exit(2)

I also tried reading from the tape with 'dd' and got the similar results:


$ sudo truss -f -o ./truss.out dd bs=2097152 if=/dev/rmt/0bn of=/dev/null
read: Not enough space
0+0 records in
0+0 records out

It looks like anything that tries to read from a tape device gets ENOMEM returned from read() at any blocksize.


7987: open64("/dev/rmt/0bn", O_RDONLY) = 3
7987: creat64("/dev/null", 0666) = 4
7987: sysconfig(_CONFIG_PAGESIZE) = 4096
7987: brk(0x08065EA8) = 0
7987: brk(0x08265EA8) = 0
7987: schedctl() = 0xFEFF4000
7987: sigaction(SIGINT, 0x08047BC0, 0x08047C40) = 0
7987: sigaction(SIGINT, 0x08047BC0, 0x08047C40) = 0
7987: read(3, 0x08065000, 2097152) Err#12 ENOMEM
7987: open("/usr/lib/locale/en_US.UTF-8/LC_MESSAGES/SUNW_OST_OSLIB.mo", O_RDONLY) Err#2 ENOENT
7987: write(2, " r e a d", 4) = 4
7987: write(2, " : ", 2) = 2
7987: write(2, " N o t e n o u g h s".., 16) = 16
7987: write(2, "\n", 1) = 1
7987: open("/usr/lib/locale/en_US.UTF-8/LC_MESSAGES/SUNW_OST_OSCMD.mo", O_RDONLY) Err#2 ENOENT
7987: fstat64(2, 0x08046F10) = 0
7987: write(2, " 0 + 0", 3) = 3
7987: write(2, " r e c o r d s i n\n", 12) = 12
7987: write(2, " 0 + 0", 3) = 3
7987: write(2, " r e c o r d s o u t".., 13) = 13
7987: _exit(2)


This server has 32GB of RAM and it's almost entirely free. The server is essentially idle except for my attempts to get Amanda working. Amrestore does other large reads from files as it is loading without ENOMEM errors, it only errors when performing reads on the tape device.

There is a tape loaded, it is one of the previously tested good tapes. I have tried several known good tapes to be sure.


$ mt status
IBM Ultrium Gen 4 LTO tape drive:
sense key(0x0)= No Additional Sense residual= 0 retries= 0
file no= 0 block no= 0
$ sudo truss -f -o ./truss.out dd bs=32k if=/dev/rmt/0bn of=/dev/null
read: Not enough space
0+0 records in
0+0 records out
$ mt status
IBM Ultrium Gen 4 LTO tape drive:
sense key(0x0)= No Additional Sense residual= 0 retries= 0
file no= 0 block no= 1

So my question is, has anyone seen this ENOMEM problem when trying to read tapes on Solaris before?

dustin
May 14th, 2009, 08:33 AM
This sounds like a Solaris kernel parameter that should be adjusted. I'm no Solaris admin, so I have no idea what that might be.

You may want to try asking on the amanda-users list -- there are a number of sharp Solaris folks there who may be able to help out.