内核模块管理和编译
单内核体系设计、但充分借鉴了微内核设计体系的优点,为内核引入模块化机制
内核组成部分:
kernel:内核核心,一般为bzImage,通常在/boot目录下
名称为 vmlinuz-VERSION-RELEASE
kernel object:内核对象,一般放置于
/lib/modules/VERSION-RELEASE/
辅助文件:ramdisk
initrd
initramfs
内核版本
运行中的内核:
uname命令:
uname – print system information
uname [OPTION]…
-n: 显示节点名称
-r: 显示VERSION-RELEASE
-a:显示所有信息
内核模块命令
lsmod命令:
- 显示由核心已经装载的内核模块
- 显示的内容来自于: /proc/modules文件
modinfo命令:
功能:管理内核模块
配置文件:/etc/modprobe.conf, /etc/modprobe.d/*.conf
- 显示模块的详细描述信息
modinfo [ -k kernel ] [ modulename|filename... ]
常用选项:
-n:只显示模块文件路径
-p:显示模块参数
-a:作者
-d:描述
范例:
lsmod |grep xfs
modinfo xfs
- 装载或卸载内核模块
modprobe [ -C config-file ] [ modulename ] [ module parame-ters... ] modprobe [ -r ] modulename…
depmod命令:内核模块依赖关系文件及系统信息映射文件的生成工具
insmod命令:指定模块文件,不自动解决依赖模块
insmod [ filename ] [ module options... ]
范例:
insmod modinfo –n exportfs lnsmod modinfo –n xfs
rmmod命令:卸载模块
rmmod [ modulename ]
范例:
rmmod xfs
rmmod exportfs
编译内核
编译安装内核准备:
(1) 准备好开发环境
(2) 获取目标主机上硬件设备的相关信息
(3) 获取目标主机系统功能的相关信息,例如:需要启用相应的文件系统
(4) 获取内核源代码包, www.kernel.org
编译准备
目标主机硬件设备相关信息
CPU:
cat /proc/cpuinfo
x86info -a
lscpu
PCI设备:lspci -v ,-vv
[root@centos8 ~]#lspci
00:00.0 Host bridge: Intel Corporation 440BX/ZX/DX - 82443BX/ZX/DX Host bridge (rev 01)
00:01.0 PCI bridge: Intel Corporation 440BX/ZX/DX - 82443BX/ZX/DX AGP bridge (rev 01)
00:07.0 ISA bridge: Intel Corporation 82371AB/EB/MB PIIX4 ISA (rev 08)
00:07.1 IDE interface: Intel Corporation 82371AB/EB/MB PIIX4 IDE (rev 01)
00:07.3 Bridge: Intel Corporation 82371AB/EB/MB PIIX4 ACPI (rev 08)
00:07.7 System peripheral: VMware Virtual Machine Communication Interface (rev 10)
00:0f.0 VGA compatible controller: VMware SVGA II Adapter
00:10.0 SCSI storage controller: Broadcom / LSI 53c1030 PCI-X Fusion-MPT Dual Ultra320 SCSI (rev 01)
00:11.0 PCI bridge: VMware PCI bridge (rev 02)
00:15.0 PCI bridge: VMware PCI Express Root Port (rev 01)
00:15.1 PCI bridge: VMware PCI Express Root Port (rev 01)
USB设备:lsusb -v,-vv
[root@centos8 ~]#dnf install usbutils -y
[root@centos8 ~]#lsusb
Bus 001 Device 004: ID 0951:1666 Kingston Technology DataTraveler 100 G3/G4/SE9 G2
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 003: ID 0e0f:0002 VMware, Inc. Virtual USB Hub
Bus 002 Device 002: ID 0e0f:0003 VMware, Inc. Virtual Mouse
Bus 002 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
[root@centos8 ~]#lsmod |grep usb
usb_storage 73728 1 uas
lsblk 块设备
全部硬件设备信息:hal-device:CentOS 6
开发环境相关包
gcc make ncurses-devel flex bison openssl-devel elfutils-libelf-devel
内核编译安装实现
- 下载源码文件
- 准备文本配置文件/boot/.config
- make menuconfig:配置内核选项
- make [-j #] 或者用以下两步实现:
make -j # bzImage
make -j # modules
- 安装模块:make modules_install
- 安装内核相关文件:make install
- 安装bzImage为 /boot/vmlinuz-VERSION-RELEASE
- 生成initramfs文件
- 编辑grub的配置文件
编译安装内核实战案例
[root@centos8 ~]#yum install gcc make ncurses-devel flex bison openssl-devel elfutils-libelf-devel
[root@centos8 ~]#tar xf linux-5.4.13.tar.xz -C /usr/src
[root@centos8 ~]#cd /usr/src
[root@centos8 ~]#ln -sv linux-5.4.13 linux
[root@centos8 ~]#cd /usr/src/linux
[root@centos8 ~]#cp /boot/config-$(uname -r) ./.config
[root@centos8 ~]#vim .config
# CONFIG_MODULE_SIG is not set
CONFIG_SYSTEM_TRUSTED_KEYS=""
# CONFIG_DEBUG_INFO is not set
[root@centos8 ~]#make help
[root@centos8 ~]#make menuconfig
[root@centos8 ~]#make -j 2 或者 make -j 2 bzImage ; make -j 2 modules
[root@centos8 ~]#make modules_install
[root@centos8 ~]#make install
[root@centos8 ~]#reboot
内核编译说明
- 配置内核选项
支持“更新”模式进行配置:make help
(a) make config:基于命令行以遍历的方式配置内核中可配置的每个选项
(b) make menuconfig:基于curses的文本窗口界面
(c) make gconfig:基于GTK (GNOME)环境窗口界面
(d) make xconfig:基于QT(KDE)环境的窗口界面 支持“全新配置”模式进行配置
(a) make defconfig:基于内核为目标平台提供的“默认”配置进行配置
(b) make allyesconfig: 所有选项均回答为“yes“
(c) make allnoconfig: 所有选项均回答为“no“ - 编译内核
- 全编译:
make [-j #]
- 编译内核的一部分功能:
(a) 只编译某子目录中的相关代码cd /usr/src/linux; make dir/
(b) 只编译一个特定的模块
cd /usr/src/linux; make dir/file.ko
范例:只为e1000编译驱动:
make drivers/net/ethernet/intel/e1000/e1000.ko
- 全编译:
3 交叉编译内核
编译的目标平台与当前平台不相同
make ARCH=arch_name
要获取特定目标平台的使用帮助
make ARCH=arch_name help
示例:
make ARCH=arm help
4 重新编译需要事先清理操作
make clean:清理大多数编译生成的文件,但会保留config文件等
make mrproper: 清理所有编译生成的文件、config及某些备份文件
make distclean:mrproper、清理patches以及编辑器备份文件
卸载内核
- 删除/lib/modules/目录下不需要的内核库文件
- 删除/usr/src/linux/目录下不需要的内核源码
- 删除/boot目录下启动的内核和内核映像文件
- 更改grub的配置文件,删除不需要的内核启动列表 grub2-mkconfig -o /boot/grub2/grub.cfg
- CentOS 8 还需要删除 /boot/loader/entries/5b85fc7444b240a992c42ce2a9f65db5-新内核版本.conf