Provided by: sg3-utils_1.36-1ubuntu1_amd64 bug

NAME

       sg_persist - use SCSI PERSISTENT RESERVE command to access registrations and reservations

SYNOPSIS

       sg_persist [OPTIONS] DEVICE

       sg_persist [OPTIONS] --device=DEVICE

       sg_persist --help | --version

DESCRIPTION

       This  utility  allows Persistent reservations and registrations to be queried and changed.
       Persistent reservations and registrations are queried  by  sub-commands  (called  "service
       actions"  in  SPC-4)  of  the  SCSI  PERSISTENT  RESERVE  IN  (PRIN)  command.  Persistent
       reservations and registrations are changed by sub-commands of the SCSI PERSISTENT  RESERVE
       OUT (PROUT) command.

       There  is a two stage process to obtain a persistent reservation. First an application (an
       I_T nexus in standard's jargon) must register a reservation key. If that is accepted  (and
       it should be unless some other I_T nexus has registered that key) then the application can
       try and reserve the device.  The reserve operation must specify the reservation key and  a
       "type" (see the --prout-type=TYPE option).

       It  is  relatively  safe  to query the state of Persistent reservations and registrations.
       With no options this utility defaults to the READ KEYS sub-command of  the  PRIN  command.
       Other PRIN sub-commands are READ RESERVATION, REPORT CAPABILITIES and READ FULL STATUS.

       Before trying to change Persistent reservations and registrations users should be aware of
       what they are doing. The relevant sections of the SCSI  Primary  Commands  document  (i.e.
       SPC-4  whose  most recent draft is revision 20 dated 22 May 2009) are sections 5.7 (titled
       "Reservations"), 6.13 (for the  PRIN  command)  and  6.14  (for  the  PROUT  command).  To
       safeguard  against accidental use, the --out option must be given when a PROUT sub-command
       (e.g.  --register) is used.

       The older SCSI RESERVE and RELEASE  commands  (both  6  and  10  byte  variants)  are  not
       supported  by  this  utility.  In  SPC-3,  RESERVE and RELEASE are deprecated, replaced by
       Persistent Reservations. RESERVE and RELEASE have been removed from SPC-4 and Annex  B  is
       provided  showing  how to convert to persistent reservation commands. See a utility called
       'scsires' for support of the SCSI RESERVE and RELEASE commands.

       The DEVICE is required by all variants of this utility apart from --help. The  DEVICE  can
       be  given  either  as  an argument (typically but not necessarily the last one) or via the
       --device=DEVICE option.

       SPC-4 does not use the term "sub-command". It uses the term "service action" for this  and
       for  part of a field's name in the parameter block associated with the PROUT command (i.e.
       "service  action  reservation  key").  To  lessen  the  potential   confusion   the   term
       "sub-command" has been introduced.

