当特定设备启动并且内核模块已加载时触发 init 脚本

当特定设备启动并且内核模块已加载时触发 init 脚本

在我的 Ubuntu 12.04 服务器上,我需要编写一个初始化文件等待 infiniband 接口(设备:MLX4_0, 界面:伊布0)完全启动,直到克内姆内核模块已加载。

我有一个初始化文件如果我等到系统启动并手动启动,脚本就可以工作service myscript start,但是如果我在启动时正常加载它,它就不起作用。我正在使用启动顺序99,但它无法正确启动,因为我需要它等待这些功能运行。

实现这一目标的正确语法是什么init.d(一个内核模块和)?我想一定有一些关键字,# Required-Start: $remote_fs $syslog $network但我找不到特定接口和内核模块的正确关键字。

对于背景:初始化脚本与斯鲁姆,开放MPI无限带宽互动。我已经编译了斯鲁姆Mellanox infiniband 驱动程序支持,以及开放MPI链接到此版本的 SLURM。结果是 openMPI 直接使用 Mellanox infiniband 驱动程序,该驱动程序比ipob(ip 通过 inifiniband)。为此,它需要使用系统的注册内存,必须将其设置为无限

所以:

我在我的中添加了一些logger输出初始化文件脚本。我注意到事实上这些模块已经启动并正在运行。所以我不完全理解这个问题。这很奇怪,可能与所需的一些环境变量有关,并且这些环境变量仅在完整的用户空间中设置,而不是在初始化时设置。

问题涉及内存锁限制中设置/etc/security/limits.conf。为了使它工作,我必须设置

*             -   memlock       unlimited
root          -   memlock       unlimited

这样,当我用一个启动 slurm 守护进程时SSH连接一切正常,当它是 init 进程启动守护进程时,它就像不考虑中的规则/etc/security/limits.conf

答案1

我不具体了解文件init.d,但udev在设备添加时运行脚本的规则可能如下所示:

ACTION=="add", ATTRS{idVendor}=="VID", ATTRS{idProduct}=="PID", RUN+="/path/to/executable"

您应该深入研究udevadm以了解有关设备通常添加方式及其模块加载方式的更多信息。您还可以在其中找到VID和的正确值PID

它是否接受设备和内核模块的组合?

是的。嗯...不。或许?这个问题的答案完全取决于您拦截设备添加的级别。udev从最初检测到设备到完全加载并初始化设备,必须做很多事情,可以考虑向上

其中一些可能是:

  • 最初检测其父总线/设备/子系统上的硬件

  • 查找并加载适当的内核模块

  • /dev devfs使用适当的设备特殊文件填充文件系统

  • 检测当前设备添加的任何子设备并冲洗,重复

您可以为所有或任何这些级别的操作指定规则。您还可以udevadm trigger直接monitor实时地直接确定这些级别的操作可能是什么。

我建议你仔细看看此信息如果您想更熟悉它。

答案2

为此使用 Upstart 作业:

# Ensures that the device is up and filesystem is too
start on filesystem and net-device-up IFACE=ib0
stop on runlevel [016]

# Ensures that module is loaded
pre-start exec modprobe -q knem

exec /path/to/exec

相关内容