SG_MAP26(8) | SG3_UTILS | SG_MAP26(8) |
sg_map26 - map SCSI generic (sg) device to corresponding device names
sg_map26 [--dev_dir=DIR] [--given_is=0|1] [--help] [--result=0|1|2|3] [--symlink] [--verbose] [--version] DEVICE
Maps a special file (block or char) associated with a SCSI device to the corresponding SCSI generic (sg) device, or vice versa. Can also be given a sysfs file, for example '/sys/block/sda' or '/sys/block/sda/dev'.
Rather than map to or from a sg device, the sysfs file name matching a given device special file (or vice versa) can be requested. This is done with '--result=2' and '--result=3'. This feature works on ATA devices (e.g. 'dev/hdc') as well as SCSI devices.
In this utility, "mapped" refers to finding the relationship between a SCSI generic (sg) node and the higher level SCSI device name; or vice versa. For example '/dev/sg0' may "map" to '/dev/sda'. Mappings may not exist, if a relevant module is not loaded, for example. Also there are SCSI devices that can only be accessed via a sg node (e.g. SAF-TE and some SES devices).
In this utility, "matching" refers to different representations of the same device accessed via the same driver. For example, '/dev/hdc' and '/sys/block/hdc' usually refer to the same device and thus would be considered matching. A related example is that '/dev/cdrom' and '/dev/hdc' are also considered matching if '/dev/cdrom' is a symlink to '/dev/hdc'.
Note that this utility requires root permissions to access the storage device nodes in the /dev directory. The lsscsi utility may be used instead in many cases, and lsscsi does not require root permission as it "data-mines" the sysfs pseudo file system for the information it needs.
For notes on bsg and nvme device nodes see the section on BSG and NVME DEVICES below.
Arguments to long options are mandatory for short options as well.
The bsg driver (Block Scsi Generic) presents alternate Unix character devices of the form: /dev/bsg/<h:c:t:l>. <h:c:t:l> is a 4 element tuple where 'h' is the host number, 'c' is the controller number, 't' is the target identifier and 'l' is the LUN (Logical Unit Number). Other than the bsg device names, each device, once open()-ed, operates in a similar fashion to a sg device: a generic interface at the SCSI command level.
If a bsg device is given to this utility, it will first try to map it to a SCSI block device. This will either be of the form /dev/sd<letter_s> for a disk or /dev/sr<number> for a BD/DVD or CD drive. If no match is found, then a check is made for a SCSI tape drive with a name of the form /dev/st<number>. If that fails, the mapping to the corresponding sg device is made. If the --result=2 option is given, the block device and tape davice checks are bypassed and the mapping to the corresponding sg device is made.
Note that this utility makes no mapping to a bsg device. That is pretty easy to establish using the lsscsi utility as the 4 element <h:c:t:l> tuple is shown at the beginning of each line (by default) and it uniquely identifies each SCSI device. Each line will also show the primary device name and, if the --generic option is given, the sg device node.
Currently NVMe device nodes come in several varieties, block devices of the form: /dev/nvme<c>n<n>[p<pn>] where <c> is the controller number (starting at 0), <n> is the namespace identifier (starting at 1), and <pn> is the partition number (starting at 1). There are two forms of NVMe character device nodes: one of the form /dev/nvme<c> and the other of the form /dev/ng<c>n<n> where "ng" is newer and termed as 'nvme-generic' in the /proc/devices output. This utility identifies but does not map NVMe devices. Their naming is more consistent so a utility like this is less needed. Udev might be used to remap the kernel's naming scheme for NVMe, removing its inherent naming consistency.
This utility is designed for the Linux 2.6 (and later) kernel series. It uses special file major and minor numbers (and whether the special is block or character) together with sysfs to do its mapping or matching. In the absence of any other information, device special files are assumed to be in the '/dev' directory while sysfs is assumed to be mounted at '/sys'. Device names in sysfs are predictable, given the corresponding major and minor number of the device. However, due to udev rules, the name of device special files can be anything the user desires (e.g. '/dev/sda' could be named '/dev/my_boot_disk'). When trying to find a resultant device special file, this utility uses the major and minor numbers (and whether a block or char device is sought) to search the device directory.
This utility only shows one relationship at a time. To get an overview of all SCSI devices, with special file names and optionally the "mapped" sg device name, see the lsscsi utility.
Even though lsscsi is a functional replacement for this utility, it has been reported that this utility runs faster in systems that have a lot of disks connected. Theoretically a Linux system may have up to 16383 SCSI disks connected to it.
Assume sg2 maps to sdb while dvd, cdrom and hdc are all matching.
# sg_map26 /dev/sg2
/dev/sdb
# sg_map26 /dev/sdb
/dev/sg2
# sg_map26 --result=0 /dev/sdb
/dev/sg2
# sg_map26 --result=3 /dev/sdb
/sys/block/sda
# sg_map26 --result=1 /dev/sdb
/sys/class/scsi_generic/sg0
Now look at '/dev/hdc' and friends
# sg_map26 /dev/hdc
<error: a hd device does not map to a sg device>
# sg_map26 --result=3 /dev/hdc
/sys/block/hdc
# sg_map26 --result=2 /dev/hdc
/dev/hdc
# sg_map26 --result=2 --symlink /dev/hdc
/dev/cdrom
/dev/dvd
/dev/hdc
# sg_map26 --result=2 --symlink /sys/block/hdc
/dev/cdrom
/dev/dvd
/dev/hdc
The exit status of sg_map26 is 0 when it is successful. Otherwise see the sg3_utils(8) man page.
Written by Douglas Gilbert.
Report bugs to <dgilbert at interlog dot com>.
Copyright © 2005-2023 Douglas Gilbert
This software is distributed under a BSD-2-Clause license. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR
PURPOSE.
udev(7), lsscsi(lsscsi)
April 2023 | sg3_utils-1.48 |