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.编译完成。
