这个简短的指南解释了什么是 Linux内核模块, 如何使用列出当前加载的内核模块 lsmod
,以及如何显示 Linux 内核模块信息 modinfo
Linux 中的命令。
内容
什么是Linux内核模块?
Linux 内核是 GNU/Linux 操作系统的主要组件。 Linux 内核的功能可以扩展,而无需重新启动系统使用 内核模块. 内核模块是一段代码,可以根据需要加载和卸载到内核中。
内核模块的一些示例是固件和设备驱动程序,它们允许 Linux 内核访问和控制连接到系统的硬件。 通常,内核模块用于添加对新硬件的支持(作为设备驱动程序),和/或 文件系统, 或添加 系统调用.
如果没有内核模块,我们每次需要新功能时都必须重新构建和重新启动内核。 我们还需要构建更大的单片内核,并在没有内核模块的情况下直接将新功能添加到内核映像中。 在内核模块的帮助下,我们可以简单地避免这些问题。
内核模块通常存放在 Modules are stored in /usr/lib/modules/<kernel_release_directory>
.
$ ls /usr/lib/modules/5.11.18-300.fc34.x86_64/ bls.conf modules.builtin.bin modules.symbols build modules.builtin.modinfo modules.symbols.bin config modules.dep source extra modules.dep.bin symvers.gz kernel modules.devname System.map modules.alias modules.drm updates modules.alias.bin modules.modesetting vdso modules.block modules.networking vmlinuz modules.builtin modules.order weak-updates modules.builtin.alias.bin modules.softdep
内核模块在不同的操作系统中有不同的名称。 例如,内核模块在 FreeBSD 中称为内核可加载模块 (kld),在 macOS 中称为内核扩展 (kext),在 AIX 中称为内核扩展模块,在 Windows NT 中称为内核模式驱动程序,在 VxWorks 中称为可下载内核模块 (DKM)。 它们也称为内核可加载模块(或 KLM),简称为内核模块 (KMOD)。
使用 lsmod 命令列出 Linux 内核模块
我们可以使用以下命令查看当前加载到内核中的内核模块列表 lsmod
(列出模块)命令如下:
$ lsmod
示例输出:
Module Size Used by vhost_net 32768 0 vhost 57344 1 vhost_net vhost_iotlb 16384 1 vhost tap 28672 1 vhost_net tun 57344 1 vhost_net rfcomm 90112 4 snd_seq_dummy 16384 0 snd_hrtimer 16384 1 xt_CHECKSUM 16384 1 xt_MASQUERADE 20480 3 xt_conntrack 16384 1 ipt_REJECT 16384 2 nf_nat_tftp 16384 0 nf_conntrack_tftp 20480 3 nf_nat_tftp bridge 290816 0 stp 16384 1 bridge llc 16384 2 bridge,stp ccm 20480 6 nft_objref 16384 2 nf_conntrack_netbios_ns 16384 1 nf_conntrack_broadcast 16384 1 nf_conntrack_netbios_ns nft_fib_inet 16384 1 [...]
lsmod 命令从文件中获取当前加载的内核模块的详细信息 /proc/modules
.
希望您对什么是 Linux 内核模块以及如何在 Linux 内核中列出当前加载的模块有基本的了解。 让我们继续前进,看看如何查看特定内核模块的详细信息。
使用 modinfo 命令显示 Linux 内核模块信息
这 modinfo
命令显示给定内核模块的详细信息。 默认情况下,它以以下形式列出内核模块的属性 fieldname : value
,方便阅读。
显示一个 Linux Kernel 模块的信息,例如 88XXau
, 哪一个是 TP-Link AC600 (Archer T2U Nano) 无线适配器, 跑:
$ modinfo 88XXau
示例输出:
filename: /lib/modules/5.11.18-300.fc34.x86_64/extra/88XXau.ko.xz version: v5.6.4.2_35491.20191025 author: Realtek Semiconductor Corp. description: Realtek Wireless Lan Driver license: GPL srcversion: 4EC0EE17404B8E38B323235 alias: usb:v7392pB611ddcdscdpiciscipin alias: usb:v7392pA813ddcdscdpiciscipin alias: usb:v7392pA812ddcdscdpiciscipin alias: usb:v7392pA811ddcdscdpiciscipin alias: usb:v3823p6249ddcdscdpiciscipin alias: usb:v2357p0122ddcdscdpiciscipin alias: usb:v2357p0120ddcdscdpiciscipin [...]
不要附加一个 .ko
扩展到内核模块名称的末尾。 因为内核模块名称没有扩展名,但它们对应的文件有。
显示内核模块的某些细节
当您在没有任何选项的情况下运行 modinfo 时,它会显示有关给定内核模块的大量信息。 您可以通过仅显示特定字段来缩小结果范围,例如 author
, description
, license
, parm
, depends
, 和 alias
. 以下命令显示每个字段的详细信息 88XXau
模块。
1. 显示内核模块作者(供应商)
要查看谁编写了内核模块,请使用 author
旗帜。
$ modinfo -F author 88XXau
Realtek Semiconductor Corp.
2. 显示内核模块说明
要打印内核模块的描述,请使用 description
旗帜。
$ modinfo -F description 88XXau
Realtek Wireless Lan Driver
3. 显示内核模块许可证
当您想知道固件和驱动程序是开源还是闭源时,了解内核模块的许可证可能会很有用。 默认情况下,某些 Linux 发行版可能包含非免费驱动程序。 您可以通过检查随附的许可证来验证设备驱动器是免费还是非免费。
$ modinfo -F license 88XXau
GPL
大多数内核模块都获得许可 GPL
(GNU 公共许可证)。 例如,一些模块可能具有双重许可证 BSD
和 GPL
.
$ modinfo -F license zram Dual BSD/GPL
4. 显示内核模块参数
要查看内核模块的参数,请运行:
$ modinfo -F parm 88XXau rtw_wireless_mode: (int) rtw_monitor_overwrite_seqnum:Overwrite the sequence number of injected frames (int) rtw_monitor_retransmit:Retransmit injected frames (int) rtw_monitor_disable_1m:Disable default 1Mbps rate for monitor injected frames (int) rtw_ips_mode:The default IPS mode (int) rtw_lps_level:The default LPS level (int) [...]
5. 显示内核模块依赖
要查看内核模块的依赖关系,请运行:
$ modinfo -F depends 88XXau
cfg80211
您还可以使用 –a/--author
, -d/--description
, -l/--license
, -p/--parameters
显示内核模块的特定细节的标志。 这些只是捷径 --field
标志的作者、描述、许可和参数。 例如,您可以使用 -l
或者 --license
标志以查看内核模块的许可证。
$ modinfo -l kvm
或者,
$ modinfo --license kvm
以上命令等价于以下命令:
$ modinfo -F license kvm
有关更多详细信息 modinfo
命令,查看其手册页。
$ man modinfo
希望这可以帮助。
相关阅读:
- 从命令行列出或检查所有已安装的 Linux 内核
- 使用 Kmon 管理和监控 Linux 内核模块
内核模块LinuxLinux 命令Linux howtoLinux KernellsmodModinfo