Kernel
先介绍下Kernel是什么,Kernel为操作系统的核心,提供多种功能,例如操作系统上的进程管理,文件系统,硬件驱动,网络功能,安全功能...都是由Kernel控制的.
Kernel的设计流派:
单内核设计:所有的功能融为一个进程,各种功能以线程的方式运作,优点在于集中管理,效率高;缺点为某一线程故障,整个Kernel故障,典型应用为Linux.
微内核设计:所有的功能单独运转,效率低,单功能故障不会影响全局.典型应用Windows,Solaris.
Kernel的特点:
① 支持模块化,虽然Linux为单内核设计,但是Linux支持将各种功能做成模块,例如核心文件(基本功能),网络功能,硬件驱动...
模块文件存放位置为: /lib/modules/2.6.18-194.el5/kernel/*.ko
②支持模块的动态装载功能,各种功能模块可以等用到时再装载,极为高效.
Kernel的组成部分:
①核心文件: /boot/vmlinuz - Kernel_Verion - RPM_version
[root@el5 kernel]# ls /boot/vmlinuz-2.6.18-194.el5
②模块文件: /lib/modules/Kernel_Version - RPM_Version.OS/
[root@el5 kernel]# ls /lib/modules/2.6.18-194.el5/
③RAMDISK: 辅助文件,Kernel加载rootfs(用户空间)时需要识别分区,文件系统,使用此文件虚拟成硬盘或者文件系统,让Kernel能正常加载rootfs
CentOS5: /boot/initrd-*
CentOS6,7:/boot/initramfs-*
ramdisk文件生成,此文件必须要匹配内核版本:
为当前系统内核版本生产ramdisk文件:
]# dracut ~/ramdisk $(uname -r)
内核模块管理:
lsmod //查看当前运行内核已加载的模块
[root@EL6 linux]# lsmod Module Size Used by #分别为模块名 模块大小 模块被引用数 被谁引用 rt3290sta 1251347 0 ppdev 8537 0 parport_pc 22690 0 lp 9242 0 |
modinfo module_name //查看模块信息
modinfo -n module_name //查看模块位置
modinfo -k kernel_version module_name //查看指定内核版本的信息
[root@EL6 linux]# modinfo xfs filename: /lib/modules/2.6.32-431.el6.x86_64/kernel/fs/xfs/xfs.ko license: GPL description: SGI XFS with ACLs, security attributes, large block/inode numbers, no debug enabled author: Silicon Graphics, Inc. srcversion: 6AF9EC31B1CDA34E78FB85F depends: exportfs vermagic: 2.6.32-431.el6.x86_64 SMP mod_unload modversions |
modprobe [-r] module_name //装载或卸载模块
[root@EL6 src]# modprobe -r xfs //卸载模块 [root@EL6 src]# modprobe xfs //装载模块 |
insmod /path/to/module_name //强制装载内核,ins为insert的缩写
rmod /path/to/module_name //强制卸载内核
特殊目录: /proc /sys
/proc 伪文件系统,该目录存放内核在运行中的信息与一部分可控制参数,通过此目录可调整内核的一些可修改参数(大部分在/proc/sys目录下).
修改内核参数的两种方式:
1) 使用echo命令将值重定向到/proc目录(伪文件系统不可直接编辑)
echo “EL6” >/proc/sys/kernel/hostname
2) 使用sysctl命令控制:
因为/proc目录可修改的参数大概都在sys目录下,所以sysctl命令把sys目录作为根.前面的/proc/sys目录省略,”/”以”.”代替, 例如:
修改/proc/sys/kernel/hostname的值为 “EL6”
sysctl kernel.hostname = EL6
sysctl -a 查看所有内核选项
sysctl -p 根据配置文件重读一遍(/etc/sysctl.conf),修改配置文件永久生效
/sys 伪文件系统,该目录用于存放内核设备的硬件信息,udev通过此目录中的信息为设备在/dev/目录下动态创建设备文件.
编译内核:
准备工作:
1) 准备好编译环境
Centos6 安装包组: “Server Platform Development “ ,“ Development Tools ”
2) 获取目标主机上的硬件设备相关信息
3) 获取目标系统需要的内核功能信息
4) 获取内核源码包, (www.kernel.org)
比较方便的方法就是找个配置模板进行编译安装,Centos6在/boot目录提供模板config文件.
~]# tar -Jxvf linux-4.16.1.tar.xz -C /usr/src/linux #将源码包解压
~]# cd /usr/src/linux
linux]# make mrproper #删除所有之前编译的内容 linux]# make menuconfig #选定内核功能,如果报错,根据提示安装提示包 根据需求勾选功能即可, [*] 把功能内建到Kernel [M]把功能编译成模块 <>不启用
linux]# make -j 10 #开始编译,-j 10 表示启用10线程,根据cpu决定使用线程数 linux]# make install_modules #安装模块,创建相应位置的链接文件(库,模块) linux]# make install #安装内核,initramfs,grub
|
选择内核功能的方式:
现有模板,以更新方式选择内核功能:
make config 以文本方式遍历内核的所有功能
make menuconfig 基于curses的文本窗口界面显示
make gconfig 基于gtk图形开发环境的图形界面显示(gnome)
make xconfig 基于QT图形开发环境的图形界面显示(KDE)
make oldconfig 基于旧的config文件进行编译
make localmodconfig 基于现操作系统已装载的内核模块进行编译
基于新配置进行编译
make defconfig 内核根据目标平台提供默认配置
make allnoconfig 所有功能都不选
如何只编译一部分功能:
cd /usr/src/linux #进入源码树
make dir/file.ko #只编译一个模块
make dir/ #编译一个目录
make install_modules #如果只是一个模块,复制到(/lib/modules/version/下,使用modprobe装载)
make install #安装
例如: make net/ #编译网卡功能,编译net目录下所有模块
如何夸平台编译(目标平台与当前平台不同):
make ARCH=ARCH_NAME
如何再次编译,主要工作在于清理之前的编译结果:
make clean #删除目标编译结果,保存配置文件与自己打的补丁
make mrproper #删除所有编译结果+config+various backup
make disclean #mrproper + 编译器备份