SD(4)

NAME
sd, st, sg - SCSI hard disk / tape / generic

DESCRIPTION
The sd*, st*, sg* family of devices refer to the SCSI hard disk, tape and generic driver using the Adaptec 154x series of controllers. This manual page only describes the differences between the sd and hd devices, read hd(4) first.

The devices numbers of the SCSI devices are statically mapped onto the SCSI targets 0 to 7. This is done like the hd devices with sd[0-4] referring to target 0, sd[5-9] to target 1, etc. The logical unit number is always 0, because devices with more than one logical unit are virtually extinct. The mapping may be changed from the boot environment however (see boot(8)).

Tapes start at minor device 64, with nrst0 at minor 64, rst0 at 65, nrst1 at 66, etc. The mapping is again static to target (minor - 64) / 2. The rst devices rewind the tape on close, the nrst devices do not. See mt(1), and mtio(4) for a description of the commands that may be sent to the tape, either from the command prompt or from a program.

Through the eight raw generic devices rsg[0-7] starting at minor 120, one can send SCSI commands to any SCSI device from user mode. (Minix-386vm only.)

The driver returns a drive geometry of 64 heads by 32 sectors per track for small disks with the DIOCGETP ioctl. For large disks 255x63 is returned. The size in sectors is usually larger than the largest cylinder number indicates, because the disk is not likely to exactly match that faked geometry. Note that DOS may not be able to access those last few sectors.

  Disk like devices.
Removable disks (floppies), CD-ROM's and WORM disks may also be accessed through the sd devices. One is not allowed to write a WORM disk however, because it is likely to be taken from an alien operating system, so it seems safer to not allow Minix to stomp over it. One usually needs special O.S. support to keep one from writing to the same block twice.

The DIOCEJECT ioctl ejects CD-ROMs, floppies, etc. (See eject(1).) A fixed disk spins down if it supports the stop command.

  SCSI Tapes
There are two types of SCSI tapes supported by the driver, with fixed or variable block sizes. Examples of the first kind are cartridge tapes, with a fixed 512 bytes block size. An Exabyte tape drive has a variable block size, with a minimum of 1 byte and a maximum of 245760 bytes (see the documentation of such devices.) The maximum is truncated to 32767 bytes for Minix-86 and 61440 bytes for Minix-386vm, because the driver can't move more bytes in a single request.

A read or write to a fixed block tape must be a precise multiple of the block size, any other count gives an I/O error. A read from a variable block sized tape must be large enough to accept the block that is read, otherwise an I/O error will result. A write can be any size above the minimum, creating a block of that size. If the write count is larger than the maximum block size then more blocks are written until the count becomes zero. The last block must be larger than the minimum of course. (This minimum is often as small as 1 byte, as for the Exabyte.)

The mt blksize command may be used to select a fixed block size for a variable block sized tape. This will speed up I/O considerably for small block sizes. (Some systems can only use fixed mode and will write an Exabyte tape with 1024 byte blocks, which reads very slow in variable mode.)

A tape is a sequence of blocks and filemarks. A tape may be opened and blocks may be read from it upto a filemark, after that all further reads return 0. After the tape is closed and reopened one can read the blocks following the filemark. This makes the tape look like a sequence of files.

If a tape has been written to or opened in write-only mode, then a filemark is written if the tape is closed or a space command is issued. No extra filemark is written if the drive is instructed to write filemarks.

  Raw Generic Devices
Under Minix-386vm one can use the generic SCSI devices to program a SCSI device entirely from user mode. The disk and tape devices probe for devices when opened, start disks and load tapes, but the generic devices do nothing of this. Given an open file descriptor to any SCSI character device (not just the generic devices) one can use the following ioctl:

    ioctl(fd, SCIOCCMD, &scsicmd)

The structure whose address is passed as the third argument is defined in <sys/scsi.h> as follows:

    struct scsicmd {
    	void	*cmd;
    	size_t	cmdlen;
    	void	*buf;
    	size_t	buflen;
    	void	*sense;
    	size_t	senselen;
    	int	dir;
    };

Cmd and cmdlen hold the address and length of an object holding a Group 0 or Group 1 SCSI command. The next two fields describe a buffer of at most 8 kilobytes used in the data in or out phase. Dir is 0 if data is to be read from the device, 1 if data is written to the device. If the ioctl succeeds then 0 is returned, otherwise -1 with errno set to EIO and the request sense info returned in the buffer described by the sense and senselen fields. If the sense key is zero on error then a host adapter error occurred, this means that the device is most likely turned off or not present.

FILES

/dev/sd[0-9], /dev/sd[1-46-9][a-d]
    Usual disk devices.

/dev/rst4, /dev/nrst4
    Usual tape device.

/dev/rsg[0-7]
    Raw generic devices.

SEE ALSO
hd(4), mt(1), eject(1), mtio(4), dd(1).

AUTHOR
Kees J. Bot (kjb@cs.vu.nl)