在我的 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