为什么要编译内核

需要新功能的支持:

在生产环境中,突然会需要使用一些新的功能,但是原有的内核并不支持此功能,这是就需要重新编译出一个新的内核来提供对此新功能的支持,比如虚拟化、iptables功能必须要在2.4.X以上版本的内核中才支持。


原核心太过于臃肿:

原来安装的内核中,有很多不常用甚至基本上用不到的功能支持,而这些功能又会使内核文件变得很大,这时要将此变成一个简化切功能够用的内核就需要进行重新编译。


与硬件搭配的稳定性:

很多情况下,系统内核中默认一般默认支持的CPU类型为Inter,但在其它厂商,如AMD或者是较新的CPU硬件上使用此系统,可能就不能很好的支持,且不稳定。因此就需要重新编译内核来支持最新的硬件驱动。


其它特殊需求:

linux除了在pc机上运行,当然也能支持一些其它设备,比如嵌入式的APM、智能手机等,这时或许就要进行重新编译支持的CPU架构来支持这些特殊需求。

总结一点:kernel的作业就是所需要的硬件支持,因此在此基础上只加需要的功能,来实现内核文件的短小精干。


实验环境:VMware Workstation Pro 14(试用版)

系统平台:

CentOS Linux release 7.4.1708 (Core)       内核  3.10.0-693.el7.x86_64


步骤如下:

内核源码官网,请下载标记为stable的版本

https://www.kernel.org/

本次编译的源码版本为

stable:

4.14.12

2018-01-05


1.准备编译环境

a.至少准备10GB的磁盘剩余空间

b.# yum -y groups install "Development Tools"
# yum -y install ncurses-devel elfutils-libelf-devel bc openssl-devel.x86_64


2.解压源码包

#tar xvf linux-4.14.12.tar.xz

源码包解压后的大小为979M


3.在当前已经安装的系统中的/boot目录下存在一个名为conf-xxx 的文件,那个文件其实就是核心功能列表选择文件,如

-rw-r--r--.  1 root root   140894 Aug 22 17:21 config-3.10.0-693.el7.x86_64
copy当前系统内核中的config-xxx文件到需要编译的内核目录下。这一步不是必须的,可以用来参考之前系统的内核选项。
#cp config-3.10.0-693.el7.x86_64 /kernel/linux-4.14.12


4.所有操作均在源码编译目录内进行

#cd /kernel/linux-4.14.12/


编码内核选择界面(生成.config的方法):

make help

支持更新模式进行配置

make menuconfig

基于curses的文本窗口界面

make gconfig

基于GTK(GOME)环境窗口界面

make xconfig

基于QT(KDE) 环境的窗口界面

make oldconfig

透过已经存在的./.config文件内容,

并使用该文件内设定值为默认值,

只将新版本核心的新功能列出让用户选择,

可以简化核心功能挑选过程。对与升级内核很好选择。

make defconfig

基于内核为目标平台执行提供的“默认”配置进行配置

make allyesconfig

所有选项均回答为”yes”

make allnoconfig

所有选项均回答为”no”

make mrproper

清理所有编译生成的文件、 config及某些备份文件

make clean

清理大多数编译生成的文件,但会保留config文件等

make distclean

mrproper、 patches以及编辑器备份文件


5.使用make menuconfig

centos7编译arm程序 centos7 编译内核_linux

centos7编译arm程序 centos7 编译内核_操作系统_02

centos7编译arm程序 centos7 编译内核_linux

centos7编译arm程序 centos7 编译内核_centos7编译arm程序_04

左右箭头键:用来移动选择最下面的select、exit、help、save、load几个按钮

上下箭头键:可移动上面的菜单来选中对应的功能选项,选项后与--> 表示内部有子菜单需要选择。

选定项目:使用上下键选择设定的项目,并使用左右键选择select按钮,然后按回车就可进入项目中 的子菜单选择。

