![在 Debian/Raspbian(Raspberry Pi)中加载内核模块后运行启动脚本](https://linux22.com/image/1439784/%E5%9C%A8%20Debian%2FRaspbian%EF%BC%88Raspberry%20Pi%EF%BC%89%E4%B8%AD%E5%8A%A0%E8%BD%BD%E5%86%85%E6%A0%B8%E6%A8%A1%E5%9D%97%E5%90%8E%E8%BF%90%E8%A1%8C%E5%90%AF%E5%8A%A8%E8%84%9A%E6%9C%AC.png)
我正在尝试为我的 Raspberry Pi 创建自定义启动屏幕按照此处的说明进行操作。
这涉及fbi
在脚本中安装和运行它init.d
。
这在默认的 HDMI 输出上工作正常。问题是,我需要图像显示在Adafruit PiTFT位于 /dev/fb1 上。使用开关从命令提示符运行 fbi-d /dev/fb1
即可,并在 PiTFT 上显示图像。
问题是 PiTFT 是使用内核模块加载的,根据 Debian 启动过程,该模块是后脚本init.d
运行。这意味着 -d 开关不起作用,因为/dev/fb1
尚不存在。
有没有办法我可以设置一个启动脚本在内核模块加载后运行,这样我就可以在 PiTFT 上显示图像?
答案1
我在这里假设 Raspbian 与常规 Debian GNU/Linux 类似,并且您使用的是基于依赖项的启动(不是 systemd;尽管这可能也可以适用于 systemd)。也就是说,您的环境类似于 Debian Wheezy(这是撰写此答案时的最新稳定版本)。
在启动过程中,/etc/init.d/kmod 会启动以加载 /etc/modules 中列出的所有模块。通过确保您的脚本具有kmod
依赖项,您可以利用这一点来确保在脚本执行之前加载所需的内核模块。
为此,您应该INIT INFO
在脚本中添加一个标题(可以从另一个脚本复制),其中列出kmod
(Required-Start
启动脚本提供的服务时必需)和Required-Stop
(停止服务时必需)。您还需要Default-Start
适当设置Default-Stop
。
一个好的初始化脚本头可能是这样的:
#! /bin/sh
### BEGIN INIT INFO
# Provides: mybootdisplay
# Required-Start: kmod
# Required-Stop: kmod
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description:
# Description:
### END INIT INFO
# ... your magic goes down here ...
查看man 8 insserv
有关不同信息节的更多详细信息,并查看不同的现有初始化脚本以获得灵感。
使用适当的 init 信息块创建 init 脚本后,运行sudo update-rc.d mybootdisplay defaults
以将 /etc/init.d/mybootdisplay 添加到启动顺序。
作为选择除了上述内容,您可以让脚本在运行之前通过调用modprobe
或自身来专门加载所需的内核模块。 话虽如此,我个人还是更喜欢使用正常的 init 脚本,这意味着上述解决方案可能更好。insmod
fbi