【问题标题】:Run script on Linux startup as late as possible尽可能晚地在 Linux 启动时运行脚本
【发布时间】:2016-02-12 20:03:30
【问题描述】:

我创建了一个简单的模块,用于控制 USB 在主机模式下是否为设备供电。加载后,此模块会切断任何已连接设备的电源,除非另有说明。

还希望在启动时,系统会同时加载我的模块,并切断 USB 电源。为此,到目前为止我已经尝试过:

  1. 将我的模块设置为内置内核:没有效果,稍后加载的模块超出了我的配置;
  2. 创建 init.d 脚本:创建脚本,并将其设置为在 rc5 上运行。也没有运气,我在使用 USB 设备时遇到了多个问题(例如 usb 2-1: device descriptor read/64, error -110);

我在自定义板上运行 Kernel 3.12,并且我已经测试过,如果我在登录后手动(通过 modprobe)将其加载到系统中,该模块会按预期工作。

理想情况下,我希望在启动期间完成这些配置,而不需要登录等。

所以,我的问题是:如何将模块加载推迟到最后一分钟,以确保任何其他配置都已完成?另外,udev 是解决这类事情的好方法吗?根据我的阅读,我觉得这不是最合适的......

问候,

吉尔赫姆

【问题讨论】:

  • 您的模块似乎缺少声明正确的依赖关系。
  • 我正在使用 sysv init。另外,我犯了一个小错误:我将它添加到 rc5,而不是 rc6。修复它=]
  • @GuilhermeCosta 查看 chkconfig 实用程序。您可以配置一系列 rcN 初始化脚本,以便在引导周期稍后加载/启动您的模块。请注意,您的脚本将类似于 /etc/rc5.d/S80mystart,它将是指向您的真实脚本所在位置的符号链接。 S80 表示开始,80 是迟到的数字。
  • @GuilhermeCosta 内核中还有一个模块延迟加载选项。它是在其他模块之后加载的模块列表。
  • @PeterL。我正是这样做的,这就是我遇到我提到的那些奇怪的错误的时候。幸运的是,我发现可以通过解除绑定我想先关闭电源的 USB 设备来避免它们(这很奇怪,好像我自己加载了模块,没有必要,但我相信它有事可做使用 udev)。

标签: linux linux-kernel linux-device-driver


【解决方案1】:

所以,我想出了如何在使用 init.d 脚本时消除错误。所需要的只是在加载模块之前取消绑定设备。 modprobe 之前的以下行对我有用:

echo "2-1" > /sys/bus/usb/drivers/usb/unbind

问候,

吉尔赫姆

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多