Linux

你能通過 sysfs 辨識傳輸嗎?

  • October 15, 2013

我正在編寫一個腳本,並且我對能夠辨識給定塊設備的傳輸類(fc - “光纖通道”、scsi、iscsi 等)感興趣。我可以通過ls -l /dev/disk/by-pathRHEL 檢索此資訊,但如果可能的話,我寧願查詢 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 數據。

除非我得到更好的答案,否則我將把它作為我的解決方案。這是非常間接的,但似乎有效。udevd基本上,我從能夠在 中創建路徑的事實判斷/dev/disk/by-path,它必須在 sysfs 中,因為據我所知,udev 真正做到了:獲取 sysfs 資訊並使用它執行配置的操作。

在翻找之後,看起來這些連結是由通過bash 腳本ID_PATH設置的變數的內容創建的。/lib/udev/id_path在裡面我發現了一個 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]*/*)) 的檢查,我還能夠通過查找“會話”來複製成功

$$ 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 編寫,但看起來檢查這些目錄就足夠了。我將繼續並將其標記為我的解決方案(一旦它讓我無論如何)。

引用自:https://unix.stackexchange.com/questions/96041