Device busy when reading from tape drive with tar
When I try to read a tar from tape with tar tvbf 2048 /dev/nst0
, it returns:
tar: /dev/nst0: Cannot read: Device or resource busy
tar: At beginning of tape, quitting now
tar: Error is not recoverable: exiting now
And lsof | grep st0
returns nothing.
All commands works with mt works. If I try with strace:
...
open("/dev/nst0", O_RDONLY) = 3
read(3, 0x7ff16eb8f000, 1048576) = -1 EBUSY (Device or resource busy)
...
The tape drive has the latest firmware. The tape drive is an IBM ULTRIUM-HH6 and the firmware is F9A1.
Solution 1:
- Did you also write with the same block size?
- Did you rewind beforereading?
- Does
mt -f /dev/nst0 status
work? - Are you chaining
dd
withtar
or just using tar as you wrote? There is a quirk when using tar piping and $TAPE environment variable. see below.
Sometimes you issue a command, it fails, there is no noise from the drive, but the tape is not in "rewound" state anymore. Try implicit rewind before each command.
Do a test with another tape (run the commands immediately after each other: cd /path/to files mt -f /dev/nst0 rewind; tar -b 2048 -c -f /dev/nst0 * mt -f /dev/nst0 rewind; tar -b 2048 -t -f /dev/nst0
Btw if you don't want to pass -f /dev/nst0 all the time add export TAPE=/dev/nst0
in your .bashrc. Keep in mind that if you have this variable tar will prefer the tape drive over stdin/stdout. So this will return "Device or resource busy"
export TAPE=/dev/nst0
mt rewind ; tar -b 128 -c *|dd of=$TAPE bs=64K
... because both dd and tar are trying to open the tape drive. The correct way to pipe tar is by passing -f -
:
mt rewind ; tar -b 128 -c -f - *|dd of=$TAPE bs=64K
Also I'm not sure if this block size will work well. In this document you can read:
A block size no larger than 256 KB (262144 bytes) is strongly recommended when working with HP-UX and tape or VTL devices.
So try dropping the block size to 256KiB or even 128KiB (That's tar -b 512 or -b 256 respectively).