A menos que eu tenha uma resposta melhor, vou tomar isso como minha solução. É muito indireto, mas parece funcionar. Basicamente, eu julguei pelo fato de que udevd
foi capaz de criar o caminho em /dev/disk/by-path
, ele deve estar em sysfs porque eu sei que tudo o que o udev realmente faz: obtém informações sysfs e executa ações utilizando-o.
Depois de vasculhar, parece que esses links são criados pelo conteúdo da variável ID_PATH
, que é definida pelo script /lib/udev/id_path
bash. Por dentro, encontrei uma declaração de caso que basicamente mostra como ela determina o transporte verificando a existência de vários diretórios diretamente abaixo da entrada sysfs para o controlador de origem do dispositivo de bloco:
*/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=
;;
Eu testei isso na linha de comando, replicando o teste Fibre Channel e obtive resultados positivos:
## 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
Basicamente, eu pego o nome abreviado do dispositivo (sda, sdb, sde, etc), insiro o dispositivo físico e, em seguida, ..
até que eu esteja no controlador de origem do dispositivo de bloco. Se a entrada sysfs do controlador tiver rport*
diretórios como filhos imediatos, isso significa que o dispositivo de bloco está chegando via fibre channel.
Isso só replica a verificação para o primeiro caso de comutador ( */rport-[0-9]*:[0-9]*-[0-9]*/*)
) para iscsi, eu também fui capaz de replicar o sucesso procurando por diretórios "session [0-9]" no controlador:
[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 ~]#
Meu script será escrito em Python, mas parece que a verificação desses diretórios é suficiente. Eu vou seguir em frente e marcar isso como minha solução (uma vez que me permita de qualquer maneira).