Linux / Unix命令:insmod

Linux / Unix命令insmod在正在运行的内核中安装可加载模块insmod尝试通过解析内核导出的符号表中的所有符号将模块链接到正在运行的内核。

如果给出的模块文件名不带目录或扩展名, insmod将在一些常用的默认目录中搜索模块。 环境变量MODPATH可以用来覆盖这个默认值。 如果存在诸如/etc/modules.conf的模块配置文件,它将覆盖MODPATH中定义的路径。

环境变量MODULECONF也可用于从默认的/etc/modules.conf (或/etc/conf.modules (不建议使用))中选择不同的配置文件。 这个环境变量将覆盖上面的所有定义。

当设置环境变量UNAME_MACHINE时 ,modutils将使用它的值而不是uname()系统调用中的机器字段。 这主要是在32位用户空间中编译64位模块时使用,反之亦然,请将UNAME_MACHINE设置为模块的类型。 目前的modutils不支持模块的完全交叉构建模式,它仅限于在32位和64位版本的主机体系结构之间进行选择。

选项

-e persist_name ,-- persist = persist_name

指定模块的任何持久性数据在加载时被读取的位置,并在模块的此实例化被卸载时被写入。 如果模块没有持久数据,则此选项将被忽略。 如果此选项存在,则只有insmod读取持久性数据,默认情况下, insmod不处理持久性数据。

作为一个简写形式-e“” (一个空字符串)被insmod解释为modules.conf中定义的persistdir的值,后面跟随该模块相对于模块搜索路径找到的文件名,减去任何尾随“.gz”,“.o”或“.mod”。 如果modules.conf指定“ persistdir = ”(即persistdir是一个空字段),那么这个简写形式将被忽略。 (请参阅modules.conf (5)。)

-f ,-- force

即使运行内核的版本和编译模块的内核版本不匹配,也要尝试加载模块。 这只会覆盖内核版本检查,它对符号名称检查没有影响。 如果模块中的符号名称与内核不匹配,则无法强制insmod加载模块。

-h , - 帮助

显示选项摘要并立即退出。

-k ,-- autoclean

在模块上设置自动清除标志。 这个标志将被kerneld (8)用来删除在一段时间内没有被使用的模块 - 通常是一分钟。

-L , -

使用flock (2)来防止同一模块同时加载。

-m ,-- map

在标准输出上输出负载映射,使得在内核恐慌时调试模块变得更加容易。

-n ,-- noload

虚拟运行,除了将模块加载到内核之外,其它的事情都会完成。 如果由-m-O请求,则运行将生成一个映射或blob文件。 由于该模块未加载,所以真正的内核加载地址是未知的,因此映射和blob文件基于任意加载地址0x12340000。

-o module_name ,-- name = module_name

显式命名模块,而不是从源对象文件的基本名称派生名称。

-O blob_name ,-- blob = blob_name

将二进制对象保存在blob_name中 。 结果是一个二进制blob(没有ELF头文件),显示了在部分操作和重定位之后加载到内核的内容。 选项-m建议获取对象的映射。

-p ,-- probe

探测模块以查看它是否可以成功加载 。 这包括在模块路径中查找目标文件,检查版本号和解析符号。 它不会检查重定位,也不会生成地图或Blob文件。

-P 前缀 ,-- prefix = 前缀

此选项可与SMP或bigmem内核的版本化模块一起使用,因为这些模块在其符号名称中添加了额外的前缀。 如果内核是用符号版本构建的,那么insmod会自动从“get_module_symbol”或“inter_module_get”的定义中提取前缀,其中一个必须存在于支持模块的任何内核中。 如果内核没有符号版本,但模块是用符号版本构建的,那么用户必须提供-P

-q , - 安静

不要打印任何未解决符号的列表。 不要抱怨版本不匹配。 这个问题只会反映在insmod的退出状态中。

-r-

一些用户在非root用户标识下编译模块,然后以root身份安装模块。 即使模块目录由root拥有,此进程也可以让非root用户标识拥有的模块。 如果非根用户标识符受到攻击,入侵者可以覆盖该用户标识符拥有的现有模块,并使用此公开权限引导至根用户访问权限。

默认情况下,modutils将拒绝尝试使用不属于root的模块。 指定-r将切换检查并允许root加载不属于root的模块。 注意:配置modutils时,可以更改根检查的默认值。

在配置时使用-r禁用根检查或将默认设置为“无根检查”是主要的安全风险,不建议使用。

-s- syslog

将所有内容输出到syslog (3)而不是终端。

-S , - 冰淇淋

强制加载的模块具有kallsyms数据,即使内核不支持它。 此选项适用于内核加载时没有kallsyms数据的小型系统,但所选模块需要使用kallsyms进行调试。 这个选项是Red Hat Linux的默认选项。

-v ,-- verbose

详细。

-V ,-- version

显示insmod的版本。

-X ,-- export ; -x--noexport

请勿分别导出模块的所有外部符号。 默认值是为了导出符号。 此选项仅在模块未明确导出其自己的受控符号表时才有效,因此不推荐使用。

-Y ,-- ksymoops ; -y , - noksymoops

