Debian bookworm, kernel 6.8.0-rc5, kmod versão 30
Estou trabalhando com um sistema restrito e preciso desvincular algumas portas PCIe não utilizadas para liberar IRQs para dispositivos downstream antes que eles sejam carregados. Estou usando um comando install em modprobe.d/mpt3sas.conf (e então reconstruindo com update-initramfs -u
)
softdep mpt3sas pre: i40e
install mpt3sas /bin/sh /usr/bin/unbind_pcieport.sh; /sbin/modprobe --ignore-install mpt3sas $CMDLINE_OPTS
mas unbind_pcieport.sh não dispara. Eu incluí echos
em unbind_pcieport.sh, a saída para um arquivo de log, mas nenhum arquivo de log é criado, indicando que o script não está sendo executado.
A desvinculação funciona como esperado se eu colocar tudo dentro de mpt3sas.conf assim:
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
mas eu gostaria de ter alguma lógica no meu script e é mais limpo não ter tudo em uma linha do .conf
Este é o corpo do script:
#!/bin/sh
# Space-separated list of PCI devices to unbind
PCI_DEVICES="0000:02:08.0 0000:02:09.0 0000:02:0a.0"
# Unbind each specified device if it exists
for DEVICE in $PCI_DEVICES; do
if [ -e "/sys/bus/pci/drivers/pcieport/$DEVICE" ]; then
echo "$DEVICE" > /sys/bus/pci/drivers/pcieport/unbind
echo "Unbound $DEVICE from pcieport driver"
else
echo "$DEVICE not found or already unbound"
fi
done
Tentei usar /bin/bash em vez de sh, omitindo /bin/bash no .conf e usando apenas "unbind_pcieport.sh" (com o script em $PATH)
O script .sh é executável e legível em todo o mundo
EDIT: Olhando o manual do modprobe, não descobri por que meu script não está sendo executado, mas descobri que é possível quebrar linhas com \
, então pelo menos limpei o funcionamento mpt3sas.conf
por enquanto:
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
Na minha humilde opinião
não corresponde porque o destino não foi especificado também, ";" no EOL é necessário
@TomYan estava correto em seu comentário, eu precisava adicionar meu script ao initramfs.
eu criei
/etc/initramfs-tools/hooks/unbind_pcieport
Então
/etc/modprobe.d/mpt3sas.conf
fica assimDepois
update-initramfs -u
de uma reinicialização, funciona!