Intereting Posts
Как разрешить rsync дополнительно хранить дифференциальный журнал изменений в другом каталоге? Компиляция IMAP с определенной версией PHP API для MAMP Linux mint wifi устройство не входит в список rfkill Как grep слово после / summary / в переменной и хранить слово в новой переменной в сценарии bash Повторно открыть xchat после того, как он был закрыт на системном трее Доступ к разделу Windows7_OS из Linux при двойной загрузке Как снова переделать pendrive? ошибка «Операция не разрешена» при установке ulimit для memlock в контейнере Docker, на котором выполняется ubuntu: xenial (хост macOS) Управление сетью CLI Случайно удалил wifi-устройство wlan0 Как использовать группы для ограничения всех процессов, кроме белого списка, на один процессор? Quotes exercise – как сделать ssh внутри ssh во время запуска sql внутри второго ssh? Сложность создания регулярного выражения для поиска по меньшей мере двух вхождений символа в файл Можно объявить функцию локально и использовать ее на удаленном конце соединения SSH Каталоги rc0.d, rc1.d, … в / etc

Можете ли вы определить транспорт через 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 и выполняет настроенные действия, используя ее.

    После рывков вокруг это выглядит так, что эти ссылки создаются содержимым переменной ID_PATH которая устанавливается с помощью сценария bash /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= ;; 

    Я проверил это в командной строке, повторив тест Fibre Channel и получив положительные результаты:

     ## 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* качестве непосредственных дочерних rport* , то это означает, что блок-устройство входит через волоконный канал.

    Это только повторяет проверку для первого случая коммутатора ( */rport-[0-9]*:[0-9]*-[0-9]*/*) ) для iscsi, я также смог воспроизвести успех путем поиска «сессионных [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, но похоже, что проверка этих каталогов достаточно. Я собираюсь пойти и отметить это как мое решение (как только оно позволяет мне в любом случае).

    Нет систем для проверки этого, кроме моей системы 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 .