我正在编写一个脚本,并且我有兴趣能够识别运输类(fc - “光纤通道”、scsi、iscsi 等)对于给定的块设备。我可以通过 RHEL 检索此信息ls -l /dev/disk/by-path
,但如果可能的话,我宁愿查询 sysfs(出于多种原因,包括可移植性)。例如:
[root@localhost sde]# ls -l /dev/disk/by-path
total 0
lrwxrwxrwx 1 root root 9 Jul 21 16:39 pci-0000:01:00.0-scsi-0:2:0:0 -> ../../sda
lrwxrwxrwx 1 root root 10 Jul 21 16:39 pci-0000:01:00.0-scsi-0:2:0:0-part1 -> ../../sda1
lrwxrwxrwx 1 root root 10 Jul 21 16:39 pci-0000:01:00.0-scsi-0:2:0:0-part2 -> ../../sda2
lrwxrwxrwx 1 root root 10 Jul 21 16:39 pci-0000:01:00.0-scsi-0:2:0:0-part3 -> ../../sda3
lrwxrwxrwx 1 root root 9 Jul 21 16:39 pci-0000:01:00.0-scsi-0:2:1:0 -> ../../sdb
lrwxrwxrwx 1 root root 10 Jul 21 16:39 pci-0000:01:00.0-scsi-0:2:1:0-part1 -> ../../sdb1
lrwxrwxrwx 1 root root 9 Jul 21 16:39 pci-0000:01:00.0-scsi-0:2:2:0 -> ../../sdc
lrwxrwxrwx 1 root root 10 Jul 21 16:39 pci-0000:01:00.0-scsi-0:2:2:0-part1 -> ../../sdc1
lrwxrwxrwx 1 root root 9 Jul 21 16:39 pci-0000:1a:00.0-fc-0x500601663ee0025f:0x0000000000000000 -> ../../sdd
lrwxrwxrwx 1 root root 9 Jul 21 16:39 pci-0000:1a:00.0-fc-0x500601663ee0025f:0x0015000000000000 -> ../../sde
lrwxrwxrwx 1 root root 9 Jul 21 16:39 pci-0000:1a:00.0-fc-0x5006016e3ee0025f:0x0000000000000000 -> ../../sdf
lrwxrwxrwx 1 root root 9 Jul 21 16:39 pci-0000:1a:00.0-fc-0x5006016e3ee0025f:0x0015000000000000 -> ../../sdg
lrwxrwxrwx 1 root root 9 Jul 21 16:39 pci-0000:1a:00.1-fc-0x500601653ee0025f:0x0000000000000000 -> ../../sdj
lrwxrwxrwx 1 root root 9 Jul 21 16:39 pci-0000:1a:00.1-fc-0x500601653ee0025f:0x0015000000000000 -> ../../sdk
lrwxrwxrwx 1 root root 9 Jul 21 16:39 pci-0000:1a:00.1-fc-0x5006016d3ee0025f:0x0000000000000000 -> ../../sdh
lrwxrwxrwx 1 root root 9 Jul 21 16:39 pci-0000:1a:00.1-fc-0x5006016d3ee0025f:0x0015000000000000 -> ../../sdi
但看了一下,/sys/block/sde
我没有看到任何特别有用的东西:
[root@localhost sde]# ls -l /sys/block/sde
total 0
-r--r--r-- 1 root root 4096 Oct 14 16:51 dev
lrwxrwxrwx 1 root root 0 Oct 14 16:51 device -> ../../devices/pci0000:00/0000:00:07.0/0000:1a:00.0/host5/rport-5:0-2/target5:0:0/5:0:0:21
drwxr-xr-x 2 root root 0 Jul 21 12:39 holders
drwxr-xr-x 3 root root 0 Jul 21 12:39 queue
-r--r--r-- 1 root root 4096 Oct 14 16:51 range
-r--r--r-- 1 root root 4096 Oct 14 16:51 removable
-r--r--r-- 1 root root 4096 Oct 14 16:51 size
drwxr-xr-x 2 root root 0 Jul 21 12:39 slaves
-r--r--r-- 1 root root 4096 Oct 14 16:51 stat
lrwxrwxrwx 1 root root 0 Oct 14 16:51 subsystem -> ../../block
--w------- 1 root root 4096 Oct 14 16:51 uevent
任何帮助都会受到赞赏,即使它只是将我推向正确的方向。我理想的解决方案是使用仅有的sysfs 数据。
答案1
除非我得到更好的答案,否则我将以此作为我的解决方案。这是非常间接的,但似乎有效。基本上,我从udevd
能够在 中创建路径的事实来判断/dev/disk/by-path
,它必须位于 sysfs 中,因为据我所知,这就是 udev 真正所做的一切:获取 sysfs 信息并利用它执行配置的操作。
翻遍之后,看起来这些链接是由ID_PATH
通过/lib/udev/id_path
bash 脚本设置的变量的内容创建的。在其中我发现了一个 case 语句,它基本上列出了如何通过检查给定块设备的源控制器的 sysfs 条目正下方是否存在各种目录来确定传输:
*/rport-[0-9]*:[0-9]*-[0-9]*/*)
handle_fc "$D"
;;
*/end_device-[0-9]*:[0-9]*:[0-9]*/*)
handle_sas "$D"
;;
*/fw-host[0-9]*/*)
handle_firewire "$D"
;;
*/session[0-9]*/*)
handle_iscsi "$D"
D=
;;
*/host[0-9]*/[0-9]*:[0-9]*:[0-9]*:[0-9]*)
handle_scsi "$D"
;;
*/usb[0-9]*/[0-9]*/*)
handle_usb "$D"
;;
*/pci[0-9]*:[0-9]*)
handle_pci "$D"
;;
*/serio[0-9]*)
handle_serio "$D"
;;
*/platform/*)
handle_platform "$D"
;;
*/devices)
D=
;;
我通过复制光纤通道测试在命令行上对此进行了测试,并得到了积极的结果:
## INTERNAL DRIVE:
[root@localhost sde]# ls -ld /sys/block/sda/device/../../../rport* 2>/dev/null | wc -l
0
## FIBRE CHANNEL BLOCK DEVICE:
[root@localhost sde]# ls -ld /sys/block/sde/device/../../../rport* 2>/dev/null | wc -l
4
基本上,我采用设备的短名称(sda、sdb、sde 等),输入物理设备,然后..
直到到达块设备的源控制器。如果控制器的 sysfs 条目将rport*
目录作为直接子项,则意味着块设备是通过光纤通道进入的。
这仅复制了对 iscsi 的第一个 switch case ( ) 的检查*/rport-[0-9]*:[0-9]*-[0-9]*/*)
,我还可以通过在控制器上查找“session[0-9]”目录来复制成功:
[root@files2 ~]# ls -ld /sys/block/sda/device/../../../session[0-9]
drwxr-xr-x. 6 root root 0 Oct 15 13:50 /sys/block/sda/device/../../../session1
[root@files2 ~]#
我的脚本将用 Python 编写,但看起来检查这些目录就足够了。我将继续并将其标记为我的解决方案(一旦它允许我无论如何)。
答案2
除了我的 Fedora 19 系统之外,没有其他系统可以对此进行测试,但这可能是一个开始:
$ ls -l /sys/block/sda/subsystem/sda
lrwxrwxrwx. 1 root root 0 Oct 14 21:41 /sys/block/sda/subsystem/sda -> ../../devices/pci0000:00/0000:00:1f.2/ata1/host0/target0:0:0/0:0:0:0/block/sda/
有趣的是,我的系统没有/dev/disk/by-path
.