| .TH SG_SANITIZE "8" "December 2020" "sg3_utils\-1.46" SG3_UTILS |
| .SH NAME |
| sg_sanitize \- remove all user data from disk with SCSI SANITIZE command |
| .SH SYNOPSIS |
| .B sg_sanitize |
| [\fI\-\-ause\fR] [\fI\-\-block\fR] [\fI\-\-count=OC\fR] [\fI\-\-crypto\fR] |
| [\fI\-\-dry\-run\fR] [\fI\-\-desc\fR] [\fI\-\-early\fR] [\fI\-\-fail\fR] |
| [\fI\-\-help\fR] [\fI\-\-invert\fR] [\fI\-\-ipl=LEN\fR] [\fI\-\-overwrite\fR] |
| [\fI\-\-pattern=PF\fR] [\fI\-\-quick\fR] [\fI\-\-test=TE\fR] |
| [\fI\-\-timeout=SECS\fR] [\fI\-\-verbose\fR] [\fI\-\-version\fR] |
| [\fI\-\-wait\fR] [\fI\-\-zero\fR] [\fI\-\-znr\fR] \fIDEVICE\fR |
| .SH DESCRIPTION |
| .\" Add any additional description here |
| .PP |
| This utility invokes the SCSI SANITIZE command. This command was first |
| introduced in the SBC\-3 revision 27 draft. The purpose of the sanitize |
| operation is to alter the information in the cache and on the medium of a |
| logical unit (e.g. a disk) so that the recovery of user data is not |
| possible. If that user data cannot be erased, or is in the process of |
| being erased, then the sanitize operation prevents access to that user |
| data. |
| .PP |
| Once a SCSI SANITIZE command has successfully started, then user data from |
| that disk is no longer available. Even if the disk is power cycled, the |
| sanitize operation will continue after power is re\-instated until it is |
| complete. |
| .PP |
| This utility requires either the \fI\-\-block\fR, \fI\-\-crypto\fR, |
| \fI\-\-fail\fR or \fI\-\-overwrite\fR option. With the \fI\-\-block\fR, |
| \fI\-\-crypto\fR or \fI\-\-overwrite\fR option the user is given 15 seconds |
| to reconsider whether they wish to erase all the data on a disk, unless |
| the \fI\-\-quick\fR option is given in which case the sanitize operation |
| starts immediately. The disk's INQUIRY response strings are printed out just |
| in case the wrong \fIDEVICE\fR has been given. |
| .PP |
| If the \fI\-\-early\fR option is given then this utility will exit soon |
| after starting the SANITIZE command with the IMMED bit set. The user can |
| monitor the progress of the sanitize operation with |
| the "sg_requests \-\-num=9999 \-\-progress" which sends a REQUEST SENSE |
| command every 30 seconds. Otherwise if the \fI\-\-wait\fR option is given |
| then this utility will wait until the SANITIZE command completes (or fails) |
| and that can be many hours. |
| .PP |
| If the \fI\-\-wait\fR option is not given then the SANITIZE command is |
| started with the IMMED bit set. If neither the \fI\-\-early\fR nor the |
| \fI\-\-wait\fR options are given then this utility sends a REQUEST SENSE |
| command after every 60 seconds until there are no more progress indications |
| in which case this utility exits silently. If additionally the |
| \fI\-\-verbose\fR option is given the exit will be marked by a short |
| message that the sanitize seems to have succeeded. |
| .SH OPTIONS |
| Arguments to long options are mandatory for short options as well. |
| The options are arranged in alphabetical order based on the long |
| option name. |
| .TP |
| \fB\-A\fR, \fB\-\-ause\fR |
| sets the AUSE bit in the cdb. AUSE is an acronym for "allow unrestricted |
| sanitize exit". The default action is to leave the AUSE bit cleared. |
| .TP |
| \fB\-B\fR, \fB\-\-block\fR |
| perform a "block erase" sanitize operation. |
| .TP |
| \fB\-c\fR, \fB\-\-count\fR=\fIOC\fR |
| where \fIOC\fR is the "overwrite count" associated with the "overwrite" |
| sanitize operation. \fIOC\fR can be a value between 1 and 31 and 1 is |
| the default. |
| .TP |
| \fB\-C\fR, \fB\-\-crypto\fR |
| perform a "cryptographic erase" sanitize operation. Note that this erase is |
| often very quick as it simply overwrites an internal cryptographic key with |
| a new value. Those keys are not accessible to users and encrypt all data |
| written then decrypt all data read from the media. The primary reason for |
| doing that is to make this operation fast. This operation can not be |
| reversed. |
| .TP |
| \fB\-d\fR, \fB\-\-desc\fR |
| sets the DESC field in the REQUEST SENSE command used for polling. By |
| default this field is set to zero. A REQUEST SENSE polling loop is |
| used after the SANITIZE command is issued (assuming that neither the |
| \fI\-\-early\fR nor the \fI\-\-wait\fR option have been given) to check |
| on the progress of this command as it can take some time. |
| .TP |
| \fB\-D\fR, \fB\-\-dry\-run\fR |
| this option will parse the command line, do all the preparation but bypass |
| the actual SANITIZE command. |
| .TP |
| \fB\-e\fR, \fB\-\-early\fR |
| the default action of this utility is to poll the disk every 60 seconds to |
| fetch the progress indication until the sanitize is finished. When this |
| option is given this utility will exit "early" as soon as the SANITIZE |
| command with the IMMED bit set to 1 has been acknowledged. This option and |
| \fI\-\-wait\fR cannot both be given. |
| .TP |
| \fB\-F\fR, \fB\-\-fail\fR |
| perform an "exit failure mode" sanitize operation. Typically requires the |
| preceding SANITIZE command to have set the AUSE bit. |
| .TP |
| \fB\-h\fR, \fB\-\-help\fR |
| print out the usage information then exit. |
| .TP |
| \fB\-i\fR, \fB\-\-ipl\fR=\fILEN\fR |
| set the initialization pattern length to \fILEN\fR bytes. By default it is |
| set to the length of the pattern file (\fIPF\fR) or 4 if the \fI\-\-zero\fR |
| option is given. Only active when the \fI\-\-overwrite\fR option is also |
| given. It is the number of bytes from the \fIPF\fR file that will be used |
| as the initialization pattern (if the \fI\-\-zero\fR option is not given). |
| The minimum size is 1 byte and the maximum is the logical block size of the |
| \fIDEVICE\fR (and not to exceed 65535). If \fILEN\fR exceeds the \fIPF\fR |
| file size then the initialization pattern is padded with zeros. |
| .TP |
| \fB\-I\fR, \fB\-\-invert\fR |
| set the INVERT bit in the overwrite service action parameter list. This |
| only affects the "overwrite" sanitize operation. The default is a clear |
| INVERT bit. When the INVERT bit is set then the initialization pattern |
| is inverted between consecutive overwrite passes. |
| .TP |
| \fB\-O\fR, \fB\-\-overwrite\fR |
| perform an "overwrite" sanitize operation. When this option is given then |
| the \fI\-\-pattern=PF\fR or the \fI\-\-zero\fR option is required. |
| .TP |
| \fB\-p\fR, \fB\-\-pattern\fR=\fIPF\fR |
| where \fIPF\fR is the filename of a file containing the initialization |
| pattern required by an "overwrite" sanitize operation. The length of |
| this file will be used as the length of the initialization pattern unless |
| the \fI\-\-ipl=LEN\fR option is given. The length of the initialization |
| pattern must be from 1 to the logical block size of the \fIDEVICE\fR. |
| .TP |
| \fB\-Q\fR, \fB\-\-quick\fR |
| the default action (i.e. when the option is not given) is to give the user |
| 15 seconds to reconsider doing a sanitize operation on the \fIDEVICE\fR. |
| When this option is given that step (i.e. the 15 second warning period) |
| is skipped. |
| .TP |
| \fB\-T\fR, \fB\-\-test\fR=\fITE\fR |
| set the TEST field in the overwrite service action parameter list. This |
| only affects the "overwrite" sanitize operation. The default is to place |
| 0 in that field. |
| .TP |
| \fB\-t\fR, \fB\-\-timeout\fR=\fISECS\fR |
| where \fISECS\fR is the number of seconds used for the timeout on the |
| SANITIZE command. |
| .TP |
| \fB\-v\fR, \fB\-\-verbose\fR |
| increase the level of verbosity, (i.e. debug output). |
| .TP |
| \fB\-V\fR, \fB\-\-version\fR |
| print the version string and then exit. |
| .TP |
| \fB\-w\fR, \fB\-\-wait\fR |
| the default action (i.e. without this option and the \fI\-\-early\fR option) |
| is to start the SANITIZE command with the IMMED bit set then poll for the |
| progress indication with the REQUEST SENSE command until the sanitize |
| operation is complete (or fails). When this option is given (and the |
| \fI\-\-early\fR option is not given) then the SANITIZE command is started |
| with the IMMED bit clear. For a large disk this might take hours. [A |
| cryptographic erase operation could potentially be very quick.] |
| .TP |
| \fB\-z\fR, \fB\-\-zero\fR |
| with an "overwrite" sanitize operation this option causes the initialization |
| pattern to be zero (4 zeros are used as the initialization pattern). Cannot |
| be used with the \fI\-\-pattern=PF\fR option. If this option is given |
| twice (e.g. '\-zz') then 0xff is used as the initialization byte. |
| .TP |
| \fB\-Z\fR, \fB\-\-znr\fR |
| sets ZNR bit (zoned no reset) in cdb. Introduced in the SBC\-4 revision 7 |
| draft. |
| .SH NOTES |
| The SCSI SANITIZE command is closely related to the ATA SANITIZE command, |
| both are relatively new with the ATA command being the first one defined. |
| The SCSI to ATA Translation (SAT) definition for the SCSI SANITIZE command |
| appeared in the SAT\-3 revision 4 draft. |
| .PP |
| When a SAT layer is used to a (S)ATA disk then for OVERWRITE the |
| initialization pattern must be 4 bytes long. So this means either the |
| \fI\-\-zero\fR option may be given, or a pattern file (with the |
| \fI\-\-pattern=PF\fR option) that is 4 bytes long or set to that |
| length with the \fI\-\-ipl=LEN\fR option. |
| .PP |
| The SCSI SANITIZE command is related to the SCSI FORMAT UNIT command. It |
| is likely that a block erase sanitize operation would take a similar |
| amount of time as a format on the same disk (e.g. 9 hours for a 2 Terabyte |
| disk). The primary goal of a format is the configuration of the disk at |
| the end of a format (e.g. different logical block size or protection |
| information added). Removal of user data is only a side effect of a format. |
| With the SCSI SANITIZE command, removal of user data is the primary goal. |
| If a sanitize operation is interrupted (e.g. the disk is power cycled) |
| then after power up any remaining user data will not be available and the |
| sanitize operation will continue. When a format is interrupted (e.g. the |
| disk is power cycled) the drafts say very little about the state of the |
| disk. In practice some of the original user data may remain and the format |
| may need to be restarted. |
| .PP |
| Finding out whether a disk (SCSI or ATA) supports SANITIZE can be a |
| challenge. If the user really needs to find out and no other information |
| is available then try 'sg_sanitize \-\-fail \-vvv <device>' and observe |
| the sense data returned may be the safest approach. Using the \fI\-\-fail\fR |
| variant of this utility should have no effect unless it follows an already |
| failed sanitize operation. If the SCSI REPORT SUPPORTED OPERATION CODES |
| command (see sg_opcodes) is supported then using it would be a better |
| approach for finding if sanitize is supported. |
| .PP |
| If using the dd command to check the before and after data of a particular |
| block (i.e. check the erase actually worked) it is a good idea to use |
| the 'iflag=direct' operand. Otherwise the first read might be cached and |
| returned when the same LBA is read a little later. Obviously this utility |
| should only be used to sanitize data on a disk whose mounted file |
| systems (if any) have been unmounted prior to the erase! |
| .SH EXAMPLES |
| These examples use Linux device names. For suitable device names in |
| other supported Operating Systems see the sg3_utils(8) man page. |
| .PP |
| As a precaution if this utility is called with no options then apart from |
| printing a usage message, nothing happens: |
| .PP |
| sg_sanitize /dev/sdm |
| .PP |
| To do a "block erase" sanitize the \fI\-\-block\fR option is required. |
| The user will be given a 15 second period to reconsider, the SCSI SANITIZE |
| command will be started with the IMMED bit set, then this utility will |
| poll for a progress indication with a REQUEST SENSE command until the |
| sanitize operation is finished: |
| .PP |
| sg_sanitize \-\-block /dev/sdm |
| .PP |
| To start a "block erase" sanitize and return from this utility once it is |
| started (but not yet completed) use the \fI\-\-early\fR option: |
| .PP |
| sg_sanitize \-\-block \-\-early /dev/sdm |
| .PP |
| If the 15 second reconsideration time is not required add the |
| \fI\-\-quick\fR option: |
| .PP |
| sg_sanitize \-\-block \-\-quick \-\-early /dev/sdm |
| .PP |
| To do an "overwrite" sanitize a pattern file may be given: |
| .PP |
| sg_sanitize \-\-overwrite \-\-pattern=rand.img /dev/sdm |
| .PP |
| If the length of that "rand.img" is 512 bytes (a typically logical block |
| size) then to use only the first 17 bytes (repeatedly) in the "overwrite" |
| sanitize operation: |
| .PP |
| sg_sanitize \-\-overwrite \-\-pattern=rand.img \-\-ipl=17 /dev/sdm |
| .PP |
| To overwrite with zeros use: |
| sg_sanitize \-\-overwrite \-\-zero /dev/sdm |
| .SH EXIT STATUS |
| The exit status of sg_sanitize is 0 when it is successful. Otherwise see |
| the sg3_utils(8) man page. Unless the \fI\-\-wait\fR option is given, the |
| exit status may not reflect the success of otherwise of the format. |
| .PP |
| The Unix convention is that "no news is good news" but that can be a bit |
| unnerving after an operation like sanitize, especially if it finishes |
| quickly (i.e. before the first progress poll is sent). Giving the |
| \fI\-\-verbose\fR option once should supply enough additional output to |
| settle those nerves. |
| .SH AUTHORS |
| Written by Douglas Gilbert. |
| .SH "REPORTING BUGS" |
| Report bugs to <dgilbert at interlog dot com>. |
| .SH COPYRIGHT |
| Copyright \(co 2011\-2020 Douglas Gilbert |
| .br |
| This software is distributed under a BSD\-2\-Clause license. There is NO |
| warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. |
| .SH "SEE ALSO" |
| .B sg_requests(8), sg_format(8) |