侧边栏壁纸
Linux入门自学网博主等级

每日学一条Linux命令,终成Linux大神

  • 累计撰写 725 篇文章
  • 累计创建 143 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

Linux insmod命令详解:如何动态加载内核模块(附实例教程和注意事项)

Linux insmod命令介绍

insmod(英文全拼:install module)命令用于将模块插入到内核中。Linux有许多功能是通过模块的方式,在需要时才载入内核。这样可以使内核更加精简,提高效率,以及保持更大的灵活性。这类可载入的模块,通常是设备驱动程序或者文件系统。insmod命令可以在运行时动态地加载模块,扩展内核的功能。

Linux insmod命令适用的Linux版本

insmod命令适用于大多数的Linux发行版,如Ubuntu, Debian, Fedora, CentOS等。不过,insmod命令需要指定模块的完整路径和文件名,而且不会自动解决模块之间的依赖关系。因此,大多数用户会使用modprobe命令来代替insmod命令,因为modprobe命令可以根据配置文件自动查找和加载模块,以及处理模块的依赖关系。如果你想使用insmod命令,你需要先确保你的系统已经安装了module-init-tools或者kmod软件包,这些软件包提供了insmod和其他模块管理工具。你可以使用以下命令来检查和安装这些软件包:

# 在Ubuntu或Debian上
[linux@bashcommandnotfound.cn ~]$ sudo apt-get install kmod
# 在Fedora或CentOS上
[linux@bashcommandnotfound.cn ~]$ sudo yum install kmod
# 或者
[linux@bashcommandnotfound.cn ~]$ sudo dnf install kmod

Linux insmod命令的基本语法

insmod命令的基本语法格式如下:

insmod [filename] [module options...]

其中,filename是要加载的模块的文件名,通常是以.ko为后缀的内核对象文件。module options是可选的参数,用于指定模块的一些配置选项,例如设备号,缓冲区大小等。这些选项的格式是symbol=value,其中symbol是模块定义的符号名称,value是要赋给该符号的值。

Linux insmod命令的常用选项说明

insmod命令的常用选项如下表所示:

选项说明
-f强制加载模块,不检查内核版本和模块版本是否一致
-k将模块标记为自动卸载,当模块不再被使用时,可以使用rmmod命令卸载模块
-m输出模块的加载信息,包括模块名,大小,依赖等
-o指定模块的名称,可以使用模块文件的文件名或者自定义的名称
-p测试模块是否能正确地加载到内核,但不实际加载模块
-s将所有信息记录在系统日志文件中,可以使用dmesg命令查看日志
-v显示详细的信息,包括模块的符号表,段信息等
-x不导出模块的外部符号,这样其他模块就不能使用这些符号
-X导出模块的所有外部符号,这是默认的行为

Linux insmod命令的实例

以下是一些使用insmod命令的实例:

  • 加载模块

    # 加载当前目录下的hello.ko模块,该模块会在系统日志中打印一条消息
    [linux@bashcommandnotfound.cn ~]$ sudo insmod hello.ko
    # 使用dmesg命令查看系统日志,可以看到模块加载的消息
    [linux@bashcommandnotfound.cn ~]$ dmesg | tail
    [  123.456789] Hello, world!
    
  • 加载模块并指定模块选项

    # 加载当前目录下的geeks4geeks.ko模块,并指定user参数为"Mukkesh"
    [linux@bashcommandnotfound.cn ~]$ sudo insmod geeks4geeks.ko user="Mukkesh"
    # 使用dmesg命令查看系统日志,可以看到模块加载的消息,包含了user参数的值
    [linux@bashcommandnotfound.cn ~]$ dmesg | tail
    [  234.567890] Hello, Mukkesh!
    
  • 加载模块并指定模块名称

    # 加载当前目录下的hello.ko模块,并指定模块名称为greeting
    [linux@bashcommandnotfound.cn ~]$ sudo insmod -o greeting hello.ko
    # 使用lsmod命令查看已加载的模块,可以看到模块名称为greeting
    [linux@bashcommandnotfound.cn ~]$ lsmod | grep greeting
    greeting                16384  0
    
  • 加载模块并输出模块信息

    # 加载当前目录下的hello.ko模块,并输出模块信息
    [linux@bashcommandnotfound.cn ~]$ sudo insmod -m hello.ko
    insmod hello.ko $MODULE_INFO CRC: 0x12345678
    insmod hello.ko $MODULE_INFO vermagic: 5.10.0-8-amd64 SMP mod_unload modversions
    
  • 测试模块是否能正确加载

    # 测试当前目录下的hello.ko模块是否能正确加载,但不实际加载模块
    [linux@bashcommandnotfound.cn ~]$ sudo insmod -p hello.ko
    # 使用lsmod命令查看已加载的模块,可以看到没有hello模块
    [linux@bashcommandnotfound.cn ~]$ lsmod | grep hello
    

Linux insmod命令的注意事项

  • insmod命令需要root权限,所以一般需要使用sudo命令来执行。
  • insmod命令不会自动解决模块之间的依赖关系,所以如果一个模块依赖于另一个模块,需要先加载被依赖的模块,再加载依赖的模块。
  • insmod命令需要指定模块的完整路径和文件名,如果模块不在当前目录下,需要使用绝对路径或者相对路径来指定模块的位置。
  • 如果在执行insmod命令时出现bash: insmod: command not found的错误,说明系统没有安装module-init-tools或者kmod软件包,需要先安装这些软件包,然后再执行insmod命令。
0

评论区