在工作中,由于要对写的代码进行测试,主要需要判断数据包返回值的正确性。测试命令如:SES,SPC,SSP,SMP中涉及到的命令。觉得上面的网址挺好的,现在就来看看,整理整理,以备后用。下面主要针对sg上面的三个命令集进行说明。
1:Utilities: sg3_utils and sg_utils
The  sg3_utils package contains utilities that  send SCSI commands to devices. 
 SCSI command sets are divided into a common setandseveral device class specific sets.
The common set of commands is referred to as theSCSI Primary Commands (SPC) with SPC-3 being the most recent standard. The mandatory SCSI INQUIRY command is defined in SPC-3.
The SCSI Block Commands (SBC) cover direct access devices such as disks.
The  MultiMedia Commands (MMC) cover CD, DVD and BD drives and the media within them.
 In the Linux kernel (lk) 2.4 series most of these utilities must be used with a SCSI generic (sg) driver device name (e.g./dev/sg0). In the lk 2.6 series almost all of these utilities can be used withthe primary device names as well (e.g./dev/sda, /dev/scd0, /dev/st0 and/dev/hdd (if it is an ATAPI device)). From lk 2.6.28 bsg devices can also be used (e.g./dev/bsg/3:0:0:0 ).
| Utility name | Main SCSI commands | Notes | 
| sginfo | MODE SENSE/SELECT, READ DEFECT | symbolic decoding (optional changing) of mode pages. Can also output (disk) defect lists. Port of olderscsiinfo utility. | 
| sgm_dd | READ, WRITE | sg_dd variant that uses memory mapped IO (only on Linux sg devices) | 
| sgp_dd | READ, WRITE | sg_dd variant that uses POSIX threads | 
| sg_dd | READ, WRITE | Unix dd command variant, uses SG_IO ioctl to send SCSI commands to copy data. See thesg_dd page. Newerddpt utility adds features and is ported to "f,s,w" | 
| sg_decode_sense | decodes sense data given as a string of hexadecimal bytes or in binary | |
| sg_emc_trespass | MODE SELECT | utility specialized for EMC Clariion series | 
| sg_format | FORMAT | format or resize a SCSI disk | 
| sg_get_config | GET CONFIGURATION | fetch features and profiles of a cd/dvd drive and/or its current media | 
| sg_get_lba_status | GET LBA STATUS | logical block provisioning support | 
| sg_ident | REPORT/SET IDENTIFYING INFORMATION | default is to report (fetch) the device identifier. With the '--set' option a new identifier is sent to the device. | 
| sg_inq | INQUIRY | fetch standard response, VPD pages or version descriptors. Also can perform IDENTIFY (PACKET) DEVICE ATA command. VPD page decoding also performed by sg_vpd and sdparm. | 
| sg_logs | LOG SENSE | fetch log sense pages, decode standard and some vendor pages | 
| sg_luns | REPORT LUNS | fetch luns reported by a device (lun 0 or "well known lu") | 
| sg_map | INQUIRY | shows mapping between sg devices and primary device node (if any). In lk 2.6 seelsscsi . | 
| sg_map26 | maps between single Linux sg device and primary device node (and vice versa). Also does mapping in to, and out of, sysfs. For the Linux 2.6 series. | |
| sg_modes | MODE SENSE | fetch mode pages (output mainly in hex, to decode output use sdparm) | 
| sg_opcodes | REPORT SUPPORTED OPERATION CODES | fetch supported SCSI commands or supported task management functions | 
| sg_persist | PERSISTENT RESERVE IN/OUT | control persistent reservations and report reservation status | 
| sg_prevent | PREVENT ALLOW MEDIUM REMOVAL | control media removal, mainly for those SCSI devices which have removable media (e.g. CD/DVD and tape drives) | 
| sg_raw | <user specified> | send user supplied cdb | 
| sg_rbuf | READ BUFFER | read from SCSI device cache. Typically for testing the SCSI transport (for throughput or errors) | 
| sg_rdac | MODE SENSE/SELECT | display or modify RDAC redundant controller mode page | 
| sg_read | READ | read continually from same offset. Syntax similar to sg_dd (without write side). Can test SCSI device cache and transport performance. | 
| sg_readcap | READ CAPACITY | fetch the number of blocks and the individual block size for disks and CD/DVD media | 
| sg_read_buffer | READ BUFFER | read descriptors or data | 
| sg_read_long | READ LONG | read data from given LBA which includes the block and ECC data. | 
| sg_reassign | REASSIGN BLOCKS | reassign a LBA from one sector on a disk (typically damaged) to a new (spare) sector. User data copied if it is recoverable. | 
| sg_referrals | REPORT REFERRALS | report data segment accessibility from target port groups | 
| sg_requests | REQUEST SENSE | fetch sense data from the given device. Modern uses include getting a progress indication (e.g. during a format) or finding the power condition state. | 
| sg_reset | - | Issue a driver, (SCSI) bus or device (target or lun?) reset. | 
| sg_rmsn | READ MEDIA SERIAL NUMBER | Relatively new command added to SPC-3. Format of response is vendor specific so this utility outputs it in hex (default) or binary. | 
| sg_rtpg | REPORT TARGET PORT GROUPS | Specialized for multi-ported SCSI devices where one port (or a group of them) is preferred for IO over another (or others). | 
| sg_safte | READ BUFFER | fetch information from a SAF-TE processor | 
| sg_sanitize | SANITIZE | Send SCSI SANITIZE command | 
| sg_sat_identify | ATA PASS-THROUGH | Send ATA IDENTIFY DEVICE or IDENTIFY PACKET DEVICE commands via the SAT ATA PASS-THROUGH (16 or 12) SCSI command. | 
| sg_sat_phy_event | ATA PASS-THROUGH | Sends an ATA READ LOG EXT command via a SAT to fetch log page 11h which contains SATA phy event counters. | 
| sg_sat_set_features | ATA PASS_THROUGH | Sends ATA SET FEATURES command via SAT | 
| sg_scan | [INQUIRY] | maps each sg device name to the corresponding numeric <host, channel, target, lun> tuple. In lk 2.6 series the "lsscsi -g" command is similar. | 
| sg_scan | [INQUIRY] | shows one device per line, with the device's various names and INQUIRY response string on that line. | 
| sg_senddiag | SEND DIAGNOSTIC | Issues either a default self test or a short/extended foreground/background self test. With no arguments it uses RECEIVE DIAGNOSTIC RESULTS to list all supported diagnostic pages. | 
| sg_ses | SEND/RECEIVE DIAGNOSTIC | Fetches status diagnostic pages from, and sends some control pages to, a SCSI Enclosure Services (SES) device. See thesg_ses page. | 
| sg_start | START STOP UNIT | Controls the power condition state of a SCSI device. Primary use is to spin up and down SCSI disks. Can also load and eject removable media. | 
| sg_stpg | SET TARGET PORT GROUPS | Specialized for multi-ported SCSI devices where one port (or a group of them) is preferred for IO over another (or others). | 
| sg_sync | SYNCHRONIZE CACHE | Causes disk caches to be flushed to media | 
| sg_test_rwbuf | READ/WRITE BUFFER | Random pattern written to SCSI device buffer then read back and checked. Used in testing for data corruption. | 
| sg_turs | TEST UNIT READY | Issue one or more Test Unit Ready commands. Can be used to time SCSI command overhead. | 
| sg_unmap | UNMAP | logical block provisioning support ("Trim" in the ATA world) | 
| sg_verify | VERIFY | reads indicated blocks on a SCSI disks, stops on the first error found. Does not yield any data. Useful for media scans. | 
| sg_vpd | INQUIRY | Decodes standard and some vendor Vital Product Data (VPD) pages. | 
| sg_write_buffer | WRITE BUFFER | write data; can be used to download firmware | 
| sg_write_long | WRITE LONG | writes to a LBA, data which includes the block and ECC data. Suitable data typically fetched by prior sg_read_long utility. | 
| sg_write_same | WRITE SAME | writes a single block to one or more (consecutive) LBAs. Also supports some logical block provisioning options. | 
| sg_wr_mode | MODE SELECT | writes mode pages supplied in ASCII hex (e.g. from "sg_modes -r") to the SCSI device. Seesdparm for another method of setting mode page parameters. | 
上面表格中的的命令,是对SPC中定义的命令的实现。
可以在sg上面下载源码包,自己编译安装。'./configure ; make ; make install' 就可以将编译好的sg命令安装到/usr/local/bin/目录中。
[root@centos /usr/local/bin]$ls
 sg_dd              sginfo    sg_modes    sg_rdac               sg_referrals  sg_sat_identify      sg_stpg        sg_write_buffer
 sg_decode_sense    sg_inq    sg_opcodes  sg_read               sg_requests   sg_sat_phy_event     sg_sync        sg_write_long
 sg_emc_trespass    sg_logs   sgp_dd      sg_read_block_limits  sg_reset      sg_sat_set_features  sg_test_rwbuf  sg_write_same sg_format          sg_luns   sg_persist  sg_read_buffer        sg_rmsn       sg_scan              sg_turs        sg_wr_mode sg_get_config      sg_map    sg_prevent  sg_readcap            sg_rtpg       sg_senddiag          sg_unmap
 sg_get_lba_status  sg_map26  sg_raw      sg_read_long          sg_safte      sg_ses               sg_verify
 sg_ident           sgm_dd    sg_rbuf     sg_reassign           sg_sanitize   sg_start             sg_vpd