OPTIONS

       Arguments  to long options are mandatory for short options as well.  The following options
       are sorted in alphabetical order, based on their long option name.

       -l, --alloc-length=LEN
              specify the allocation length of the PRIN command. LEN is a hex value.  By  default
              this  value  is set to the size of the data-in buffer (8192).  This parameter is of
              use for verification that response to PRIN commands with various allocation lengths
              is per section 4.3.5.6 of SPC-4 revision 18.  Valid LEN values are 0-8192.

       -C, --clear
              Clear is a sub-command of the PROUT command. It releases the persistent reservation
              (if any) and clears all registrations from the device. It is required to  supply  a
              reservation   key   that   is  registered  for  this  I_T_L  nexus  (identified  by
              --param-rk=RK).

       -d, --device=DEVICE
              DEVICE to send SCSI commands to. The DEVICE can either be provided via this  option
              or   via   a   freestanding   argument.   For   example,   these  two:  'sg_persist
              --device=/dev/sg2' and 'sg_persist /dev/sg2' are equivalent.

       -h, --help
              output a usage message.

       -H, --hex
              the response to a valid PRIN sub-command will be output in hexadecimal.  By default
              (i.e.  without this option) if the PRIN sub-command is recognised then the response
              will be decoded as per SPC-4.

       -i, --in
              specify that a SCSI PERSISTENT RESERVE IN command is required. This is the default.

       -n, --no-inquiry
              the default action is to do a  standard  SCSI  INQUIRY  command  and  output  make,
              product  and  revision strings plus the peripheral device type prior to executing a
              PRIN or PROUT command. With this option the INQUIRY command is skipped.

       -o, --out
              specify that a SCSI PERSISTENT RESERVE OUT command is required.

       -Y, --param-alltgpt
              set the 'all target ports' (ALL_TG_PT) flag in the parameter  block  of  the  PROUT
              command.  Only  relevant  for  'register'  and  'register  and ignore existing key'
              sub-commands.

       -Z, --param-aptpl
              set the 'activate persist through power loss' (APTPL) flag in the  parameter  block
              of  the  PROUT command. Relevant for 'register', 'register and ignore existing key'
              and 'register and move' sub-commands.

       -K, --param-rk=RK
              specify the reservation key found in the parameter block of the PROUT  command.  RK
              is  assumed  to  be  hex  (up  to 8 bytes long). Default value is 0. This option is
              needed by most PROUT sub-commands.

       -S, --param-sark=SARK
              specify the service action reservation key found in  the  parameter  block  of  the
              PROUT command. SARK is assumed to be hex (up to 8 bytes long).  Default value is 0.
              This option is needed by some PROUT sub-commands.

       -P, --preempt
              Preempt is a sub-command of the PROUT command.  Preempts  the  existing  persistent
              reservation  (identified  by  --param-sark=SARK)  with the registration key that is
              registered for this I_T_L nexus (identified by --param-rk=RK). If a new reservation
              is  establised as a result of the preemption then the supplied --prout-type=TYPE is
              used as the type for this new reservation.

       -A, --preempt-abort
              Preempt and Abort is a sub-command of the  PROUT  command.  Preempts  the  existing
              persistent  reservation (identified by --param-sark=SARK) with the registration key
              that is registered for this I_T_L nexus (identified by  --param-rk=RK).  If  a  new
              reservation  is  establised  as  a  result  of  the  preemption  then  the supplied
              --prout-type=TYPE is used as the type for  this  new  reservation.  ACA  and  other
              pending tasks are aborted.

       -T, --prout-type=TYPE
              specify  the  PROUT  command's  'type'  argument.  Required by the 'register-move',
              'reserve', 'release' and 'preempt (and abort)' sub-commands. Valid TYPE values: 1->
              write  exclusive, 3-> exclusive access, 5-> write exclusive - registrants only, 6->
              exclusive access - registrants only, 7-> write exclusive  -  all  registrants,  8->
              exclusive  access - all registrants. Default value is 0 (which is an invalid type).
              Each "persistent reservation type" is explained in more detail in a  subsection  of
              that  name in the read reservation section of the PRIN command (section 6.13.3.4 of
              SPC-4 revision 9).

       -s, --read-full-status
              Read Full Status is a sub-command of the PRIN command. For each  registration  with
              the  given  SCSI  device,  it lists the reservation key and associated information.
              TransportIDs, if supplied in the response, are decoded.

       -k, --read-keys
              Read Keys is a sub-command of the PRIN command.  Lists  all  the  reservation  keys
              registered  (i.e.  registrations)  with  the given SCSI device. This is the default
              sub-command for the SCSI PRIN command.

       -r, --read-reservation
              Read Reservation is a sub-command of the PRIN command. List information  about  the
              current holder of the reservation on the DEVICE. If there is no current reservation
              this will be noted.  Information  about  the  current  holder  of  the  reservation
              includes its reservation key, scope and type.

       -s, --read-status
              same as --read-full-status.

       -G, --register
              Register  is  a  sub-command  of  the  PROUT  command.  It  has 3 different actions
              depending on associated parameters. a) add a new registration  with  '--param-rk=0'
              and    '--param-sark=<new_rk>';   b)   Change   an   existing   registration   with
              '--param-rk=<old_rk>'  and  '--param-sark=<new_rk>';  or   c)  Delete  an  existing
              registration with '--param-rk=<old_rk>' and '--param-sark=0'.

       -I, --register-ignore
              Register and Ignore Existing Key is a sub-command of the PROUT command.  Similar to
              --register except that  when  changing  a  reservation  key  the  old  key  is  not
              specified. The '--param-sark=<new_rk>' option should also be given.

       -M, --register-move
              register  (another  initiator)  and  move  (the  reservation  held  by  the current
              initiator to that other initiator) is a  sub-command  of  the  PROUT  command.   It
              requires  the  transportID  of the other initiator. [The standard uses the term I_T
              nexus but the point to stress is that there are two  initiators  (the  one  sending
              this  command  and  another one) but only one logical unit.]  The --prout-type=TYPE
              and --param-rk=RK options need to match that  of  the  existing  reservation  while
              --param-sark=SARK   option   specifies   the  reservation  key  of  the  new  (i.e.
              destination) registration.

       -Q, --relative-target-port=RTPI
              relative target port identifier that  reservation  is  to  be  moved  to  by  PROUT
              'register  and  move' sub-command. RTPI is assumed to be hex in the range 0 to ffff
              inclusive. Defaults to 0 .

       -L, --release
              Release is a sub-command of the PROUT command. It releases the  current  persistent
              reservation.   The   --prout-type=TYPE  and  --param-rk=RK  options,  matching  the
              reservation, must also be specified.

       -c, --report-capabilities
              Report Capabilities is a sub-command of the  PRIN  command.  It  lists  information
              about the aspects of persistent reservations that the DEVICE supports.

       -R, --reserve
              Reserve  is  a  sub-command  of  the  PROUT  command.  It  creates a new persistent
              reservation (if permitted). The --prout-type=TYPE and  --param-rk=RK  options  must
              also be specified.

       -X, --transport-id=TIDS
              The  TIDS  argument  can  take  one  of several forms. It can be a comma (or single
              space) separated list of ASCII hex  bytes  representing  a  single  TransportID  as
              defined  in  SPC-4.  They  are  usually 24 bytes long apart from in iSCSI. The TIDS
              argument may be a transport specific form (e.g. "sas,5000c50005b32001").  The  TIDS
              argument  may be "-" in which case one or more TransportIDs can be read from stdin.
              The TIDS argument may be of the form  "file=<name>"  in  which  case  one  or  more
              TransportIDs can be read from a file called <name>. See the "TRANSPORT IDs" section
              below for more information.

       -U, --unreg
              optional when the PROUT register and move sub-command is invoked. If given it  will
              unregister  the  current  initiator  (I_T nexus) after the other initiator has been
              registered and the reservation moved to it.  When  not  given  the  initiator  (I_T
              nexus) that sent the PROUT command remains registered.

       -v, --verbose
              print  out  cdb of issued commands prior to execution. If used twice prints out the
              parameter block associated with the PROUT command prior to its execution  as  well.
              If  used thrice decodes given transportID(s) as well. To see the response to a PRIN
              command in low level form use the --hex option.

       -V, --version
              print out version string. Ignore all other parameters.

       -?     output usage message. Ignore all other parameters.

