我想在我的系统上使用 LZMA 压缩的内核模块。不幸的是,Canoncial 在内核和用户空间工具中都禁用了该功能。这是我到目前为止所做的:
编译并安装当前的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/
。kmod_22
将软件包从 Xenial (16.04)反向移植到配置了该--with-xz
选项的 Trusty (14.04)。这似乎也有效。跑步
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