centos内核的下载和编译:
一:第一次编译内核实验过程:
1.linux下敲入命令查看系统版本号:
cat /proc/version
Linux version 3.10.0-327.el7.x86_64 (builder@kbuilder.dev.centos.org) (gcc version 4.8.3 20140911 (Red Hat 4.8.3-9) (GCC) ) #1 SMP Thu Nov 19 22:10:57 UTC 2015
uname -r
3.10.0-327.el7.x86_64
cat /etc/redhat-release
CentOS Linux release 7.2.1511 (Core)
2.进入centos官网下载:http://vault.centos.org/
找到路径:7.2.1511/os/Source/SPackages/kernel-3.10.0-327.el7.src.rpm
解压:rpm2cpio kernel-3.10.0-327.el7.src.rpm | cpio -id
到当前文件夹找到linux-3.10.0-327.el7.tar.xz(内核源码包)
注意:如果使用rpm -ivh kernel-3.10.0-327.el7.src.rpm 按照会报错,我们为了使用该版本centos对应的内核源码,直接找到源码包即可。
拷贝linux-3.10.0-327.el7.tar.xz到/usr/src
xz -d linux-3.10.0-327.el7.tar.xz
tar -xf linux-3.10.0-327.el7.tar
3.创建符号链接
cd /usr/include
mv scsi bk_scsi
mv asm-generic bk_asm-generic
mv linux bk_linux
ln -s /usr/src/linux-3.10.0-327.el7/include/linux linux
ln -s /usr/src/linux-3.10.0-327.el7/include/scsi scsi
ln -s /usr/src/linux-3.10.0-327.el7/include/asm-generic asm-generic
解释:/usr/include下的头文件包含是提供给用户程序引用的,非内核程序。因为正常情况下可能export的环境变量会设置成此路径。
/usr/src/linux-3.10.0-327.el7/include下文件为我们编译linux-3.10.0-327.el7时使用。
但当我们编译时如果源代码中没有引入内核宏,会自动引用/usr/include下的头文件,我们创建软连接,是为了所有的编译体系(内核程序、非内核程序)都引用我们待编译的内核头文件linux-3.10.0-327.el7/include。
疑问:/usr/include下面还有一个asm汇编文件夹,但再/usr/src/linux-3.10.0-327.el7/include/下没有asm文件夹,这两者有啥区别吗?
如果使用/usr/src/include链接下的文件夹,可能会报找不到limit.h这个头文件。这个头文件应该是第三方安装包按照到系统里的。所以请看下面总结。
最终总结如下:因为我们找到是按照的linux系统对应的内核版本,所以编译内核时直接引用/usr/include文件夹下头文件也无所谓,因为该系统也是对应该内核安装时生成的。无论引用哪个文件夹都一样。
用什么无所谓,确认一下export中的环境变量是哪个路径。PWD = ...
综合第三点:只要环境变量路径设对就行(其他扫描创建软连接之类可以忽略):export path = ..
4.裁剪编译选项
/usr/src/linux-3.10.0-327.el7/中输入make menuconfig。
在出现的菜单中选择需要裁剪的内核功能,然后save 退出
5.编译
make dep //读取配置4过程生成的配置文件,来创建对应于配置的依赖关系树,从而决定哪些需要编译而那些不需要
make clean //完成删除前面步骤留下的文件,以避免出现一些错误
make bzImage //则实现完全编译内核
或者make bzImage -p >>compile_kenal.txt //这个可以查看编译时makefile执行情况以及变量
出现的问题:
(1):
这里出现/usr/include/linux 下某个文件的u32,u64定义错误。在types.h中增加报错的几个字段,问题解决。
(2):
In file included from include/linux/bitops.h:33:0,
from arch/x86/purgatory/sha256.c:18:
/usr/src/linux-3.10.0-327.el7/arch/x86/include/asm/bitops.h: 在函数‘constant_test_bit’中:
/usr/src/linux-3.10.0-327.el7/arch/x86/include/asm/bitops.h:318:24: 错误:‘BITS_PER_LONG’未声明(在此函数内第一次使用)
return ((1UL << (nr % BITS_PER_LONG)) &
^
/usr/src/linux-3.10.0-327.el7/arch/x86/include/asm/bitops.h:318:24: 附注:每个未声明的标识符在其出现的函数内只报告一次
/usr/src/linux-3.10.0-327.el7/arch/x86/include/asm/bitops.h: 在文件作用域:
/usr/src/linux-3.10.0-327.el7/arch/x86/include/asm/bitops.h:504:37: 致命错误:asm-generic/bitops/find.h:没有那个文件或目录
#include <asm-generic/bitops/find.h>
查看该版本中/usr/src/include/asm-generic下并没有bitops文件夹,考虑到该文件夹带有通用的意思,所以从其他linux版本拷贝一个文件来尝试是否编译通过。
再仔细查看发现整个asm-generic是空的,所以重新解压版本包。顺利编译通过。
二:内核编译总结
1.下载源代码放入/usr/src/linux_xxx
2. 环境变量设置:export PWD = "/usr/src/linux_xxx/include"; //该编译PWD路径变量是自动更新,和pwd命令目录一致。
3. make menuconfig,进入裁减内核功能,一般情况下默认save即可。
4. make dep
make clean
make bzImage 或者 make bzImage -p >>compile_kenal.txt
5.编译完成。