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

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

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

  1. 编译并安装当前的14.04.05-LTS 内核(v4.4.19):

    CONFIG_MODULE_COMPRESS=y
    CONFIG_MODULE_COMPRESS_XZ=y
    

    安装后,我现在可以看到一堆.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+

到目前为止有效的方法:

  • 对未压缩模块(如 DKMS 构建的模块)进行任意操作:

    $ modinfo nvidia_370
    filename:       /lib/modules/4.4.19-37.56+/updates/dkms/nvidia_370.ko
    […]
    
  • 按完整路径显示压缩模块:

    modinfo /lib/modules/4.4.19-37.56+/kernel/fs/jfs/jfs.ko.xz
    
  • 通过完整路径加载没有(缺少)依赖项的压缩模块:

    insmod /lib/modules/4.4.19-37.56+/kernel/fs/jfs/jfs.ko.xz
    
  • 卸载此类模块:

    rmmod jfs
    

什么不起作用:

  • 卸载时用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+
    

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

我认为内核模块目录不知何故没有拾取压缩模块文件。如何通过名称加载压缩的内核模块modprobe

答案1

你需要跑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.

答案2

需要A德普莫德利兹玛支持映射和允许加载 .xz 压缩的内核模块

一些德普莫德船没有它,所以你可能需要一个由自定义构建标志制作的二进制文件,例如--with-xz

相关内容