目前我知道有两种方式来实现开机自动加载驱动模块,一种是将驱动模块放到 /lib/modules/uname -r/ 中,然后在修改 /etc 下的 modules 等文件;另一种是编写开启自启脚本,将驱动安装等操作放入其中。本文主要介绍第一种。

不使用开机自启脚本

1. 将驱动文件复制到内核驱动目录

/lib/modules/uname -r/kernel/driver 下存放了内核的所有驱动模块,要想让系统能自动找到我们的驱动,我们需要将自己的驱动模块放到该目录下(驱动放到 /lib/modules/uname -r/ 下的任意目录,都可以被系统找到)。uname -r 是当的内核版本,不同内核版本有各自的内核目录。

在这里插入图片描述

2. 使用命令 depmod -a (非必要)

depmod 命令用于分析可载入模块的相依性,-a 参数的作用是探测所有的模块。我所用的驱动文件没有其他依赖项(有些驱动存在依赖项,必须先加载其他驱动后才能进行安装),所以可以不调用 depmod 命令。
在这里插入图片描述

3. 将模块设置为自动加载

这里介绍两种方式将模块设置为自动加载(其实差不多),第一种:在 /etc/modules-hoad.d/ 目录下创建一个 xxx.conf(名字任意)文件,在里面添加我们要加载的驱动名(一个驱动占一行)。

在这里插入图片描述

第二种和第一种类似, /etc/modules-hoad.d/ 目录下已经有了一个 modules.conf 文件,在文件的最后面添加我们要加载的驱动。这是一个软链接文件,所以我们直接操作 /etc/modules 也是可以的。

在这里插入图片描述

4. 重启验证

上述操作完成后,重启系统,使用 lsmodcat /proc/modules 命令查看驱动是否已经加载。

在这里插入图片描述


make install 一步安装

虽然我经常会用到 make install 来安装一些驱动,但我一直没去了解它的执行原理,找一些现成的 Makefile 文件分析了一下,发现其实也挺简单的,下面的总结仅供参考。

之前我们要通过三步来将其设置为开机自动加载,但如果要将这个驱动安装在多台机器上且同时要进行自动加载呢?这时我们可能会想到将上述操作写入一个脚本,每台机器都执行一次。但不要忘了我们有一个现成的 “脚本”—— make 工具。

在我们的 Makefile 文件中添加 install 选项,将上文介绍的三大步骤一一写入。

install (指定下图的第 12 行)是一个命令,它的作用和 cp 很相似,都是将文件复制到另一个文件,但 cp 会先清空原文件再写入新文件,而 install 会先删除原文件再写入新文件。(Makefile 中尽量用 install 命令)

第三步新建并写入 xxx.conf 文件时,最好使用 >> (追加)的方式写入我们的驱动名,特别是我们的目标文件为 modules.conf 时(不过 modules.conf 默认也是空的)。

在这里插入图片描述

修改完 Makefile 后 ,使用 make install 进行安装(要使用 root 权限,不过 make 一般不需要用到 root 权限)。这样我们就能通过一个命令实现驱动的自动加载了。

在这里插入图片描述

开机自启脚本

开机自启脚本不仅可以实现驱动自动安装,还可以实现其他任意操作,特别是在驱动频繁更新的情况下,可以在脚本中重新编译和加载驱动模块。

ubuntu 支持很多种开机自启方式,在 ubuntu 16.04 版本下,我最常用到的是 initd 方式(18.04 后的版本已经不再支持了),简单介绍一下步骤:

  1. 编写一个脚本 xxx.sh,设置可执行权限
  2. 将脚本复制或链接到 /etc/init.d/ 目录下
  3. 使用 update-rc.d xxx.sh defaults 99 (99 可改成其他数值,表示脚本的启动优先级)

当然还有 /etc/rc.local 的方式,直接在该脚本中添加我们还要执行的操作即可。

如果是 Ubuntu 18.04 及以上的版本,就只能使用 systemd 的方式实现脚本开机自启,不再支持 initd。详情可以参考我之前写的一篇文章:Ubuntu 20.04 设置开机自启脚本

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