CentOS7 内核编译
2017-12-08 本文已影响0人
茫子
CentOS 7 内核编译
本文是参考CentOS官网说明文件,详细内容请参考以下链接
https://wiki.centos.org/zh/HowTos/I_need_the_Kernel_Source 内核源码生成
https://wiki.centos.org/zh/HowTos/Custom_Kernel 内核编译
原理
内核编译需要正确版本的内核源码,以及正确的内核选项。
- CentOS7的内核源码是通过rpm包生成的,如果需要内核源码来进行编译,直接安装rpm是不行的,还得配置一下。
- 有了正确的内核源码后,需要通过正确生成内核的.config文件,这样才能正确编译rpm包
- 对了,CentOS7是通过kernel*.rpm包来更新内核的
生成可编译的内核源码
- 需要安装一些开发库
# yum install rpm-build redhat-rpm-config asciidoc hmaccalc perl-ExtUtils-Embed pesign xmlto
# yum install audit-libs-devel binutils-devel elfutils-devel elfutils-libelf-devel
# yum install ncurses-devel newt-devel numactl-devel pciutils-devel python-devel zlib-devel
- 切换用户
后续操作,使用非root用户进行后续操作,切记
- 在用户的home目录下创建一些目录,生成一些配置
$ mkdir -p ~/rpmbuild/{BUILD,BUILDROOT,RPMS,SOURCES,SPECS,SRPMS}
$ echo '%_topdir %(echo $HOME)/rpmbuild' > ~/.rpmmacros
4.安装源码组件,kernel-xxxxxxxxx.src.rpm请在 http://vault.centos.org/7.N.YYMM/updates/Source/SPackages/
(请以相关的副版本编号、年度及月份取代 N.YYMM。)下载
$ rpm -i kernel-xxxxxxxxx.src.rpm 2>&1 | grep -v exist
- 解压源码并生成源码
$ cd ~/rpmbuild/SPECS
$ rpmbuild -bp --target=$(uname -m) kernel.spec
- 现在内核的源代码目录树可以在 ~/rpmbuild/BUILD/kernel/linux/ 这个目录内找得到
编译内核
- 切换用户
后续操作,使用非root用户进行后续操作,切记
- 生成内核配置文件
进到 ~/rpmbuild/BUILD/kernel-/linux-/ 目录,然后选择复制 configs/ 目录内的配置文件或 /boot/ 目录内的现有内核配置文件,并命名为 .config。
这里选用了 /boot/目录内的配置,为了保持和现有的系统内核一致
$ cd ~/rpmbuild/BUILD/kernel-*/linux-*/
$ cp /boot/config-`uname -r` .config
- 设置内核
$ make oldconfig
$ make menuconfig 设置你所需要的选项
接着在.config文件的第一行加入uname -i的输出,比如:x86_64,使文件第一行如下
# x86_64
注意 #号和文字之间有空格
修改完后更新config文件
$ cp .config configs/kernel-3.10.0-`uname -m`.config
$ cp configs/* ~/rpmbuild/SOURCES
- 更新spec文件,进入rpmbuild/SPECS目录,修改kernel.spec文件,替换如下行。
# % define buildid .local ----> %define buildid .xxxx
__注意__ 删除#号, %和define之间无空格,xxx自定义
5.编译内核
进入~/rpmbuild/SPECS目录
$ rpmbuild -bb --target=`uname -m` --without kabichk kernel.spec 2> build-err.log | tee build-out.log
漫长的编译后: ~/rpmbuild/RPMS/uname -m
/ 目录内找到生成的rpm包们
安装和启动
1.使用root账户: yum localinstall ~/rpmbuild/RPMS/uname -m
/kernel*.rpm
- 重启并加载新的内核,大功告成