你能通過 sysfs 辨識傳輸嗎?
我正在編寫一個腳本,並且我對能夠辨識給定塊設備的傳輸類(fc - “光纖通道”、scsi、iscsi 等)感興趣。我可以通過
ls -l /dev/disk/by-path
RHEL 檢索此資訊,但如果可能的話,我寧願查詢 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 編寫,但看起來檢查這些目錄就足夠了。我將繼續並將其標記為我的解決方案(一旦它讓我無論如何)。