下面举几个例子(命令式在虚拟机上面执行的)
 [root@centos /usr/local/bin]$sg_inq /dev/sda //时间inquiry命令查询target的信息
 standard INQUIRY: //标准inquiry的输出数据
 PQual=0 Device_type=0 RMB=0 version=0x02 [SCSI-2]
 [AERC=0] [TrmTsk=0] NormACA=0 HiSUP=0 Resp_data_format=2
 SCCS=0 ACC=0 TPGS=0 3PC=0 Protect=0 BQue=0
 EncServ=0 MultiP=0 [MChngr=0] [ACKREQQ=0] Addr16=0
 [RelAdr=0] WBus16=1 Sync=1 Linked=0 [TranDis=0] CmdQue=1
 length=36 (0x24) Peripheral device type: disk
 Vendor identification: VMware, 
 Product identification: VMware Virtual S
 Product revision level: 1.0 
 [root@centos /usr/local/bin]$sg_scan
 /dev/sg0: scsi0 channel=0 id=0 lun=0
 /dev/sg1: scsi0 channel=0 id=1 lun=0
 /dev/sg2: scsi0 channel=0 id=2 lun=0  
2:smp_utils
The  smp_utils package contains utilities for  the Serial Attached SCSI (SAS) Serial  Management Protocol (SMP). Most utilities correspond to a single SMP function, sending out a request, checking for errors and if all is well processing the response. The response is either decoded, printed out in ASCII hexadecimal or sent as binary to stdout.
 At the lower levels SAS is a point to point interconnect (like SATA).SAS has devices called expanders which have a similar role to switches in the Fibre Channel protocol and the Ethernet.The primary role of SMP is to monitor and control SAS expanders. Most SAS Host Bus Adapters (HBAs) contain a SMP initiator through which SMP requests are sent and responses received. SAS expanders contain SMP targets that respond to SMP requests. SAS disks do not normally contains SMP targets and SATA disks do not contain SMP targets.SAS has two other protocols: SSP for transporting SCSI command sets to SAS devices(e.g. SAS disks and tape drives) , and STP for tunnelling the ATA command set to a SAS expander.
