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_name
指定在加载时读取模块的任何持久数据的位置,并在卸载模块的实例化时将其写入。如果模块没有持久数据,则会以静默方式忽略此选项。持久数据只能读取insmod的 如果存在此选项,则默认情况下insmod的 不处理持久数据。
作为简写形式,-e“” (空字符串)由。解释insmod的 作为的价值persistdir 如…中所定义的modules.conf,然后是相对于找到的模块搜索路径的模块的文件名,减去任何尾随的“.gz”,“。o”或“。mod”。如果的modules.conf 指定“persistdir =“(即persistdir 这是一个空字段,然后默默地忽略这个速记形式。 (看到的modules.conf (5).)
-F, - 力
即使正在运行的内核的版本和编译模块的内核版本不匹配,也尝试加载模块。这仅覆盖内核版本检查,它对符号名称检查没有影响。如果模块中的符号名称与内核不匹配,则无法强制执行insmod的 加载模块。
-H, - 救命
显示选项摘要并立即退出。
-k, - 自动清洁
在模块上设置自动清除标志。此标志将被使用核心程式(8)删除在某段时间内未使用的模块 - 通常为一分钟。
-L, - 锁
使用群(2)防止同一模块同时加载。
-m, - 地图
在stdout上输出加载映射,以便在发生内核混乱时更容易调试模块。
-n, - 空载
虚拟运行,除了将模块加载到内核之外,执行所有操作。如果要求-m 要么-O,运行将生成一个map或blob文件。由于未加载模块,因此实际内核加载地址未知,因此map和blob文件基于任意加载地址0x12340000。
-o MODULE_NAME , - 名称= MODULE_NAME
明确命名模块,而不是从源对象文件的基本名称派生名称。
-O blob_name , --blob= blob_name
保存二进制对象 blob_name 。结果是一个二进制blob(没有ELF头),显示了在部分操作和重定位之后加载到内核中的内容。选项-m 建议获取对象的地图。
-p, - 探测
探测模块以查看是否可以成功加载。这包括在模块路径中定位目标文件,检查版本号和解析符号。它不检查重定位,也不生成map或blob文件。
-P 字首 , - 字首= 字首
此选项可与SMP或bigmem内核的版本化模块一起使用,因为此类模块的符号名称中添加了额外的前缀。如果内核是用符号版本构建的话insmod的 将自动从“get_module_symbol”或“inter_module_get”的定义中提取前缀,其中一个必须存在于支持模块的任何内核中。如果内核没有符号版本,但模块是使用符号版本构建的,那么用户必须提供-P.
-q, - 安静
不要打印任何未解析的符号列表。不要抱怨版本不匹配。问题只会反映在退出状态insmod的.
-r, - 根
一些用户在非root用户标识下编译模块,然后以root身份安装模块。即使modules目录由root拥有,此进程也可以保留非root用户标识所拥有的模块。如果非root用户标识被泄露,则入侵者可以覆盖该用户标识所拥有的现有模块,并使用此公开来引导至root访问权限。
默认情况下,modutils将拒绝尝试使用不属于root的模块。指定 -r 将切换检查并允许root加载不归root所有的模块。
注意: 配置modutils时,可以更改root检查的默认值。在配置时使用-r禁用根检查或将默认设置为“无根检查”是一个主要的安全隐患,不建议使用。
-s, --syslog
输出所有内容系统日志(3)代替终端。
-S, --kallsyms
强制加载的模块具有kallsyms 数据,即使内核不支持它。此选项适用于没有加载内核的小型系统kallsyms 数据,但选定的模块需要kallsyms 用于调试。此选项是Red Hat Linux上的默认选项。
-v, --verbose
要冗长。
-V, - 版
显示版本insmod的.
-X, - 出口; -X, --noexport
分别导出和不导出所有模块的外部符号。默认值是要导出的符号。此选项仅在模块未显式导出其自己的受控符号表时才有效,因此不推荐使用。
-Y, --ksymoops; -y, --noksymoops
做和不做ksymoops的 符号到ksyms。这些符号用于ksymoops的 如果此模块中有Oops,则提供更好的调试。默认是为ksymoops的要定义的符号。此选项独立于-X/-X 选项。
ksymoops的 符号每个加载的模块添加大约260个字节。除非你真的缺少内核空间并试图将ksyms减少到最小大小,否则采用默认值并获得更准确的Oops调试。ksymoops的 保存持久模块数据需要符号。
-N, --numeric只
仅针对内核版本检查模块版本的数字部分,即在决定模块是否属于内核时忽略EXTRAVERSION。此标志自动为内核2.5开始设置,对于早期内核是可选的。
模块参数
某些模块接受加载时参数来自定义其操作。这些参数通常是I / O端口和IRQ编号,因机器而异,无法从硬件确定。
在为2.0系列内核构建的模块中,任何整数或字符指针符号都可以被视为参数并进行修改。从2.1系列内核开始,符号被明确标记为参数,以便只能更改特定值。此外,提供类型信息用于检查在加载时提供的值。
在整数的情况下,所有值可以是十进制,八进制或十六进制的a C:17,1021或0x11。数组元素是由逗号分隔的指定序列。省略该值可以跳过元素。
在2.0系列模块中,不以数字开头的值被视为字符串。从2.1开始,参数的类型信息指示是否将该值解释为字符串。如果值以双引号开头('),字符串被解释为C,转义序列和所有。请注意,在shell提示符下,可能需要保护引号本身不受shell解释的影响。
GPL许可模块和符号
从内核2.4.10开始,模块应具有使用定义的许可证字符串MODULE_LICENSE()。几个字符串被认为是GPL兼容的;任何其他许可证字符串或根本没有许可证意味着该模块被视为专有。
如果内核支持的/ proc / SYS /内核/污点 旗子然后insmod的 在没有GPL许可证的情况下加载模块时,或者将受污染的标志与“1”进行对比。如果内核支持污染并且在没有许可证的情况下加载模块,则会发出警告。始终对具有a的模块发出警告MODULE_LICENSE() 即使在不支持污染的旧内核上也不兼容GPL。当在较旧的内核上使用新的modutil时,这可以最大限度地减少警告。
insmod -f (强制)模式将OR支持污染的内核上的污点标记为“2”。它总是发出警告。
某些内核开发人员要求其代码导出的符号必须仅由具有GPL兼容许可证的模块使用。这些符号由。导出EXPORT_SYMBOL_GPL 而不是正常的EXPORT_SYMBOL。内核和其他模块导出的仅GPL符号仅对具有GPL兼容许可证的模块可见,这些符号出现在的/ proc / ksyms中 前缀为'GPLONLY_'. insmod的 忽略了GPLONLY_ 加载GPL许可模块时符号上的前缀,因此模块只引用正常的符号名称,不带前缀。没有GPL兼容许可证的模块不提供仅GPL符号,这包括完全没有许可证的模块。
Ksymoops援助
在使用模块时协助调试内核Oops,insmod的 默认为ksyms添加一些符号,请参阅-Y 选项。这些符号以__insmod_ modulename_ 。该 MODULENAME 需要使符号唯一。在不同的模块名称下多次加载同一个对象是合法的。目前,定义的符号是:
__insmod_ MODULENAME _ Oobjectfile _ MMTIME _ Vversion
objectfile 是从中加载对象的文件的名称。这确保了ksymoops可以将代码与正确的对象匹配。 修改时间 是十六进制文件中该文件的最后修改时间戳,如果stat失败,则为零。 版 是编译模块的内核版本,如果没有可用的版本,则为-1。该_O symbol与模块头具有相同的起始地址。
__insmod_ MODULENAME _ Ssectionname _ Llength
此符号出现在所选ELF部分的开头,目前为.text,.rodata,.data,.bss和.sbss。仅当该部分具有非零大小时才会出现。 sectionname 是ELF部分的名称, 长度 是十进制节的长度。当没有符号可用时,这些符号有助于ksymoops将地址映射到部分。
__insmod_ MODULENAME _Ppersistent_ 文件名
仅由。创建insmod的 如果模块有一个或多个标记为持久数据的参数和用于保存持久数据的文件名(请参阅-e,上面)是可用的。
在模块中调试内核Oops的另一个问题是/ proc / ksyms的内容 和 / proc / modules可以在Oops和处理日志文件之间进行更改。为了帮助解决这个问题,如果目录/ var / log / ksymoops存在则insmod的 和rmmod的 将自动将/ proc / ksyms和/ proc / modules复制到/ var / log / ksymoops,前缀为“date +%Y%m%d%H%M%S`。系统管理员可以告诉ksymoops在调试Oops时使用哪些快照文件。没有开关禁用此自动复制。如果您不希望它发生,请不要创建/ var / log / ksymoops。如果该目录存在,它应该由root拥有并且是模式644或600,并且您应该每天运行此脚本。下面的脚本安装为insmod_ksymoops_clean。
#!/ bin / sh的 #删除2天内未访问的已保存的ksyms和模块 如果-d / var / log / ksymoops 然后 设置-e #确保始终至少有一个版本 d =`日期+%Y%m%d%H%M%S` cp -a / proc / ksyms /var/log/ksymoops/${d}.ksyms cp -a / proc / modules /var/log/ksymoops/${d}.modules find / var / log / ksymoops -type f -atime +2 -exec rm {} ; 科幻 名称 insmod的 - 安装可加载的内核模块 概要 insmod的 -fhkLmnpqrsSvVxXyYN -e persist_name -o MODULE_NAME -O blob_name -P 字首 模 符号= 值 … 要了解的基本信息