挑选功能:在项目的功能名称前面,有 [ ]或者 < > 才可以使用 空格键

挑选说明:

[ ]: 不编译此项

[M]: 表示编译成模块,也就是存放在/lib/modules/内核版本号/

< * > [ * ] : 表示编译进核心,也就是/boot下的vmlinuz-内核版本号 文件

功能选择的建议:

核心一定要的功能,直接编译进核心内;

可能以后会用到的功能,尽量编译成模块;


离开选择项:左右键选择Exit按回车即可


一些编译项目如下:

[*] 64-bit kernel                                
General setup  --->             基本的linux核心功能,最相关的驱动程序、版本说明 核心说明代码
[*] Enable loadable module support  --->         模块加载和卸载
-*- Enable the block layer --->                 块设备的支持
Processor type and features  --->            处理器类型和其功能选择
Power management and ACPI options  --->      电源管理和ACPI选项
Bus options (PCI etc.)  --->                 总线选项和PCI插槽
 Executable file formats / Emulations --->   编译后执行档的格式
[*] Networking support  --->           核心网络功能
Device Drivers  --->                 设备驱动
Firmware Drivers  --->
File systems --->                           文件系统的支持
Kernel hacking  --->
Security options  --->                 安全相关模块
-*- Cryptographic API  --->
[*] Virtualization  --->
Library routines --->


这里以编译2个功能为演示

(Hunk-2018v1.0) Local version - append to kernel release 追加内核版本
[*]
DOS/FAT/NT Filesystems

centos7编译arm程序 centos7 编译内核_linux

都选择好核心功能后,记得选择SAVE保存


6.编译

要想快一点,可以查询当前系统CPU有几个核

#lscpu
CPU(s):                4


为了防止意外发生,开启一个screen窗口,命令功能请自行man

#screen -S kernel
#make -j 4

编译好之后的源码目录为9.8G

#make -j 4 modules


7.编译后安装

#make modules_install
#make install

安装好之后,会在/boot内生成对应的内核相关文件

centos7编译arm程序 centos7 编译内核_linux

centos7编译arm程序 centos7 编译内核_linux_07

模块目录也会生成/lib/modules/4.14.12Hunk-2018v1.0

centos7编译arm程序 centos7 编译内核_linux

centos7编译arm程序 centos7 编译内核_centos7编译arm程序_09

#cat /boot/grub2/grub.cfg
menuentry 'CentOS Linux (4.14.12Hunk-2018v1.0) 7 (Core)'


8.检查无误后,重启以便使用新内核

centos7编译arm程序 centos7 编译内核_linux

centos7编译arm程序 centos7 编译内核_运维_11

#uname -r
4.14.12hunk-2018-1.0

至此,内核编译安装成功。


编译中的一些选择

全编译:

编译内核的一部分功能:

(a) 只编译某子目录中的相关代码

进入源码文件夹内

# make dir/

(b) 只编译一个特定的模块

cd /usr/src/linux
# make dir/file.ko

例如:只为e1000编译驱动:

# make drivers/net/ethernet/intel/e1000/e1000.ko


卸载内核

 删除/lib/modules/目录下不需要的内核库文件

#rm -rf 4.14.12hunk-2018-1.0/

 删除源码目录

 删除/boot目录下启动的内核和内核映像文件

#rm *-4*
rm: remove regular file ‘initramfs-4.14.12hunk-2018-1.0.img’? y
rm: remove regular file ‘initramfs-4.14.12hunk-2018-1.0.img.gz’? y
rm: remove regular file ‘System.map-4.14.12hunk-2018-1.0’? y
rm: remove regular file ‘vmlinuz-4.14.12hunk-2018-1.0’? y

 更改grub的配置文件,删除不需要的内核启动列表

# vim /boot/grub2/grub.cfg






本文转自 ljpwinxp 51CTO博客,原文链接:http://blog.51cto.com/191226139/2059117