Вопрос или проблема
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
не выполняется, и при этом вы наблюдаете, что лог-файлы отсутствуют. Давайте подробно рассмотрим возможные причины этой проблемы и предложим пути её решения.
Анализ проблемы
-
Команда Install: В вашем конфиге
modprobe.d/mpt3sas.conf
вы используете директивуinstall
, чтобы запустить ваш скрипт. Однако при использовании командыinstall
необходимо помнить, что она должна завершиться с нулевым кодом возврата для того, чтобыmodprobe
продолжал свою обработку. Если ваша команда вызывает ошибку,modprobe
может не запустить последующие команды, включая сам модуль. -
Переменные среды: Переменная
$CMDLINE_OPTS
может не определяться в контексте, в котором запускается скрипт. Это значит, что если ваша команда использует эту переменную и она не установлена, её значение может быть пустым, что может вызвать неожиданные ошибки. -
Права доступа: Убедитесь, что скрипт
unbind_pcieport.sh
имеет необходимые права для выполнения. Вы также должны проверить, что пользователь, от имени которого выполняетсяmodprobe
, имеет права на выполнение операций, связанных с разъёмами PCIe. -
Логи и отладка: Для диагностики полезно добавить вывод ошибок в файл журнала в вашем скрипте:
#!/bin/sh exec >> /var/log/unbind_pcieport.log 2>&1
Это позволит вам отслеживать, что именно происходит во время выполнения скрипта.
Рекомендации по решению
-
Проверка работоспособности скрипта: Запустите ваш скрипт вручную из терминала и посмотрите, возникают ли какие-либо ошибки. Это поможет вам определить, вызывается ли проблема из-за самого скрипта или из-за его вызова через
modprobe
. -
Изменения в конфигурации: Так как ваш подход с вызовом скрипта из конфигурации
modprobe
не работает, вы можете упростить архитектуру:install mpt3sas /bin/sh -c '/usr/bin/unbind_pcieport.sh; /sbin/modprobe --ignore-install mpt3sas $CMDLINE_OPTS'
Здесь использование
-c
позволяет передать всю команду как одну строку. -
Улучшение отладки: Добавление более информативных логов в начале вашего скрипта также поможет лучше понять, выполняется ли он на самом деле и, если да, то в какой момент происходит сбой. Например:
echo "Starting unbind_pcieport.sh" >> /var/log/unbind_pcieport.log
-
Зависимости модуля: Убедитесь, что порядок загрузки модулей не нарушен. Возможно, другие модули зависят от модуля
mpt3sas
, и из-за этого его загрузка может быть заблокирована.
Заключение
Проблема, с которой вы столкнулись, может быть решена путем внимательного анализа конфигурации modprobe
, прав доступа и контекста выполнения скрипта. Воспользуйтесь предложенными методами отладки и изменениями в конфигурации, которые, как ожидается, приведут к успешной реализации вашей задачи. Успехов в работе!