Linux 2.6、4.3内核编译过程感受与总结

之前编译过2.4.10版本的内核,很好编译,中间曾经漏下了SCSI low-level drivers下的BusLogic SCSI support选项导致没法启动系统,后来打开该选项后就行了,随手关闭一些没用的选项后编译速度非常快,30秒之内完成编译。当初以为内核编译也不过如此,直到这四天开始编译更新的内核才让我吃了大亏。

我起初的想法是编译一个极其简洁的内核,去掉网络、USB、光驱、等等所有没必要的东西,只留下核心功能,越精简越好,于是在1月21号我就下载了linux-2.6.34.tar.gz源码包,然后开始make menuconfig配置内核,当时只想着精简功能以便缩短编译时间,只关注有没有编译错误,期间由于gcc 3.4兼容版和binutils 2.20版本不匹配导致了链接失败,后来更新了gcc到4.4.7版本就好了。整个过程我都在关注编译时间是否缩短,忙活了一天,效果明显。一路精简下去,把便宜时间缩减到了2-3分钟左右,当时很高兴,觉得要成功了。

结果到了1月22号我开始引导系统时发现根本没法启动,解决一个错误又出一个错误,都是关闭了不该关闭的选项造成的,最终也没启动成功。我知道是有些重要选项被我关了,于是想尝试下用CentOS 6.0当前内核的配置文件来编译下2.6.34试试,我确实也这么做了,结果在链接的最后关头提示我硬盘空间不够,我虚拟机只分配了5G硬盘,编译出的文件占了3G多,还有系统和源码包占用一部分,空间不够用了,于是遗憾放弃。

到了22号晚上,我又下载了linux-4.3.3.tar.xz内核,这次不手动精简了,一个个去关闭选项太麻烦,我直接make allnoconfig,先将选项全部关闭再手动打开必须的选项,结果还是莫名其妙的出现错误,进不了系统,无数次不断的更改配置、打开选项重新编译还是不行,快抓狂了。

1月23号上午折腾了很长时间,但是那些错误还是解决不了,于是我猜测是不是我的CentOS 6.0(kernel-2.6.32-71)不适合编译太新的内核,就在下午下载了linux-2.6.32.69.tar.xz源码包,make allnoconfig,先将选项全部关闭再打开必须的选项,结果同样进不了系统。

上面所有的过程不管如何解决小错误,最终都有几个错误迈不过去:

1、No root device found.Boot has failed.sleeping forever.

2、udevadm[2371]: error getting socket: Address family not supported by protocol

udevd[2535]: error getting socket: Address family not supported by protocol

3、telinit: Failed to open socket: Function not implemented

init: rcS post-stop process (282) terminated status 1

init: kexec-disable main process (285) terminated with status 1

这次的问题不再是SCSI驱动,而是更棘手的配置问题。

至此,我终于明白一味的精简功能这种做法本末倒置了,我的第一要务是让系统能够引导启动,在此前提下再精简功能。

1月23号下午,我给虚拟机加了一块10G虚拟硬盘,准备好2.6.32.69的内核源代码。

cp /boot/config-2.6.32-71.el6.i686 .config

复制系统自带的内核配置文件,这次硬盘管够,我看你能不能行。

yes "" | make oldconfig

使用已存在的.config的文件内容,并对新增加的选项做出默认选择。然后make等了半个多小时才编译完,再安装模块、安装内核,又折腾了20分钟,启动试试,结果成功了!

再给虚拟机加一块10G虚拟硬盘,用此方法编译下4.3.3试试,结果也成功进入系统了。

这一次也是折腾到晚上,不过成功进入系统也就说明系统自带的配置文件可行。

