
私は脚本を書いているのですが、輸送クラス(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 データ。
答え1
もっと良い答えが得られない限り、私はこれを解決策として採用するつもりです。非常に間接的ですが、うまく機能しているようです。基本的に、私は がのudevd
パスを作成できたという事実から判断しました。/dev/disk/by-path
しなければならないsysfs にあるのは、私の知る限り、udev が実際に行うことは sysfs 情報を取得し、それを利用して構成されたアクションを実行することだけだからです。
調べてみると、これらのリンクはbash スクリプトID_PATH
によって設定された変数の内容によって作成されるようです/lib/udev/id_path
。その中に、指定されたブロック デバイスのソース コントローラーの 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 の最初のスイッチ ケース ( ) のチェックのみを複製します*/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
。