什么是Linux模块?
内核模块是根据需要加载和卸载到内核中的代码块,从而扩展了内核的功能,而不需要重新启动。事实上,除非用户使用以下命令查询模块lsmod,他们可能不知道有什么变化。
有一件重要的事情需要理解,那就是有很多模块将在任何时候你的Linux系统上使用,并且可以的很多细节都可以,如果你很想潜入细节。
使用lsmod的主要方法之一是在系统不能正常工作时检查模块。但是,大多数时候,模块是按需要加载的,用户不需要知道它们是如何工作的。
清单模块
列出模块的最简单方法是使用lsmod命令。虽然这个命令提供了很多细节,但这是最用户友好的输出。
$ lsmod的模块大小由snd_hda_codec_realtek二手114688 1 snd_hda_codec_generic 77824 1 snd_hda_codec_realtek ledtrig_audio 16384 2 snd_hda_codec_generic,snd_hda_codec_realtek snd_hda_codec_hdmi 53248 1 snd_hda_intel 40960 2 snd_hda_codec 131072 4 snd_hda_codec_generic,snd_hda_codec_hdmi,snd_hda_intel,snd_hda_codec_realtek snd_hda_core 86016 5 snd_hda_codec_generic,snd_hda_codec_hdmi,snd_hda_intel,snd_hda_codec,snd_hda_codec_realtek snd_hwdep 20480 1snd_hda_codec snd_pcm 102400 4 snd_hda_codec_hdmi,snd_hda_intel,snd_hda_codec,snd_hda _Core snd_seq_midi 20480 0 snd_seq_midi_event 16384 1 snd_seq_midi dcdbas 20480 0 snd_rawmidi 36864 1个snd_seq_midi snd_seq 69632 2 snd_seq_midi,snd_seq_midi_event coretemp 20480 0 snd_seq_device 16384 3 snd_seq,snd_seq_midi,snd_rawmidi snd_timer 36864 2 snd_seq,snd_pcm kvm_intel241664个0 KVM 626688个1个kvm_intel RADEON 1454080 10 irqbypass 16384 1 KVM joydev 24576个0 16384 input_leds 0 TTM 102400 1 RADEON drm_kms_helper 180224 1个RADEON DRM 475136 13 drm_kms_helper,RADEON,TTM SND 81920 15 snd_hda_codec_generic,snd_seq,snd_seq_device,snd_hda _codec_hdmi,snd_hwdep,snd_hda_intel,snd_hda_codec,SND _hda_codec_realtek,snd_timer,snd_pcm,snd_rawmidi i2c_algo_bit 16384 1 RADEON fb_sys_fops 16384 1个drm_kms_helper syscopyarea 16384 1个drm_kms_helper serio_raw 20480 0 sysfillrect 16384 1 drm_kms_helpersysimgblt 16384 1 drm_kms_helper声音核心16384 1 SND mac_hid 16384 0 sch_fq_codel 20480 2 parport_pc 40960 0 ppdev 24576 0 LP 20480 0 parport 53248 3 parport_pc,LP,ppdev ip_tables都是28672个0 x_tables 40960个1 ip_tables都是autofs4 45056 2 RAID10 57344 0 raid456 155648 0 async_raid6_recov 24576 1raid456 async_memcpy 20480个2 raid456,async_raid6_recov async_pq 24576个2 raid456,async_raid6_recov async_xor 20480 3 async_pq,raid456,async_raid6_recov async_tx 20480 5 async_pq,async_memcpy,async_xor,raid456,async_raid6_re COV XOR 24576 1 async_xor raid6_pq 114688 3 async_pq,raid456,async_raid6_recov libcrc32c 16384 1个raid456RAID1 45056 0 24576 RAID0 0多路径20480 0 20480线性0 hid_generic 16384 0 psmouse 151552 0 i2c_i801 32768 0 16384 pata_acpi 0 lpc_ich 24576 0 53248 USBHID 0 HID 126976 2 USBHID,hid_generic E1000E 245760 0软盘81920 0
在上面的输出中:
- “模块”显示每个模块的名称
- “大小”显示模块的大小(它不使用多少内存)
- “Used by”显示每个模块的使用计数和引用模块
显然,这是一个很多的模块。加载取决于您的系统和配送,什么对模块数量的运行。我们可以这样算来:
$ lsmod | wc -l 67
要查看系统上可用模块的数量(不仅仅是运行),请尝试以下命令:
$ modprobe -c | wc -l 41272
用于检查模块的其他命令
Linux提供了几个命令,用于列出、加载和卸载、检查和检查模块的状态。
- depmod——生成modules.dep和map文件
- insmod——一个将模块插入Linux内核的简单程序
- lsmod——显示Linux内核中模块的状态
- modinfo——显示关于Linux内核模块的信息
- modprobe的 - 从Linux内核中添加和删除模块
- rmmod的 - 一个简单的程序从Linux内核删除模块
列出内建的模块
如前所述,lsmod命令是模块列表最方便的命令。有,但是,其他的方法来检查它们。该modules.builtin文件列出了编译进内核,并试图将这些模块的负载一个时所采用modprobe的所有模块。注意$(使用uname -r)在下面的命令提供了内核版本的名称。
$ more /lib/modules/$(uname -r)/modules。内置|头-10内核/arch/x86/crypto/crc32c-intel。ko内核/ arch / x86 /事件/英特尔/ intel-uncore。ko内核/ arch / x86 /平台/英特尔/ iosf_mbi。内核/ mm / zpool ko。内核/ mm / zbud ko。内核/ mm / zsmalloc ko。内核/ fs / binfmt_script ko。内核/ fs / mbcache ko。ko内核/ fs / configfs / configfs。ko内核/ fs /加密/ fscrypto.ko
属性可以获得关于模块的更多详细信息modinfo命令,尽管没有任何内容可以简单地解释模块提供的服务。下面输出中省略的细节包括一个冗长的签名。
$ modinfo软盘|头-16文件名:/lib/modules/5.0.0-13通用/内核/驱动程序/块/软盘。ko别名:block-major-2-*许可:GPL作者:Alain L. Knaff srcversion: EBEAA26742DF61790588FD9别名:acpi*:PNP0700:*别名:pnp:dPNP0700*取决于:retpoline: Y intree: Y name: Y name: floppy vermagic: 5.0.0-13通用SMP mod_unload sig_id: PKCS#7签名者:sig_key: sig_hashalgo: md4
您可以加载或使用卸载模块modprobe命令。使用命令类似下面,你可以找到与特定模块相关联的内核对象:
$ find /lib/modules/$(uname -r) -name floppy* /lib/modules/5.0.0-13-generic/kernel/drivers/block/flopp .ko
如果你需要加载模块,你可以使用这样的命令:
$ sudo modprobe软盘
总结
显然,模块的加载和卸载是一个大问题。与使用通用内核相比,它使Linux系统更加灵活和高效。它还意味着您可以在不重启的情况下进行重大更改(包括添加硬件)。