到了1月24号,也就是今天,我的主要任务就是在保证内核可以正常启动的前提下不断的精简功能,就拿4.3.3内核动手吧,出手就把Networking support和Virtualization整个给取消了,结果编译完进不了系统,又出现了上面的错误。我这次怀疑是虚拟机使用的虚拟化的一些功能没有打开导致的,结果看了下帮助菜单,查看了Networking support的帮助信息后才发现其实是网络模块导致的,以前我怎么都不会想到会由于网络模块的问题导致进不了系统,我一直认为网络模块可以直接从内核中完全剥离,结果我错了,帮助信息中写道:除非你真的知道你在做什么,否则你都应该选择Y。这是因为许多程序需要内核网络功能的支持,即使你是在没有连接网络的单机上运行内核。

此句醍醐灌顶,原来是这么回事,立马打开Networking support选项,结果又可以进系统了。于是我小心翼翼的先关闭了网络里面的Wireless选项,还有其他一些硬件驱动,然后再编译重启,只要能进系统,就把目前的.config备份,然后继续关闭一部分功能,若能进入系统则再把.config备份,依次迭代下去,忙活了整整一天,光备份的配置文件就有12份,期间时间过得飞快,每编译运行一次就要花费半个多小时到四十分钟,等待编译以及模块、内核的安装期间又看了一次《黑衣人2》和《机械公敌》,截止到今天晚上7点多吃饭,我把内核精简到了超级小巧的程度,Networking support选项里面只剩下TCP/IP networking和Unix domain sockets了,我又把TCP/IP选项完全关掉了也没出现故障,于是最终确定Unix domain sockets这个东西绝对不能关闭,网络模块之所以关掉会导致系统无法启动,就是因为这个东西。后来查了下,这玩意儿的作用是:“UNIX Domain Socket是在socket架构上发展起来的用于同一台主机的进程间通讯(IPC),它不需要经过网络协议栈,不需要打包拆包、计算校验和、维护序号和应答等,只是将应用层数据从一个进程拷贝到另一个进程。”

原来是用于进程IPC的,怪不得这么重要,直接能导致系统无法启动。现在4.3.3的配置文件我已经把每一个选项都详细的检查过了,能关闭的都关闭了,剩下的选项要是再关闭系统就不能启动了。累死我了。现在内核从make clean后单线程重新编译需要用8分半钟,加上-j4参数的话要快一些。看来4.3.3内核确实是更复杂了,功能更强了,便宜速度再怎么提升都不能达到2.4.10内核的水平,2.6.32内核虽然当初没启动成功,但是我估计也只是差了一个Unix domain sockets选项而已,编译时间在2-3分钟左右应该不会差太多,所以说随着内核的发展,编译内核是个非常耗费时间的事情。

这次的经历也让我翻遍了所有的内核配置选项,搜索了大量资料,了解了很多选项是干嘛的。一开始以为栽在SCSI驱动上,一直在鼓捣SCSI驱动和File systems,结果没成想栽在了网络相关的功能上。

经过这次动手实践,我算是又对内核配置加深认识了,以后就算是用make allnoconfig的方式从零进行配置,我估计也能成功了吧。

此文算做是小小的总结吧。

时间: 2024-12-23 13:24:17

Linux 2.6、4.3内核编译过程感受与总结的相关文章

【Linux学习】Ubuntu下内核编译(一)

(1)当要执行内核配置时,输入make menuconfig时出现错误 遇到这个问题,主要是以为没有ncurses库,而make menconfig 需要这个库,因此需要安装ncurses或者ncurses-devel即可.输入命令:sudo  apt-get  install ncurses或者sudo apt-get  install ncurses-devel. (2)错误 drivers/input/touchscreen/eeti_ts.c: In function 'eeti_ts_

Linux系统管理之十二---内核编译升级

一.内核基础 1.内核下载地址www.kernel.org 2.内核核心存于:/boot/vmlinuz-version, 用uname  -r命令查询版本号.   内核模块存于:/lib/modules/version 3.linux内核设计:   单内核+模块 4.用户空间访问.监控内核的方式:通过修改/proc, /sys,这两个目录中文件的内容,来访问.修改.监控内核的特性. /proc  :大部分是只读的.     /proc/sys:大多数是可读写的.  设定内核数值的方法::   

