一、内核设计体系

内核设计体系分为单内核、微内核;Linux属于单内核设计,但充分借鉴了微内核体系的设计的优点,为内核引入了模块化的机制,其内核的组成部分:
1、kernel:内核核心,一般为bzimage,通常位于/boot目录,名称为vmlinuz-VERSION-release
2、kernel object:内核对象,即内核模块,一般放置于/lib/modeules/VERSION-release
内核模块与内核核心一定要严格匹配;

二、编译前提

1)准备好开发环境
2)获取目标主机上硬件设备的相关信息
3)获取到目标主机系统功能的相关信息,例如要启用的文件系统
4)获取内核源代码包,www.kernel.org

三、编译环境

CentOS 6.7:
包组:
Development Tools
Server Platform Development
CentOS7:
包组:
Development Tools
Server Platform Development

四、内核编译过程

为防止在内核在编译过程中shell终端被意外终止掉,从导致编译进程被终止,我们可以使用screen工具可以防止这种情况的发生

screen命令:yum install -y screen
打开screen:# screen
拆除screen:# Ctrl+a,d
列出screen:# screen -ls
连接至screen:# screen -r SCREEN_ID
关闭screen:#exit
image.png
1、配置内核选项
支持“更新”模式进行配置:在已有的.config文件基础之上进行修改配置;
1)make config :基于命令行以遍历的方式去配置内核中可配置的每个选项
2)make menuconfig:基于cureses的文本配置窗口,包为ncurses-devel
3)make gconfig:基于GTK开发环境的窗口界面,包组“桌面平台开发”
4)make xconfig:基于QT开发环境的窗口界面
支持全新配置模式进行配置
1)make’ defconfig:基于内核为目标平台提供的“默认”配置为模版进行配置
2)make allnoconfig:所有选项均为“no”;
[ ]:N 不编译此模块
[M]:Module 编译为模块,但是不加载至内核
[*]:Y 编译进内核核心

2、编译
1)多线程编译:make [-j#]
2)编译内核中一部分功能代码:
a、只编译某子目录中的代码
# cd /usr/src/linux
# make path/to/dir
b、只编译一个特定的模块
# /usr/src/linux
# make path/to/file.ko
3)如何交叉编译:
编译的目标平台与当前操作的所在的平台不同;
# make ARCH=arch_name
要获取特定目标平台的使用帮助
# make ARCH=arch_name help
3、如何再执行过编译操作的内核源码树上做重新编译
清理前一次编译文件三种方式
# make clean 清理编译生成的绝大多数文件,但会保留config,以及编译外部模块需要的文件
# make mrproper:清理编译生成的所有文件,包括配置生成的config文件以及某些备份文件
# make distclean :相当于mrproper,额外清理各种pathes以及编辑器备份文件
4、步骤
# tar -vxf linux-3.16.83.tar.xz -C /usr/src/
# cd /usr/src
# ln -sv linux-3.16.83.tar.xz linux
# cd linux
# make menuconfig 配置内核选项
# make [-j#] 编译内核,可使用-j指定编译线程数量
# make modules_install 安装内核模块
# make intall 安装内核
重启系统,选择使用新内核即可

五、编译实例

1、将内核压缩文件上传至服务器并解压至指定目录
image.png
2、将解压的文件创建软链接
image.png
3、复制本机的内核配置文件至/usr/src/linux目录下
image.png
4、配置内核选项,在配置内核选项时,需要安装ncurses-devel工具
image.png
执行# make menuconfig 进入如下界面,可以自定义需要加载相关的模块、驱动等,比如
image.png
5、编译内核,-j可以指定编译核心数目
image.png
6、安装内核模块
# make modules_install
image.png
7、安装内核
# make intall
image.png

8、重启即可看到有多个内核可供选择
image.png
image.png