Você consegue identificar o transporte via sysfs?

5

Estou escrevendo um script e estou interessado em poder identificar o classe de transporte (fc - "canal de fibra", scsi, iscsi, etc.) para um determinado dispositivo de bloco. Eu posso recuperar essa informação via ls -l /dev/disk/by-path no RHEL, mas eu prefiro consultar o sysfs se isso for possível (por uma variedade de razões, incluindo portabilidade). Por exemplo:

[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

Mas, ao procurar em /sys/block/sde , não vejo nada particularmente útil:

[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

Qualquer ajuda é apreciada, mesmo que isso apenas me empurre na direção certa. Minha solução ideal é usar apenas dados sysfs.

    
por Bratchley 14.10.2013 / 23:01

2 respostas

3

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).

    
por 15.10.2013 / 16:54
1

Nenhum sistema para testar isso em outro sistema que não seja o Fedora 19, mas isso pode ser um começo:

$ 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/

Também é interessante notar que o meu sistema não tem /dev/disk/by-path .

    
por 15.10.2013 / 04:59