在开机过程中,核心的工作是驱动主机的硬件设备。核心一般在压缩文件,因此在使用核心之前,需要将其解压缩后载入内存。目前核心都是具有可读取模块化驱动程序的功能,也就是模块化。

核心与核心模块路径( 3.10.0-1160.45.1.el7.x86_64为版本号):

  • 核心: /boot/vmlinuz 或 /boot/vmlinuz-3.10.0-1160.45.1.el7.x86_64;
  • 核心解压缩所需 RAM Disk: /boot/initramfs.img (/boot/initramfs-3.10.0-1160.45.1.el7.x86_64.img);
  • 核心模块:/lib/modules/3.10.0-1160.45.1.el7.x86_64/kernel/;
  • 核心源代码: /usr/src/linux 或 /usr/src/kernels/ (需要自行安装);
  • 核心版本: /proc/version;
  • 系统核心功能: /proc/sys/kernel/

核心模块与相依性

核心模块目录:

# ls /lib/modules/3.10.0-1160.45.1.el7.x86_64/kernel/
arch  crypto  drivers  fs  kernel  lib  mm  net  sound  virt
  • arch:与硬件平台有关的项目,例如 CPU 的等级等等;
  • crypto:核心所支持的加密的技术,例如 md5 或者是 des 等等;
  • drivers:一些硬件的驱动程序,例如显卡、网卡、PCI 相关硬件等等;
  • fs :核心所支持的 filesystems ,例如 vfat, reiserfs, nfs 等等;
  • lib:一些函数库;
  • net:与网络有关的各项协定数据,还有防火墙模块 (net/ipv4/netfilter/*) 等等;
  • sound:与音效有关的各项模块;
  • mm:与内存单元有关的各项数据,包括swap与虚拟内存等;
  • kernel:定义核内核程序、内核状态、线程、调度(schedule)、信号(signle) 等;
  • virt:与虚拟化有关的信息,目前内核支持的是KVM

 /lib/modules/$(uname -r)/modules.dep文件记录了在核心支持的模块的各项相依性。创建该文件命令:

# depmod [-Ane]
选项与参数:
-A  :不加任何参数时, depmod 会主动的去分析目前核心的模块,并且重新写入
      /lib/modules/$(uname -r)/modules.dep 当中。若加入 -A 参数时,则 depmod
      会去搜寻比 modules.dep 内还要新的模块,如果真找到新模块,才会更新。
-n  :不写入 modules.dep ,而是将结果输出到屏幕上(standard out);
-e  :显示出目前已载入的不可执行的模块名称

例如新增一个网络驱动程序,更新系统核心相依性:

# cp 驱动文件 /lib/modules/$(uname -r)/kernel/drivers/net
# depmod

核心模块的观察

# lsmod
Module                  Size  Used by
nf_nat_ftp             12809  0 
nf_conntrack_ftp       18478  1 nf_nat_ftp
ip6t_rpfilter          12595  1 
ip6t_REJECT            12625  2 
nf_reject_ipv6         13717  1 ip6t_REJECT
ipt_REJECT             12541  2 
......

上面的查询信息显示了:模块名,模块大小,模块是否被其他模块使用

# modinfo [-adln] [module_name|filename]
选项与参数:
-a  :仅列出作者名称;
-d  :仅列出该 modules 的说明 (description);
-l  :仅列出授权 (license);
-n  :仅列出该模块的详细路径。
# modinfo drm
filename:       /lib/modules/3.10.0-1160.45.1.el7.x86_64/kernel/drivers/gpu/drm/drm.ko.xz
license:        GPL and additional rights
description:    DRM shared core routines
author:         Gareth Hughes, Leif Delgass, José Fonseca, Jon Smirl
license:        GPL and additional rights
description:    DRM bridge infrastructure
author:         Ajay Kumar <[email protected]>
retpoline:      Y
rhelversion:    7.9
srcversion:     4BE38BB1EE6D7E3B095A7C4
depends:        drm_panel_orientation_quirks
intree:         Y
vermagic:       3.10.0-1160.45.1.el7.x86_64 SMP mod_unload modversions 
signer:         CentOS Linux kernel signing key
sig_key:        F5:EF:E0:5F:FF:E7:34:59:FB:55:F6:1B:3A:BD:2F:18:1F:8E:51:A0
sig_hashalgo:   sha256
parm:           edid_firmware:Do not probe monitor, use specified EDID blob from built-in data or /lib/firmware instead.  (string)
parm:           vblankoffdelay:Delay until vblank irq auto-disable [msecs] (0: never disable, <0: disable immediately) (int)
parm:           timestamp_precision_usec:Max. error on timestamps [usecs] (int)
parm:           edid_fixup:Minimum number of valid EDID header bytes (0-8, default 6) (int)
parm:           debug:Enable debug output, where each bit enables a debug category.
		Bit 0 (0x01)  will enable CORE messages (drm core code)
		Bit 1 (0x02)  will enable DRIVER messages (drm controller code)
		Bit 2 (0x04)  will enable KMS messages (modesetting code)
		Bit 3 (0x08)  will enable PRIME messages (prime code)
		Bit 4 (0x10)  will enable ATOMIC messages (atomic code)
		Bit 5 (0x20)  will enable VBL messages (vblank code)
		Bit 7 (0x80)  will enable LEASE messages (leasing code)
		Bit 8 (0x100) will enable DP messages (displayport code) (int)

上面命令查询了drm模块的相关信息,modinfo除了查询在核心内的模块之外,也可以查询某个模块文件

核心模块的载入与移除

insmod载入模块

# insmod /lib/modules/3.10.0-1160.45.1.el7.x86_64/kernel/fs/fat/fat.ko.xz 
# lsmod|grep fat
\fat                    65950  0 

rmmod移除模块

# rmmod fat
# lsmod|grep fat

使用 insmod 与 rmmod 的问题是需要自行找到模块的完整文件名,而且当模块有相依属性的问题时,无法直接载入或移除该模块。

使用modprobe命令,不需要考虑模块相依性问题,因为他是从modules.dep读取记录,而且也不需要知道模块的详细路径。

# modprobe [-cfr] module_name
选项与参数:
-c  :列出目前系统所有的模块!(更详细的代号对应表)
-f  :强制载入该模块;
-r  :类似 rmmod ,就是移除某个模块啰~
# modprobe fat
# lsmod|grep fat
fat                    65950  0 
# modprobe -r fat
# lsmod|grep fat

安装内核源代码

# su wakamizu
$ mkdir -p ~/rpmbuild/{BUILD,BUILDROOT,RPMS,SOURCES,SPECS,SRPMS}
$ echo '%_topdir %(echo $HOME)/rpmbuild' > ~/.rpmmacros
# exit
# yum install rpm-build redhat-rpm-config asciidoc hmaccalc perl-ExtUtils-Embed pesign xmlto -y
# yum install audit-libs-devel binutils-devel elfutils-devel elfutils-libelf-devel -y
# yum install ncurses-devel newt-devel numactl-devel pciutils-devel python-devel zlib-devel -y
# yum install gcc bison java-devel python-docutils -y
$ su wakamizu
$ cd rpmbuild/SPECS/
$ rpmbuild -bp --target=$(uname -m) kernel.spec
$ ls  ~/rpmbuild/BUILD/kernel*/linux*/
arch   configs  CREDITS  Documentation  firmware  include  ipc     Kconfig  lib          Makefile        mm   README          samples  security  tools  virt
block  COPYING  crypto   drivers        fs        init     Kbuild  kernel   MAINTAINERS  Makefile.qlock  net  REPORTING-BUGS  scripts  sound     usr