如何在 Ubuntu 中加载压缩的内核模块?

Dav*_*ter 5 ubuntu compression kernel-modules

我想在我的系统上使用 LZMA 压缩的内核模块。不幸的是,Canoncial 在内核和用户空间工具中都禁用了该功能。这是我到目前为止所做的:

  1. 使用以下命令编译并安装当前的14.04.05-LTS 内核(v4.4.19):

    CONFIG_MODULE_COMPRESS=y
    CONFIG_MODULE_COMPRESS_XZ=y
    
    Run Code Online (Sandbox Code Playgroud)

    安装后,我现在可以.ko.xz/lib/modules/4.4.19-37.56+/kernel/.

  2. kmod_22包从 Xenial (16.04) 向后移植到配置了该--with-xz选项的Trusty (14.04) 。这似乎也有效。

  3. 运行update-initrams -u -k 4.4.19-37.56+

到目前为止有效的方法:

什么不起作用:

  • 卸载与modprobe -r

  • 任何其他只有包名但没有路径的操作,例如:

    # insmod jfs
    insmod: ERROR: could not load module jfs: No such file or directory
    # modprobe jfs
    modprobe: FATAL: Module jfs not found in directory /lib/modules/4.4.19-37.56+
    
    Run Code Online (Sandbox Code Playgroud)

因此,对于没有依赖项的模块,例如jfs有一种变通方法,我可以将完整的模块文件路径指定为insmod,但这既烦人又不会执行像modprobe.

我想内核模块目录不知何故不会选择压缩的模块文件。如何按名称加载压缩的内核模块modprobe

hee*_*ayl 5

你需要跑depmod

depmod(默认情况下)读取 下的模块/lib/modules/$(uname -r),找到它们导出的符号以及它们自己需要的符号,然后使用这些信息创建模块之间的符号(模块)依赖关系,并将其保存在文件中,并/lib/modules/$(uname -r)/modules.dep创建一个二进制哈希/lib/modules/$(uname -r)/modules.dep.bin

它还创建了另外两个文件:

  • /lib/modules/$(uname -r)/modules.symbols(并且它是二进制哈希/lib/modules/$(uname -r)/modules.dep.bin):包含每个模块导出的符号

  • /lib/modules/$(uname -r)/modules.devname:包含/dev需要为必要模块创建的条目,包含模块名称、/dev条目名称以及主、次编号

请注意,您还可以depmod针对特定内核版本或特定模块运行,请检查man depmod.