SMP is a request response protocol with each request and response limited currently to 1028 bytes in length (including a 4 byte CRC at the end of each request and response).
Each expander phy has a routing attribute. There are three routing attributes: direct, subtractive and table. Direct routing is the simplest and is all that is required if a single expander interconnects SAS end devices (e.g. SAS initiators (HBAs) and SAS targets (including SAS disks, tapes and SES devices)).Such an interconnect is termed in SAS as a "Service Delivery Subsystem" (SDS) while other transports might term this as a "fabric".
 The utilities in the smp_utils packagesend requests to what the standard terms as a SMP target. A SMP target is not a SCSI device so SCSI commands like INQUIRY cannot be sent to a SMP target. Hence utilities such as those in the sg3_utils package cannot be used on a SMP target.
 A SAS expander will contain one SMP target with the SAS address of the expander.Some SAS host bus adapters (HBAs) have a (hidden) SMP target. Typically SAS end devices such as disk drives (both SAS and SATA) and tape drives do not contain a SMP target.
 
编译完之后,linux上面的smp如下:
[root@centos /usr/local/bin]$smp
 smp_conf_general        smp_discover_list       smp_rep_broadcast       smp_rep_phy_sata        smp_zoned_broadcast
 smp_conf_phy_event      smpdump                 smp_rep_exp_route_tbl   smp_rep_route_info      smp_zone_lock
 smp_conf_route_info     smp_ena_dis_zoning      smp_rep_general         smp_rep_self_conf_stat  smp_zone_unlock
 smp_conf_zone_man_pass  smp_phy_control         smp_rep_manufacturer    smp_rep_zone_man_pass  
 smp_conf_zone_perm_tbl  smp_phy_test            smp_rep_phy_err_log     smp_rep_zone_perm_tbl  
 smp_conf_zone_phy_info  smpquery                smp_rep_phy_event       smp_write_gpio         
 smp_discover            smp_read_gpio           smp_rep_phy_event_list  smp_zone_activate 
对上面的命令的解释可以参考SPL中的9.4 Management application layer
smp_utils很重要,但是我现在的条件,不能实际的测试smp_utils中的命令,如果以后有机会肯定会把smp_utils中的命令执行一遍,看看结果,思考思考expander在整个系统的功能。
3:Scsi_ses
SCSI Enclosure Services (SES) permit themanagement and sensethe state ofpower supplies, cooling devices, displays, indicators, individual drives, and other non-SCSI elements installed in an enclosure. The scsi_ses adapter driver simulates a SES device. The default action is to appear as a disk (actually an 8 MB ramdisk) with associated Enclosure Services. This is similar to a fibre channel disk with a SCA-2 connector which includes an Enclosure Services Interface (ESI). Alternatively this driver can simulate a simple SES device.
Supported SES Diagnostic pages
A SES (and SES-2 draft) application client communicates with a SES device via diagnostic pages.Status diagnostic pages are fetched from a SES device with the RECEIVE DIAGNOSTIC RESULTS SCSI command.Control diagnostic pages are sent to a SES device with the SCSI SEND DIAGNOSTIC SCSI command.
The supported status diagnostic pages are: //状态 page code
- List supported diagnostic pages [0x0]
- Configuration [0x1]
- Enclosure status [0x2]
- Help text [0x3]
- String In [0x4]
- Threshold In [0x5]
- Element descriptor [0x7]
- Enclosure busy [0x9]
The supported control diagnostic pages are: //控制page code
 
- Enclosure control [0x2]
- String Out [0x4]
- Threshold Out [0x5]
上面说的很清楚通过send diagnostic和receive diagnostic来控制或获取enclosure中的elements的信息。
上面涉及到的sg命令,以后有机会我会统统的执行一遍。
