Debian bookworm,内核 6.8.0-rc5,kmod 版本 30
我正在使用一个受限的系统,需要解除一些未使用的 PCIe 端口的绑定,以便在下游设备加载之前释放 IRQ。我正在使用 modprobe.d/mpt3sas.conf 中的安装命令(然后使用 重建update-initramfs -u
)
softdep mpt3sas pre: i40e
install mpt3sas /bin/sh /usr/bin/unbind_pcieport.sh; /sbin/modprobe --ignore-install mpt3sas $CMDLINE_OPTS
但 unbind_pcieport.sh 并未启动。我已将echos
unbind_pcieport.sh 包含在内,输出到日志文件,但从未创建任何日志文件,这表明该脚本根本没有运行。
如果我将所有内容放入 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
# 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
我尝试使用 /bin/bash 代替 sh,并在 .conf 中省略 /bin/bash 而只使用“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
恕我直言
由于未指定目的地,因此不匹配,EOL 处需要“;”
@TomYan 的评论是正确的,我需要将我的脚本添加到 initramfs 中。
我创建了
/etc/initramfs-tools/hooks/unbind_pcieport
然后
/etc/modprobe.d/mpt3sas.conf
看起来像这样重新启动后
update-initramfs -u
它就可以正常工作了!