SCSI(8)

NAME
scsi - program to assist with scsi devices

SYNOPSIS
scsi -f device -d debug_level
scsi -f device -z seconds [-v]
scsi -f device -m page [-P pc] [-e]
scsi -f device -p [-b bus] [-l lun]
scsi -f device -r [-b bus] [-t targ] [-l lun]
scsi -f device -c cmd_fmt [arg0 ... argn] [-s seconds] [-v] -o count out_fmt [arg0 ... argn] -i count in_fmt

DESCRIPTION
The scsi program is used to send commands to a scsi device. It is also a sample usage of the user level SCSI commands.

The -f option must be specified, and device must be the name of a functional SCSI device. If the device is a disk device, it should be the control device, (for example /dev/rsd0.ctl). Use the -p option with the ‘super scsi’ device to reprobe a bus where there are currently no valid devices attached.

The -d option sets the SCSI kernel debug level. The kernel must have been compiled with the SCSIDEBUG option. See /sys/scsi/scsi_debug.h to figure out what to set the kernel debug level to.

The -z option freezes all activity on all SCSI busses for a given number of seconds. If -v is also specified then a BEL character is sent to the standard output at the start and finish of the bus freeze. This requires that the kernel be built with the SCSI_FREEZE kernel option. This kernel code is not committed yet.

The -m option is used to read a device mode page. The file /usr/share/misc/scsi_modes is read to look at for how to interpret the mode data. The environment variable SCSI_MODES can specify a different file to use.

The -P option can be used to specify a page control field. The page control fields are:

0   Current Values
1   Changeable Values
2   Default Values
3   Saved Values

The -e option permits you to edit the fields. It will use the editor specified by your EDITOR environment variable. To store changes permanently, edit page control 3 using the -P option.

The -p option can be used against the ‘super scsi’ device /dev/ssc to probe all devices with a given SCSI lun on a given SCSI bus. The bus can be selected with the -b option and the default is 0. The lun can be selected with the -l option and the default is 0.

The -r option can be used to reprobe all SCSI devices on all SCSI busses that were present at boot-time. See scsi(4) for a description of fixed scsi devices.

The -c option permits you to send user level SCSI commands specified on the command line to a device. The command is sent using the SCIOCCOMMAND ioctl, so the device you are accessing must permit this ioctl. See scsi(4) for full details of which minor devices permit the ioctl, and scsi(3) for the full details on how to build up the commands and data phases using the format arguments.

-v turns on more verbose information.

-s sets the command timeout in seconds. The default is two seconds.

-c cmd_fmt specifies the command as described in scsi(3). The additional arguments provide values for any variables specified in the command format. Note that the arguments to the -c option are hexadecimal numbers, while all normal arguments on the command-line are subject to the common “C” number notation.

-o count out_fmt [arg0 ... argn] indicates that this is a data out command (i.e., data will be sent from the system to the device) with count bytes of data. The data out is built up using the facilities described in scsi(3) using the provided arguments to fill in any integer variables. out_fmt can be specified as a hyphen ("-") to indicate that the count bytes of data should be read from the standard input.

-i count in_fmt indicates that this is a data in command (i.e., data will be read from the device into the system) with count bytes of data read in. The information is extracted according to in_fmt using the facilities described in scsi(3) and displayed on the standard output. in_fmt can be specified as a hyphen ("-") to indicate that the count bytes of data input should be written to the standard output.

EXAMPLES
To verify that the device type for the disk /dev/rsd0c is 0 (direct access device):

    root# scsi -f /dev/rsd0c -c "12 0 0 0 40 0" -i 64 "*b3 b5" 0

To do an inquiry to /dev/rsd2c:

    root# scsi -f /dev/rsd2c -c "12 0 0 0 v 0" 0x40 -i 64 \
          "s8 z8 z16 z4"

To edit mode page 1 (the Read-Write Error Recovery Page) on /dev/rsd2c, and store it permanently on the drive:

    root# scsi -f /dev/rsd2c -m 1 -e -P 3

To simply re-probe the first scsi bus:

    root# scsi -f /dev/ssc -p

ENVIRONMENT
The SU_DEBUG_OUTPUT variable can be set to a file to send debugging output to that file.

The SU_DEBUG_LEVEL variable can be set to a non-zero integer to increase the level of debugging. Currently this is a on or off thing; it should perhaps use the ioctl to set the debug level in the kernel and then set it back to zero at program exit.

The SU_DEBUG_TRUNCATE variable can be set to an integer to limit the amount of data phase output sent to the debugging file.

The EDITOR variable determines the editor to use for the mode editor.

SEE ALSO
scsi(3), scsi(4), ssc(4)

BUGS

Some devices respond to an inquiry for all LUNS. This will cause them to come on line to 8 times during reprobe to different logical units.

The -i option to do an inquiry went away in FreeBSD 2.1. The new facilities provided by -c supersede that.

Check your permissions carefully. ‘scsi -f /dev/rsd0c -c 4 0 0 0 0 0’ permits anyone who can open /dev/rsd0c to format the disk drive. This must be changed to at least require write access to the drive.

HISTORY
The scsi command appeared in 386BSD 0.1.2.4 to support the new reprobe and user SCSI commands. It first appeared in FreeBSD in FreeBSD 2.0.5.