By Tyumen(fengjie.zhou)
安装4.10.8版本内核
这里大家先装一版内核,然后后面再做一版内核,循序渐进,主要遵循如下流程:
下面我们先安装一个内核,并且使用新内核
通过rpm包安装内核
我们直接通过rpm包安装内核(devel是develop的意思,是开发包,比较常用所以装上)
修改内核4.10.8启动
vi /boot/grub2/grub.cfg #编辑内核启动引导文件
terminal_output console
if [ x$feature_timeout_style = xy ] ; then
set timeout_style=menu
set default=0 #添加的内容行
set timeout=5
# Fallback normal timeout code in case the timeout_style feature is
# unavailable.
else
set default=0 #添加的内容行
set timeout=5
fi
然后重启设备:reboot
,系统起来之后执行uname -ra
查看内核版本
创建内核编译环境
为了尽量减少在测试过程中对系统带来影响,因此使用普通用户做rpm包
当前我们就具备了内核编译的spec文件和编译用户了,如下安装一下依赖工具并编译.
安装依赖编译rpm包
此步骤执行完毕,我们就有自己的编译完的内核rpm包了,然后执行前面的安装流程即可
内核源代码目录说明
/arch:目录包括了所有和体系结构相关的核心代码。它下面的每一个子目录都代表一种Linux支持的体系结构
/block:块设备驱动程序I/O调度。
/crypto:常用加密和散列算法(如AES,SHA等),还有一些压缩和CRC校验算法。
/documentation:目录下是一些文档,没有内核代码,可惜都是English的,是对每个目录作用的具体说明。
/drivers:目录中是系统中所有的设备驱动程序。它又进一步划分成几类设备驱动,每一种有对应的子目录
/firmware:保存用于驱动第三方设备的固件
/fs:目录存放Linux支持的文件系统代码和各种类型的文件操作代码。每一个子目录支持一个文件系统,如ext3文件系统对应的就是ext3子目录
/include:目录包括编译核心所需要的大部分头文件,例如与平台相关的头文件在/include/linux子目录下
/init:目录包含核心的初始化代码(不是系统的引导代码),有main.c和Version.c两个文件。这是研究核心如何工作的好起点。
/ipc:目录包含了核心进程间的通信代码。
/Kernel:内核管理的核心代码,此目录下的文件实现了大多数linux系统的内核函数,其中最重要的文件当属sched.c
/lib:目录包含了核心的库代码,不过与处理器结构相关的库代码被放在/arch/*/lib/目录下。
/mm:目录包含了所有独立于 cpu 体系结构的内存管理代码,如页式存储管理内存的分配和释放等。
/net:目录里是核心的网络部分代码,实现了各种常见的网络协议,其每个子目录对应于网络的一个方面。
/scripts:目录包含用于配置核心的脚本文件等
/security:主要包含SELinux模块。
/sound:ALSA,OSS音频设备的驱动核心代码和常用设备驱动。
/tools:一些常用工具,如性能剖析、自测试等
/usr:实现了用于打包和压缩的cpio等。 /virt:提供虚拟机技术(KVM等)的支持
内核config参数
4.10.11内核版本编译
可以参考:https://kernelnewbies.org/KernelBuild
wget https://cdn.kernel.org/pub/linux/kernel/v4.x/linux-4.10.11.tar.xz
tar xvf linux-10.11.tar.xz -C /usr/src/
make mrproper
//注意:make clean 删除大多数的编译生成文件, 但是会保留内核的配置文件.config, 还有足够的编译支持来建立扩展模块
make mrproper 删除所有的编译生成文件, 还有内核配置文件, 再加上各种备份文件
make distclean mrproper删除的文件, 加上编辑备份文件和一些补丁文件。cp /boot/config-`uname -r` .config
修改选择模块make menuconfig
yum install gcc ncurses-devel
//安装编译包make
或者make -j8
//-j8是指定并发make modules_install install
//安装,也可以在这将这步改成make rpm
生成rpm包然后装rpm包内核模块挂载使用
这里以常用的tcp模块westwood为例(未编译进内核,以module方式已经存在)
modprobe westwood
//挂载westwood模块,可以通过lsmod|grep westwood查看这个模块是否挂载了sysctl -w net.ipv4.tcp_congestion_control=westwood
//应用westwood模块,可以通过sysctl net.ipv4.tcp_congestion_control查看当前的参数reno是最基本的拥塞控制算法,也是TCP协议的实验原型; bic适用于丢包极为罕见的情况,比如北美和欧洲之间的线路,这是2.6.8到2.6.18之间的Linux内核的默认算法; cubic是修改版的bic,适用环境比bic广泛一点,它是2.6.19之后的linux内核的默认算法; hybla适用于高延时、高丢包率的网络,比如卫星链路——同样适用于中美之间的链路。 westwood采用和Reno相同的慢启动算法、拥塞避免算法。 westwood的主要改进方面:在发送端做带宽估计,当探测到丢包时,根据带宽值来设置拥塞窗口、慢启动阈值
自编译内核模块
(只编译模块)
wget http://software.sinocache.net:7070/NGAA_Kernel/kernel_module_demo.tar.gz
tar zxvf kernel_module_demo.tar.gz
cd kernel_module_demo
make
#注意,Makefile里面指定内核对include头文件,这里使用4.10.10insmod hello.ko
#lssmod|grep hello
tac /var/log/message|headrmmod hello
#tac /var/log/message|head编译模块集成到内核源码中,后续待补充
内核模块开发
待补充