Linux学习笔记<十八>——内核编译

内核由核心和内核模块两部分组成 核心:/boot/vmlinuz-version 内核模块(ko):/lib/modules/version/ 查看内核版本 uname -r 主版本号.次版本号(偶数表示稳定版本,奇数表示测试版本).修订版本号(修订的次数) 用户空间访问.监控内核是通过访问修改/proc,/sys目录下的文件(即设定内核的参数值)实现的 /proc/sys:此目录中的文件很多是可读写的 /sys:某些文件可写 设定内核参数值的方法: 1.echo VALUE > /proc/s

Android 内核编译过程记录

下载内核源码和交叉编译链交叉编译链我用的 https://aosp.tuna.tsinghua.edu.cn/platform/prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.9 设置交叉编译链前缀export CROSS_COMPILE=$(pwd)/bin/<toolchain_prefix>-例如:export CROSS_COMPILE=$(pwd)/bin/aarch64-linux-android- 指定交叉编译目标架构exp

Linux下C语言程序的编译过程与ssc平台出租

使用gcc编译程序时,编译工程分为4个阶段:ssc平台出租(企 娥:217 1793 408) (1)预处理:(Pre-Processing) (2)编译:(Compiling) (3)汇编:(Assembling) (4)链接:(linking) 预处理.编译.汇编是3个不同的阶段,但gcc在实际操作时可以把3个步骤合并为一个步骤来执行.下面以一个实例介绍如何生成各个阶段的代码.下面演示都针对文件 hello.c 进行. 1.编译单个文件 首先 vim hello.c 在hello.c中 按下

linux基础之内核编译

编译内核: 程序包的编译安装: ./configure, make, make install 前提:开发环境(开发工具,开发库),头文件:/usr/include 开源:源代码 --> 可执行格式 发行版:以"通用"的目标: 前提: (1) 准备好开发环境: (2) 获取目标主机上硬件设备的相关信息: (3) 获取到目标主机系统功能的相关信息,例如要启用的文件系统: (4) 获取内核源代码包:www.kernel.org 准备开发环境: CentOS 6.7: 包组: Deve

linux内核的配置机制及其编译过程

linux内核的配置机制及其编译过程 国嵌第一天第三节:讲解的是内核在X86平台上的配置.安装过程,制作自己的Linux系统,并双系统启动. <Linux系统移植>第四章 http://blog.csdn.net/zhengmeifu/article/details/7682373 Linux内核具有可定制的特点,具体步骤如下: 1.1.1 配置系统的基本结构 Linux内核的配置系统由三个部分组成,分别是: 1.Makefile:分布在 Linux 内核源代码根目录及各层目录中,定义 Lin

Linux内核编译完整过程

Linux内核编译完整过程 通过网上的资料我自己的实际内核编译,我把对Linux内核编译的过程写在这里,也许对其他的Linux爱好者的编译学习有些帮助,其中很大部分是网上的资料,另外就是我在实际编译过程中的一些实际经验. 内核简介 内核,是一个操作系统的核心.它负责管理系统的进程.内存.设备驱动程序.文件和网络系统,决定着系统的性能和稳定性. Linux的一个重要的特点就是其源代码的公开性,所有的内核源程序都可以在/usr/src/linux下找到,大部分应用软件也都是遵循GPL而设计的,你都可

Linux入门之CentOS7内核编译三部曲(1)

Linux入门之CentOS7内核编译三部曲(1) 我们知道,一个Linux系统的主要组成是由liunx内核核心和一些支持模块组合而成的.但是在某些场合中,需要某项功能,而当前内核的核心或者模块不支持此功能,那么就需要对内核进行一个升级或者重新编译内核添加相应的功能,以此提供了对此功能的支持. 编译前的准备 认识kernel 所为kernel,就是一种操作系统的核心,当然也是一个文件,而这种核心提供了对一些硬件的支持,一般来说其中包含了一些对常见硬件核心驱动的核心代码.启动系统时会通过加载MBR