请不要将ksymoops符号添加到ksyms。 如果在这个模块中有Oops,这些符号被ksymoops用来提供更好的调试。 缺省是为了定义ksymoops符号。 该选项独立于-X / -x选项。

ksymoops符号为每个加载的模块添加大约260个字节。 除非你真的缺乏内核空间,并且试图将ksyms降低到最小尺寸,否则采用默认值并获得更准确的Oops调试。 ksymoops符号是保存持久模块数据所必需的。

-N- 仅限数字

只能根据内核版本检查模块版本的数字部分,即在决定模块是否属于内核时忽略EXTRAVERSION。 该标志自动设置为内核2.5以上,对于较早的内核是可选的。

模块参数

一些模块接受加载时间参数来定制它们的操作。 这些参数通常是I / O端口和IRQ号码,因机器而异,无法通过硬件来确定。

在为2.0系列内核构建的模块中,任何整数或字符指针符号可被视为参数并进行修改。 从2.1系列内核开始,符号被显式地标记为参数,以便只有特定的值可以被改变。 此外,提供类型信息用于检查加载时提供的值。

在整数的情况下,所有的值都可以是十进制,八进制或十六进制的a C:17,021或0x11。 数组元素是用逗号分隔的指定序列。 元素可以通过省略值来跳过。

在2.0系列模块中,不以数字开头的值被视为字符串。 从2.1开始,参数的类型信息指示是否将该值解释为字符串。 如果该值以双引号( )开头,则该字符串被解释为C,转义序列和全部。请注意,从shell提示符处,引号本身可能需要受到shell解释的保护。

GPL授权模块和符号

从内核2.4.10开始,模块应该有一个使用MODULE_LICENSE()定义的许可字符串。 有几个字符串被认为是GPL兼容的; 任何其他许可证字符串或无许可证都意味着该模块被视为专有。

如果内核支持/ proc / sys / kernel / tainted标志,那么在加载没有GPL许可证的模块时, insmod会将受污染的标志或'1'或OR。 如果内核支持篡改并且模块在没有许可证的情况下加载,则会发出警告。 对于具有不兼容GPL的MODULE_LICENSE()的模块,即使在不支持污染的旧内核上也会发出警告。 当旧的内核使用新的modutils时,这可以最大限度地减少警告。

insmod -f (强制)模式将在内核上使用'2'或污染标志来支持污点。 它总是发出警告。

有些内核开发人员要求通过代码导出的符号只能由具有GPL兼容许可证的模块使用。 这些符号由EXPORT_SYMBOL_GPL导出,而不是通常的EXPORT_SYMBOL 。 内核和其他模块导出的仅GPL符号仅对具有GPL兼容许可证的模块可见,这些符号出现在/ proc / ksysy中,前缀为“ GPLONLY_ ”。 在加载GPL授权模块时, insmod忽略符号上的GPLONLY_前缀,因此该模块只引用正常的符号名称,而没有前缀。 没有GPL兼容许可证的模块不提供GPL唯一符号,这包括完全没有许可证的模块。

Ksymoops协助

为了在使用模块时帮助调试内核Oops, insmod默认将某些符号添加到ksyms中,请参阅-Y选项。 这些符号以__insmod_modulename_开头 。 需要modulename才能使符号具有唯一性。 在不同的模块名称下多次加载相同的对象是合法的。 目前,定义的符号是:

__insmod_modulename_Oobjectfile_Mmtime_Vversion

objectfile是该对象从中加载的文件的名称。 这确保ksymoops可以将代码与正确的对象相匹配。 mtime是十六进制文件中最后修改的时间戳,如果统计失败,则为零。 版本是模块编译的内核版本,如果没有版本可用,则为-1。 _O符号具有与模块头相同的起始地址。

__insmod_modulename_Ssectionname_Llength

此符号出现在所选ELF部分的开头,当前为.text,.rodata,.data,.bss和.sbss。 只有在该部分的大小不为零时才会显示。 sectionname是ELF节的名称, length是十进制节的长度。 这些符号有助于ksymoops在没有符号可用时将地址映射到节。

__insmod_modulename_Ppersistent_filename

只有当模块具有一个或多个标记为持久数据的参数和一个用于保存持久数据文件名时,才由insmod创建(请参见上面的-e )。

在模块中调试内核Oops的另一个问题是/ proc / ksyms/ proc / modules的内容可能会在Oops和处理日志文件之间发生变化。 为了帮助解决这个问题,如果目录/ var / log / ksymoops存在,那么insmodrmmod会自动将/ proc / ksyms/ proc / modules复制到/ var / log / ksymoops前缀为'date +%Y%m %d%H%M%S`。 系统管理员可以在调试Oops时告诉ksymoops使用哪些快照文件。 没有开关来禁用此自动副本。 如果你不想让它发生,不要创建/ var / log / ksymoops 。 如果该目录存在,它应该由root拥有,并且是644或600模式,你应该每天运行这个脚本。 下面的脚本安装为insmod_ksymoops_clean

基本信息要知道

名称

insmod - 安装可加载的内核模块

概要

insmod [-fhkLmnpqrsSvVxXyYN] [-e persist_name ] [-o module_name ] [-O blob_name ] [-P 前缀 ] 模块 [ symbol = value ...]