识别树外模块?

识别树外模块?

我正在尝试升级并测试内核3.12

识别在测试之前应删除的树外模块的最有效方法是什么?

提到了一些(vitualbox、nvidia、fglrx、bcmwl),但是有没有办法识别被视为树外的已安装模块?

答案1

内核模块,无论是树内还是树外,都安装在特定于给定内核版本 ( /lib/modules/$(uname -r)) 的目录中,因此您不需要清理模块来升级到新内核:新内核根本不会考虑旧模块。

尽管如此,据我所知,树内模块进入/lib/modules/$(uname -r)/kernel,因此/lib/modules/$(uname -r)之外的任何内容都是树外模块。

答案2

发现之后Ubuntu 维基我正在使用的是指外部模块,通过rtfm更容易找到解决方案。

外部模块安装路径汇总

  • 外部模块默认安装在modules_installat/lib/modules/$(KERNELRELEASE)/extra/上。
  • 当在其他地方安装外部模块时,INSTALL_MOD_PATH用于安装路径的前缀,或INSTALL_MOD_DIR用于在常用/lib/modules/$(KERNELRELEASE)路径下创建新目录。

请参阅此答案的底部以获取更详细的解释。

搜索外部模块

为了将搜索范围缩小到上面的范围,我使用locate打印包含lib/modulexargs的路径过滤输出非目录的路径。

最后,grep -v用于过滤以 开头的路径的输出/lib/modules/$(uname -r)/kernel。这仍应显示INSTALL_MOD_PATH安装期间使用的前缀路径,例如/frodo/lib/modules/$(KERNELRELEASE)/kernel/

这显然不会打印以某种方式安装在完全奇怪的路径中的模块的路径。这是命令:

locate --null "*lib/modules/$(uname -r)*" | xargs -r0 sh -c 'for i do [ -d "$i" ] && printf "%s\n" "$i"; done' sh {} + | grep -v "^/lib/modules/$(uname -r)/kernel\|^/lib/modules/$(uname -r)$\|^/lib/modules/$(uname -r)/build$\|^/lib/modules/$(uname -r)/initrd$"

这会从输出中修剪树内路径,对我来说,仅使用locate "*lib/modules/$(uname -r)*".现在输出要少得多,并且应该只显示已知的树外路径:

/frodo/lib/modules/3.12.3-031203-generic
/frodo/lib/modules/3.12.3-031203-generic/kernel

摘自文档构建外部模块

以下详细信息来自构建外部模块

modules_install
    Install the external module(s). The default location is
    /lib/modules/<kernel_release>/extra/, but a prefix may
    be added with INSTALL_MOD_PATH (discussed in section 5).  

=== 5. Module Installation

Modules which are included in the kernel are installed in the
directory:

    /lib/modules/$(KERNELRELEASE)/kernel/

And external modules are installed in:

    /lib/modules/$(KERNELRELEASE)/extra/

--- 5.1 INSTALL_MOD_PATH

    Above are the default directories but as always some level of
    customization is possible. A prefix can be added to the
    installation path using the variable INSTALL_MOD_PATH:

        $ make INSTALL_MOD_PATH=/frodo modules_install
        => Install dir: /frodo/lib/modules/$(KERNELRELEASE)/kernel/

    INSTALL_MOD_PATH may be set as an ordinary shell variable or,
    as shown above, can be specified on the command line when
    calling "make." This has effect when installing both in-tree
    and out-of-tree modules.

--- 5.2 INSTALL_MOD_DIR

    External modules are by default installed to a directory under
    /lib/modules/$(KERNELRELEASE)/extra/, but you may wish to
    locate modules for a specific functionality in a separate
    directory. For this purpose, use INSTALL_MOD_DIR to specify an
    alternative name to "extra."

        $ make INSTALL_MOD_DIR=gandalf -C $KDIR \
               M=$PWD modules_install
        => Install dir: /lib/modules/$(KERNELRELEASE)/gandalf/

相关内容