“установка” команда modprobe не выполняет пользовательский скрипт

Вопрос или проблема

Debian bookworm, ядро 6.8.0-rc5, версия kmod 30

Я работаю с ограниченной системой и нужно отключить некоторые неиспользуемые порты PCIe, чтобы освободить IRQ для downstream-устройств до их загрузки. Я использую команду установки в modprobe.d/mpt3sas.conf

softdep mpt3sas pre: i40e
install mpt3sas /bin/sh /usr/bin/unbind_pcieport.sh; /sbin/modprobe --ignore-install mpt3sas $CMDLINE_OPTS

но unbind_pcieport.sh не срабатывает. Я добавил echos для вывода в файл журнала, но файл журнала никогда не создается, что указывает на то, что сценарий вообще не выполняется.

Отключение работает как ожидается, если я всё вставляю в mpt3sas.conf так:

install mpt3sas echo "0000:02:08.0" > /sys/bus/pci/drivers/pcieport/unbind; echo "0000:02:09.0" > /sys/bus/pci/drivers/pcieport/unbind; echo "0000:02:0a.0" > /sys/bus/pci/drivers/pcieport/unbind; /sbin/modprobe --ignore-install mpt3sas $CMDLINE_OPTS

но я хотел бы иметь некоторую логику в моем сценарии, и гораздо удобнее не иметь всё в одной строке .conf

Это тело сценария:

#!/bin/sh
# Список устройств PCI для отключения, разделенный пробелами
PCI_DEVICES="0000:02:08.0 0000:02:09.0 0000:02:0a.0"
# Отключить каждое указанное устройство, если оно существует
for DEVICE in $PCI_DEVICES; do
    if [ -e "/sys/bus/pci/drivers/pcieport/$DEVICE" ]; then
        echo "$DEVICE" > /sys/bus/pci/drivers/pcieport/unbind
        echo "Отключено $DEVICE от драйвера pcieport"
    else
        echo "$DEVICE не найдено или уже отключено"
    fi
done

Я пробовал использовать /bin/bash вместо sh и опускать /bin/bash в .conf, просто используя “unbind_pcieport.sh” (со сценарием в $PATH)

Скрипт .sh доступен для чтения и выполнения всем

ИЗМЕНЕНИЕ:
Просматривая руководство по modprobe, я не нашел, почему мой скрипт не выполняется, но я обнаружил, что можно разрывать строки с помощью \, так что я хотя бы привел в порядок работающий mpt3sas.conf на данный момент:

softdep mpt3sas pre: i40e
install mpt3sas \
echo "0000:02:08.0" > /sys/bus/pci/drivers/pcieport/unbind;\
echo "0000:02:09.0" > /sys/bus/pci/drivers/pcieport/unbind;\
echo "0000:02:0a.0" > /sys/bus/pci/drivers/pcieport/unbind;\
/sbin/modprobe --ignore-install mpt3sas $CMDLINE_OPTS

Ответ или решение

Ваша задача по автоматизации разблокировки PCIe-входов с использованием команды modprobe представляет собой интересную и сложную проблему. Судя по вашему описанию, скрипт unbind_pcieport.sh не выполняется, и при этом вы наблюдаете, что лог-файлы отсутствуют. Давайте подробно рассмотрим возможные причины этой проблемы и предложим пути её решения.

Анализ проблемы

  1. Команда Install: В вашем конфиге modprobe.d/mpt3sas.conf вы используете директиву install, чтобы запустить ваш скрипт. Однако при использовании команды install необходимо помнить, что она должна завершиться с нулевым кодом возврата для того, чтобы modprobe продолжал свою обработку. Если ваша команда вызывает ошибку, modprobe может не запустить последующие команды, включая сам модуль.

  2. Переменные среды: Переменная $CMDLINE_OPTS может не определяться в контексте, в котором запускается скрипт. Это значит, что если ваша команда использует эту переменную и она не установлена, её значение может быть пустым, что может вызвать неожиданные ошибки.

  3. Права доступа: Убедитесь, что скрипт unbind_pcieport.sh имеет необходимые права для выполнения. Вы также должны проверить, что пользователь, от имени которого выполняется modprobe, имеет права на выполнение операций, связанных с разъёмами PCIe.

  4. Логи и отладка: Для диагностики полезно добавить вывод ошибок в файл журнала в вашем скрипте:

    #!/bin/sh
    exec >> /var/log/unbind_pcieport.log 2>&1

    Это позволит вам отслеживать, что именно происходит во время выполнения скрипта.

Рекомендации по решению

  1. Проверка работоспособности скрипта: Запустите ваш скрипт вручную из терминала и посмотрите, возникают ли какие-либо ошибки. Это поможет вам определить, вызывается ли проблема из-за самого скрипта или из-за его вызова через modprobe.

  2. Изменения в конфигурации: Так как ваш подход с вызовом скрипта из конфигурации modprobe не работает, вы можете упростить архитектуру:

    install mpt3sas /bin/sh -c '/usr/bin/unbind_pcieport.sh; /sbin/modprobe --ignore-install mpt3sas $CMDLINE_OPTS'

    Здесь использование -c позволяет передать всю команду как одну строку.

  3. Улучшение отладки: Добавление более информативных логов в начале вашего скрипта также поможет лучше понять, выполняется ли он на самом деле и, если да, то в какой момент происходит сбой. Например:

    echo "Starting unbind_pcieport.sh" >> /var/log/unbind_pcieport.log
  4. Зависимости модуля: Убедитесь, что порядок загрузки модулей не нарушен. Возможно, другие модули зависят от модуля mpt3sas, и из-за этого его загрузка может быть заблокирована.

Заключение

Проблема, с которой вы столкнулись, может быть решена путем внимательного анализа конфигурации modprobe, прав доступа и контекста выполнения скрипта. Воспользуйтесь предложенными методами отладки и изменениями в конфигурации, которые, как ожидается, приведут к успешной реализации вашей задачи. Успехов в работе!

Оцените материал
Добавить комментарий

Капча загружается...