Dav*_*ter 5 ubuntu compression kernel-modules
我想在我的系统上使用 LZMA 压缩的内核模块。不幸的是,Canoncial 在内核和用户空间工具中都禁用了该功能。这是我到目前为止所做的:
使用以下命令编译并安装当前的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/.
将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
[…]
Run Code Online (Sandbox Code Playgroud)按完整路径显示压缩模块:
modinfo /lib/modules/4.4.19-37.56+/kernel/fs/jfs/jfs.ko.xz
Run Code Online (Sandbox Code Playgroud)通过完整路径加载没有(缺少)依赖项的压缩模块:
insmod /lib/modules/4.4.19-37.56+/kernel/fs/jfs/jfs.ko.xz
Run Code Online (Sandbox Code Playgroud)卸载这样的模块:
rmmod jfs
Run Code Online (Sandbox Code Playgroud)什么不起作用:
卸载与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?
你需要跑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.
| 归档时间: |
|
| 查看次数: |
7844 次 |
| 最近记录: |