TRANSPORT IDs

       TransportIDs are used in persistent reservations to identify initiators.  The format of  a
       TransportID  differs  depending  on  the  type  of  transport  being used. Their format is
       described in SPC-4 (in draft revision 20 see section 7.5.4).

       A TransportID is required for the PROUT 'register and  move'  sub-command  and  the  PROUT
       'register' sub-command can have zero, one or more TransportIDs.

       When  the  --transport-id=TIDS  option  is given then the TIDS argument may be a comma (or
       single space) separated list of ASCII hex bytes that represent  a  single  TransportID  as
       defined  in  SPC-4.  Alternatively  the  TIDS  argument may be a transport specific string
       starting with either "fcp,", "spi,", "sbp,", "srp,", "iqn", or "sas,". The "iqn"  form  is
       an  iSCSI  qualified name. Apart from "iqn" the other transport specific leadin string may
       be given in upper case (e.g. "FCP,").

       The "fcp," form should be followed by 16 ASCII hex digits that  represent  an  initiator's
       N_PORT_NAME.       The       "spi,"       form       should       be      followed      by
       "<scsi_address>,<relative_target_port_identifier>" (both  decimal  numbers).   The  "sbp,"
       form  should be followed by 16 ASCII hex digits that represent an initiator's EUI-64 name.
       The "srp," form should be followed by 32 ASCII hex digits that represent an initiator port
       identifier.  The  "sas,"  form should be followed by 16 ASCII hex digits that represent an
       initiator's port SAS address.

       There are two iSCSI qualified name forms. The shorter form contains the iSCSI name of  the
       initiator port (e.g. "iqn.5886.com.acme.diskarrays-sn-a8675309"). The longer form adds the
       initiator   session   id   (ISID   in   hex)   separated   by   ",i,0x".    For    example
       "iqn.5886.com.acme.diskarrays-sn-a8675309,i,0x1234567890ab".   On the command line to stop
       punctuation in an iSCSI name being (mis)-interpreted by  the  shell,  putting  the  option
       argument containing the iSCSI name in double quotes is advised. iSCSI names are encoded in
       UTF-8 so if non (7 bit) ASCII characters appear in the iSCSI name  on  the  command  line,
       there  will  be  difficulties  if they are not encoded in UTF-8. The locale can be changed
       temporarily by prefixing the command line invocation of sg_persist with "LANG=en_US.utf-8"
       for example.

       Alternatively  the  TIDS  argument  may  specify  a  file (or pipe) from which one or more
       TransportIDs may be read. If the TIDS argument is "-" then stdin (standard input) is read.
       If  the  TIDS  argument is of the form "file=<name>" than a file called <name> is read.  A
       valid SPC-4 TransportID is built from  the  transport  specific  string  outlined  in  the
       previous  paragraphs.  The  parsing of the data read is realtively simple. Empty lines are
       ignored. Everything from and including a "#" on a line is ignored. Leading spaces and tabs
       are ignored. There can be one transportID per line. The transportID can either be a comma,
       space or tab separated list of ASCII hex bytes that represent a TransportID as defined  in
       SPC-4.  Padding with zero bytes to a minimum length of 24 bytes is performed if necessary.
       The transportID may also be transport specific string type discussed above.

       In SPC-3 the SPEC_I_PT bit set to one and TransportIDs were allowed for the PROUT register
       and  ignore  existing  key  sub-command.  In  SPC-4  that  is  disallowed yielding a CHECK
       CONDITION status with and ILLEGAL REQUEST sense key and an additional sense  code  set  to
       INVALID FIELD IN PARAMETER LIST.

