Это своего рода FAQ, но все ответы, которые я нашел до сих пор, не подходят для полной автоматизации, что мне и нужно. Итак, вот оно снова.
В Linux:
Есть ли надежный способ разрешить имя устройства udev жесткого диска (например, «/ dev / sdg») в его путь к данным, чтобы определить физический реальный кабель, через который устройство подключено (например, «Контроллер в PCIe-Slot2, SAS -Канал 0, порт репликатора 3 "?
Я запускаю сервер с дюжиной SATA-дисков в объединительных платах с возможностью горячей замены. Диски собираются в программное обеспечение Raid6 с использованием dmraid (Linux). По причинам, выходящим за рамки этого вопроса, я хочу и должен запускать программный рейд, а не аппаратный рейд, через выделенный контроллер.
Одним из недостатков программного рейда является то, что индикатор сбоя в отсеке для диска не загорается, когда диск выходит из строя в массиве, потому что у корпуса нет возможности опросить mdadm о состоянии диска. Вы должны вручную найти положение неисправного привода.
Я знаю, ты мог бы просто выпустить dd if=/dev/sdg of=/dev/null
и посмотреть, какой индикатор активности загорится, но я ищу здесь красивое решение.
Чтобы исправить это, я собрал небольшую печатную плату, которая будет взаимодействовать с объединительной платой через i2c, чтобы включать / выключать светодиоды отказа отсеков, и у меня есть небольшой скрипт, который общается с этой платой через RS232.
mdadm может запустить команду при возникновении события сбоя, поэтому я могу сказать mdadm запустить мой сценарий и включить светодиод, когда диск выпадает из массива. Единственная проблема:
мдадм говорит мне "диск / dev / sdg1 вышел из строя". Но мне нужно «Привод на контроллере 1, канал 2, порт 3 неисправен», чтобы я мог определить, какой светодиод включить.
Кто-нибудь знает надежный способ разрешить имя устройства, например / dev / sdg, обратно в путь?
Я знаю hdparm -I /dev/sdX
предоставит мне серийный номер и производителя диска, чтобы я мог вручную идентифицировать диск, глядя на этикетку, но дело в том, чтобы сделать это автоматически. Достаточно надежной идентификации задействованного контроллера / порта, поскольку проводка обычно не меняется при использовании объединительных плат, и я знаю, какой порт контроллера обслуживает какой отсек для дисков.
Моей первой идеей было сделать ls -lah /dev/disk/by-path | grep /dev/sdX
для соответствующего имени цели, однако это оказалось ненадежным, поскольку даже половина установленных в настоящее время дисков не появляется в этом каталоге.
Просто сказать «у вашего первого контроллера будет sda-sdh, у вашего второго контроллера будет sdi-p» тоже ненадежно, так как при загрузке возникает состояние гонки, и иногда сначала инициализируется один контроллер, иногда другой. То, что инициализировано первым, получает / dev / sda ... Также все усложняется после горячей замены или, если не все отсеки заполнены.
lshw -short -c disk
похоже, генерирует вывод, аналогичный тому, что я ищу, но мне не удается связать показанные здесь номера путей с физическими кабелями. Стабильны ли эти назначения? Каков точный образец? (Нумерация в путях scsi является непрерывной, хотя не все мои отсеки для дисков заполнены, что наводит меня на мысль, что эти узлы пути scsi назначаются динамически и не представляют напрямую физические порты на контроллере)
Кто-нибудь знает команду linux, которая принимает / dev / sdX в качестве аргумента и надежно выводит соответствующий слот PCIe и порт контроллера?
Как упоминалось в предыдущем комментарии, проверьте / sys / block / sdX. Если вы cd в один из этих каталогов, а затем выполните ls -l, вы увидите символическую ссылку для устройства, которая должна указать вам путь к устройству. Например, в моей системе я вижу устройство в / sys / block / sdz, связанное следующим образом:
device -> ../../devices/pci0000:00/0000:00:09.0/0000:08:00.0/host3/rport-3:0-5/target3:0:5/3:0:5:1/
Это дает мне точный путь к устройству, поддерживающему блочное устройство, от пути PCI к хост-контроллеру до LUN. Это может выглядеть немного по-разному в зависимости от типа вашего устройства - например, у меня контроллер волоконно-оптического канала, отсюда и его часть rport.