NAME
scsitape - control SCSI tape devices
SYNOPSIS
scsitape [-f <scsi-generic-device>] commands
DESCRIPTION
The scsitape command controls SCSI tape
drives in a platform-independent manner. As long as 'mtx' works on
the platform, so does 'scsitape'. Note that 'scsitape' and your
OS's native tape driver may stomp on each other. In particular, if
you use 'setblk' and your OS's native tape driver has a different
notion of the block size, you may get evil results. It is
recommended to use 'scsitape' only for software where you've
written your own low-level READ and WRITE routines that use the
SCSI command set to directly talk to tape drives (i.e., you do not
use the OS's native tape driver at all).
OPTIONS
The first argument, given following -f , is
the SCSI generic device corresponding to your tape drive. Consult
your operating system's documentation for more information (for
example, under Linux these are generally /dev/sg0 through
/dev/sg15, under FreeBSD these are /dev/pass0 through /dev/passX.
Under Solaris this is usually the same as your tape drive (Solaris
has a SCSI passthrough ioctl). You can set the STAPE or TAPE
environment variable rather than use -f.
COMMANDS
- setblk <n>
- Set the tape drive's SCSI block size to <n> bytes. (NOTE:
if you are using your OS's native tape driver, THIS IS EVIL!).
- fsf <n>
- Go forward by <n> tapemarks.
- bsf <n>
- Go to immediately previous the <n>th previous tapemark.
(WARNING: This probably doesn't do what you expect -- e.g. if you
are immediately after a tapemark and type 'bfs 1', it moves to
immediately *before* that tape mark, for a sum total of zero
effective movement!).
- eod
- Go to end of data.
- rewind
- Rewind the tape drive.
- eject
- Eject the tape currently in the drive.
- erase
- Does a *short* erase (warning: does NOT work on all drives!).
- mark <n>
-
write <n> filemarks ( 'mark 0' flushes the drive's buffers ).
- seek <n>
- Seek to a logical position <n> that was reported by a
previous 'tapeinfo' command.
- write <blocksize>
- write blocks from stdin to the tape. Chunk the data into
<blocksize>-sized chunks. *DOES NOT WRITE OUT A TAPEMARK!*
(you will need to use a subsequent mark 1 command to write
out a tape mark).
- read [<blocksize>] [ <#blocks/#bytes> ]
- read blocks from the tape, write them to stdout. If we are in
variable block mode, <blocksize> should be zero (note: The
maximum block size we currently support in variable block mode is
128K, MAX_READ_SIZE will need to be turned into a settable variable
to allow bigger reads). If <blocksize> is ommitted, we assume
that we're in variable block mode, and that we are going to read
from tape until we hit a tapemark or end of partition or end of
tape.
AUTHORS
This program was written by Eric Lee Green
<eric@estinc.com>. Major
portions of the 'mtxl.c' library used herein were written by
Leonard Zubkoff.
The SCSI read and write routines are based upon those that
Richard Fish wrote for Enhanced Software Technology's BRU 16.1
product, substantially modified to work in our particular
environment (in particular, all the variable block stuff is new
since BRU only does fixed block reads and writes, and the BRU code
uses bitmasks rather than bitfields for the various flags and such
in return values, as well as the BRU code having a different SCSI
API and having variable names considerably shorter than the rather
sesquipedalian 'mtx' identifiers). As required by 'mtxl.c', these
routines are licensed under the GNU General Public License.
HINTS
Under Linux, cat /proc/scsi/scsi will tell you
what SCSI devices you have. You can then refer to them as
/dev/sga, /dev/sgb, etc. by the order they are
reported. Under FreeBSD, camcontrol devlist will tell you
what SCSI devices you have, along with which pass device
controls them. Under Solaris 7 and 8, /usr/sbin/devfsadm -C
will clean up your /devices directory. Then find /devices -name
'st@*' -print will return a list of all tape drives. /dev on
Solaris is apparently only of historical interest.
BUGS AND LIMITATIONS
for scsitape read 0 <n> where you are doing
variable-block-size reads and wish for <n> bytes, it instead
reads one and exactly one block from tape and prints that (no
matter what its size). Use 'dd' on the output of scsitape if you
want finer control. scsitape read 0 attempts reads of
MAX_READ_SIZE, which is currently 128K. If blocks on tape are
larger than 128K, only the first 128K will be read -- the remainder
will be silently dumped in the toilet. This program does not
interact well (or at all :-) with your OS's native tape driver. You
will likely see weird things happen if you attempt to intermingle
scsitape commands with native tape driver operations. Note that BRU
16.1 for Solaris (and possibly others, but Solaris I know about)
will have a 'scsi' keyword to bypass the native tape driver and
write via direct uscsi commands, so if you use BRU 16.1 to write
your actual tape archives. (Assuming that BRU 16.1 has been
released at the time that you read this).
AVAILABILITY
This version of scsitape is currently
being maintained by Eric Lee Green <eric@badtux.org> formerly of
Enhanced Software Technologies Inc. as part of the 'mtx' suite of
programs. The 'mtx' home page is http://mtx.sourceforge.net and the
actual code is currently available there and via CVS from http://sourceforge.net/projects/mtx
.
SEE ALSO
tapeinfo(1),
mtx(1)