NOTES

       In  the  2.4 series of Linux kernels the DEVICE must be a SCSI generic (sg) device. In the
       2.6 series any SCSI device name (e.g. /dev/sdc, /dev/st1m or /dev/sg3) can  be  specified.
       For example "sg_persist --read-keys /dev/sdb" will work in the 2.6 series kernels.

       The  only  scope for PROUT commands supported in the current draft of SPC-4 is "LU_SCOPE".
       Hence there seems to be no point in offering an option to set scope to another value.

       Most errors with the PROUT sub-commands (e.g.  missing  or  mismatched  --prout-type=TYPE)
       will  result  in  a RESERVATION CONFLICT status. This can be a bit confusing when you know
       there is only one (active) initiator: the "conflict" is with the SPC standard, not another
       initiator.

       Some  recent  disks accept some PRIN and PROUT sub-commands when the media is stopped. One
       exception was setting the APTPL flag (with the --param-aptpl option) during a key register
       operation,  it  complained if the disk one stopped. The error indicated it wanted the disk
       spun up and when that happened, the registration was successful.

EXAMPLES

       These examples use Linux device names.  For  suitable  device  names  in  other  supported
       Operating Systems see the sg3_utils(8) man page.

       Due  to  the  various  option  defaults  the  simplest  example  executes  the 'read keys'
       sub-command of the PRIN command:

          sg_persist /dev/sdb

       This is the same as the following (long-winded) command:

          sg_persist --in --read-keys --device=/dev/sdb

       To read the current reservation either the '--read-reservation' form or the  shorter  '-r'
       can be used:

          sg_persist -r /dev/sdb

       To register the new reservation key 0x123abc the following could be used:

          sg_persist --out --register --param-sark=123abc /dev/sdb

       Given the above registration succeeds, to reserve the DEVICE (with type 'write exclusive')
       the following could be used:

          sg_persist --out --reserve --param-rk=123abc
                     --prout-type=1 /dev/sdb

       To release the reservation the following can  be  given  (note  that  the  --param-rk  and
       --prout-type arguments must match those of the reservation):

          sg_persist --out --release --param-rk=123abc
                     --prout-type=1 /dev/sdb

       Finally  to unregister a reservation key (and not effect other registrations which is what
       '--clear' would do) the command is a little surprising:

          sg_persist --out --register --param-rk=123abc /dev/sdb

       Now have a close look at the difference  between  the  register  and  unregister  examples
       above.

       An   example   file   that   is   suitably   formatted   to   pass   transportIDs   via  a
       '--transport-id=file=transport_ids.txt' option can be found in the examples  sub-directory
       of  the  sg3_utils package. There is also a simple test script called sg_persist_tst.sh in
       the same directory.

       The above sequence of commands was tested successfully on  a  Seagate  Savvio  10K.3  disk
       which has a SAS interface.

EXIT STATUS

       The  exit  status of sg_persist is 0 when it is successful. Otherwise see the sg3_utils(8)
       man page.

AUTHOR

       Written by Douglas Gilbert

REPORTING BUGS

       Report bugs to <dgilbert at interlog dot com>.

COPYRIGHT

       Copyright © 2004-2012 Douglas Gilbert
       This software is distributed under the GPL version 2. There is NO warranty; not  even  for
       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

SEE ALSO

       sg3_utils(sg3_utils), scsires(internet)