在重新启动时select制作并安装新的Linux内核和驱动程序有风险吗?

通常的做法是在源代码中提供Linux内核驱动程序(内核对象KO),并在目标计算机上构build和安装它们。 例如Nvidia的显示驱动程序,Oracle VirtualBox guest加载项驱动程序就是这样安装的。 通过系统更新接收新版本的内核(包含适当的头文件)也很常见。 这需要重新构build和重新安装KO,否则更新后设备将停止工作。

在我们的产品安装启动脚本中,我们希望添加一个步骤来在每次启动时安装KO。 用户可以select退出,并且必须手动构build和安装KO。 设备驱动程序与USB设备通信。 相关细节:1.当安装新内核时,实际的重新构build只会发生一次,因为make不会重新构build已经存在并且是最新的文件。 2.重build驱动程序需要大约2秒的时间,并且在正常启动期间(而不是在内核更新之后)需要几毫秒的时间来跳过构build。3.如果构build失败,不应该使系统崩溃或使其不稳定,但是我们的硬件设备将无法工作。 4.一些发行版可能允许注册钩子,对某些事件执行操作,如内核更新。 但是,我们正试图实现一些能够以统一的方式在大多数分布上运行的东西。 我们的安装程序是脚本+ tar或脚本+ rpm。 不幸的是,对于这个版本,我们没有带宽来为所有发行版本准备本地软件包(例如debian风格)。

问题:1.这是一个可接受的解决scheme? 如果没有,为什么? 2.与这种方法相关的潜在风险是什么? 3.启动过程中正确/首选的地点是什么? rc.local或脚本在init.d或其他? 目标是使其使用相同的方法(如果可能的话)在大多数分布上工作。

1)是的,但是您应该添加一个清晰的howto描述我们可以手动运行您的脚本的方式,以便我们可以确保脚本将正常返回。 对于centos中的virtualbox,他们在/etc/init.d中添加一个名为vboxdrv的脚本

用法:/etc/init.d/vboxdrv {start | stop | stop_vms | restart | force-reload | status | setup}

这很清楚,我们可以启动/停止脚本并获取它的状态,所以只要我们能够在部署新内核之前检查脚本,重启时出现问题的风险是最小的。 你不能有比这更标准的,对我来说这是完美的。

2)编译过程系统失败,没有可用的模块。 这是不是悲剧? 我不这么认为。 只要你的脚本没有挂机,并且在/ var / log / mymodule中给出了编译失败的日志logging,那么你就不能做得更好。

3)请参阅1)在centos / RHEL / fedora上,vboxdrv从/etc/init.d/vboxdrv运行并检查分发名称,然后相应地获取一些脚本。 /etc/init.d是我想了解更多守护进程的第一个地方。 我很好。

这将取决于你的硬件是什么。

如果你这样做,一定要确保你的脚本在几秒钟内超时,否则你可能会有很多pipe理员想知道为什么在这个国家另一边的主机托pipe设备上有一台机器没有恢复内核升级后。

如果你的硬件对于引导过程(或许是一个networking适配器或USB驱动器)至关重要,那么它需要在更早的时候完成(可能新的内核被引导之前)。 否则,你会希望尽快完成,以确保编译器可能需要的networking安装的文件系统已经到位。 这也将有助于确保MTA正在运行,所以如果模块由于某种原因而无法构build,您的构build过程可以向root发送一封电子邮件。

此处详细介绍的dynamic内核模块支持(DKMS)允许您重新启动之前预先构build驱动程序。 Linux Journal有一篇文章“ Exploring DKMS ”,详细介绍了如何使用和configurationDKMS。

如果您可以在重新启动之前进行重build,您的信心就会上升,重新启动将会正确而迅速地进行。