需要新功能的支持:
在生产环境中,突然会需要使用一些新的功能,但是原有的内核并不支持此功能,这是就需要重新编译出一个新的内核来提供对此新功能的支持,比如虚拟化、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的版本
本次编译的源码版本为
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的方法):
5.使用make menuconfig 命令进行菜单化界面来选择内核功能:
左右箭头键:用来移动选择最下面的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 追加内核版本
[*] Automatically append version information to the version string 自动追加版本号
DOS/FAT/NT Filesystems ---> 核心层支持NTFS 文件系统格式读写
都选择好核心功能后,记得选择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内生成对应的内核相关文件
模块目录也会生成/lib/modules/4.14.12Hunk-2018v1.0
#cat /boot/grub2/grub.cfg
menuentry 'CentOS Linux (4.14.12Hunk-2018v1.0) 7 (Core)'
8.检查无误后,重启以便使用新内核
#uname -r
4.14.12hunk-2018-1.0
至此,内核编译安装成功。
编译中的一些选择
?全编译: make [-j #]
?编译内核的一部分功能:
(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
原文:http://blog.51cto.com/191226139/2059117