内核编译

内核编译和嵌入式产品的设计与开发
dshbusiness
帖子: 1831
注册时间: 2009-04-03 15:10

内核编译

#1

帖子 dshbusiness » 2009-08-21 16:07

一、源代码管理
这里首次安讨论源代码的管理问题,下面给出一个方便的管理源代码的做法:
1、首先,去http://www.kernel.org下载一份比较新的源代码。(可以下载最新的源代码,但是并不强求,原因后面会讲)
2、在自己的主目录下面新建一个目录,名字可以随便取,这里以名称为kernel为例,以后这个文件夹就将专门用来存放源代码和编译的安装包,可以长期保存这个文件夹。
3、打开终端,执行:

代码: 全选

sudo apt-get install ketchup
这段代码会安装一个源代码管理工具到你的系统,该软件很小。
4、将刚刚下载的源代码解压到第二步建立的kernel文件夹下面,例如,你下载了2.6.31的源代码,那么解压以后,会在kernel目录下面出现一个名为linux-2.6.31的文件夹,将这个文件夹改名,名称也可以任意,这里以src为例。
5、用命令行进入上面的src目录,执行下面的代码:

代码: 全选

ketchup -m
会出现如下所示的结果

代码: 全选

2.6.32-rc5-git1
根据你下载的源代码的版本不同,结果可能会有差异,上面是我的系统执行的结果。
接下来去下面的网站复制一个签名文件,注意这个签名文件是直接显示在网页上面的,需要手动复制并且保存。如果实在不会,可以用我附件里面给出的签名,但是可能会过时。
http://www.kernel.org/signature.html
将这个文件保存在kernel目录下面,名称可以随便起,这里以key.key为例。
在kernel目录下面,用命令行执行:

代码: 全选

gpg --import key.key
至此,一个完善的源代码仓库就建立好了,以后就可以一直使用这个目录来编译内核,而且不需要再去手动下载源代码包了。
每次打算升级内核的时候,在上面建立的那个src目录下面,用命令行执行:

代码: 全选

ketchup 2.6-tip
就可以自动将内核升级到当前最新的稳定版本。而且这个升级是ketchup自动选择下载相应的补丁包并且按照相应的顺序打上源代码补丁的,与下载全新的linux内核源代码包没有任何区别!(这里的没有任何区别就是没有任何区别,并不是说它是通过补丁来升级的就会留下某些垃圾,而且以补丁的形式升级内核源代码,所要下载的量非常少
使用这个代码仓库的时候,和以前的编译方法一样,在src目录下面执行

代码: 全选

make-kpkg clean
fakeroot make-kpkg --initrd --append-to-version=-custom kernel_image kernel_headers 

代码: 全选

附注:
1、原来我建议大家去看[url]http://forum.ubuntu.org.cn/viewtopic.php?f=97&t=110461[/url]这个帖子里面的编译方法,后来觉得他写的有些不全面,没有同时编译kernel_headers包,这导致在做某些开发工作的时候失败。所以这里给出ubuntu官网上的编译方法。另外注意命令中-custom可以替换成自己喜欢的几个字符,例如自己的名字,但中间不要有空格。kernel_image kernel_headers的意思是同时编译内核安装包和内核头文件安装包,如果不需要其中某一个,就把对应的地方删除就可以了。(例如不需要头文件包,可以删除kernel_headers,但是这样一来自己编程的时候可能就无法使用某些系统调用了)
2、!!!建议大家把自己的内核配置文件备份好,然后每次编译完成都执行
[code]make mrproper
这个命令用于清楚所有编译生成的东西,可以还原一个非常干净的源代码,所以执行之前把.config文件备份好,不然会被一并删除。
下次更新完代码再把配置文件拷贝进去即可。
3、使用ketchup工具以后会在自己的主目录下面建立一个名为.ketchup的文件夹,里面存放的是每次更新自动下载的补丁等内容,没必要删除。[/code]




二、内核配置/编译环境构建(这部分内容参考了viewtopic.php?f=97&t=110461帖子的部分内容,在此致谢!)
依次执行以下命令,即可构建出一个完整的配置/编译环境

代码: 全选

sudo apt-get install build-essential kernel-package libncurses5-dev fakeroot
sudo aptitude install libqt3-headers libqt3-mt-dev libqt3-compat-headers libqt3-mt


三、内核配置
--------------------------------------------------------------
这是我在书上看到的一则配置内核的方法,据说这就是Linus自己所用的电脑的配置,我自己试验了一下,使用Gzip压缩的内核,编译以后的deb包大小为4.4MB,安装以后各项功能正常,下面说一下配置方法:
-------------------------------------------------------------
目前已经确认,“make defconfig这条命令就是Linus自电脑配置”,这个说法来自《Linux内核设计与实现》一书,原文照片见附件。
由于此书作者(Robert Love)多年参与linux内核开发,是资深的内核开发人员。且此书由Andrew Morton(linux内核-mm开发树的总维护者)作序,所以,这个说法的真实性是非常大的。有兴趣的读者可以继续考证。
-------------------------------------------------------------
根据上面的内容,更新好源代码之后,就可以直接进入配置、编译环节。作为参考,本文前一个版本还保留在附件里,以备查阅。
-------------------------------------------------------------
我自己配置分为两个阶段,先是流水帐一样的过一次,然后根据自己电脑调整一些重要选项。

进入终端:
$make mrproper
这个时候,如果你以前编译过内核,并且保留了配置文件,可以在执行上面的指令之后把配置文件复制进源代码目录,命名为.config
$make defconfig
注意,这里就是关键步骤,内核中包含一个默认的配置,是针对i386平台的,执行上面一条指令以后,就会生成一个默认的,非常精简的内核配置文件,就像上面说的,据说Linus的电脑用的就是这个配置。
然后呢,我们需要根据自己的电脑来修改一下这些配置,毕竟咱们的电脑和Linus的不可能完全一样么:
$make xconfig
---------------------------------------------------------------------
好了,这里假设你已经生成了图形配置界面,点击配置界面菜单栏上的Option菜单,看看下面的Show Name选项选择没有,没选上的话一定要选上。

下面说下需要注意的地方:
1.首先看General Setup-->Kernel log buffer size,我在网上看一般双核选择15,我是Intel双核的,就把18改成15了。
2.我从好多地方看到说一般家用都可以把Control Group support去掉,我忘了为什么了,生成的默认配置里面是选上的,但是我去掉了,至于到底怎么办,自己考虑吧。
3.Enable the block layer-->Support for large (2TB+) block devices and files可以去掉,估计也没几个人有2TB大的磁盘什么的。不过特别要注意一点,使用ext4的,必须把这一项选上,不然编译成功以后无法挂载ext4分区。
4.Processor type and features->Processor Family下面选择自己对应的处理器类型,一定要选对哦。
5.还是在选择处理器那里,继续向下看,Maximum number of CPUs,自己看看需要填几,这个地方我也不是很清楚,双核CPU和两个CPU在这里有什么区别?了解这个问题的可以讲解一下这里到底怎么选。我的建议是,双核就按两个对待,如果是四核就按四个对待,选4吧。
6.紧接着下面SMT (Hyperthreading) scheduler support,据说这种技术只有Intel个别型号的处理器有,我也不清楚,反正我没选。
7.Preemption Model,可以选择Preemptible kernel。
8.Machine Check Exception,这个好像说要看处理器有没有一个MCE标志的,我不是很清楚,我用下面的方法看的:
$lshw
然后看cpu下面的capabilities有mce这个词,就选上了。可以吧下面的AMD那项去掉。
9./dev/cpu/microcode - microcode support里面将AMD的去掉,虽然我估计这个选项其实都可以去掉,因为根本没用,好像是刷cpu固化的微程序的,没人会随便刷吧……
10.High Memory Support,还是老话,内存<1G,选择off,内核>=1G,选择4G,如果内存>=4G,选64G,内存>=64G……请向Linus反映为你开发专门的内存管理模块。
11.Timer frequency,自己选择……一般选择1000HZ。
12.Power management and ACPI options,估计没人用APM了,默认配置里面根本没选APM,如果你还用APM,那么你需要自己调整。
13.Bus options,基本没必要变化了,除非你有ISA或者MCA设备。一般可以不管这里,略过。我就什么都没改,这里已经够简洁了,只选了PCI。
14.Networking support->Networking options下面的802.1d Ethernet Bridging选上了,没有为什么,反正我就是选上了……至于大家选不选,自己掂量。
15.Amateur Radio support我去掉了,默认选择的,这个好像是说业余广播电台什么的。
16.如果有红外或者蓝牙设备,那么你需要自己分别配置IrDA subsystem support和Bluetooth subsystem support两项,默认没有选择。(Linus也不用红外和蓝牙?反正我没有,我就默认了,哈哈)
17.Wireless,我留默认了,建议大家也留默认,因为我觉得重点是在驱动里面。
18.网络部分剩下几个选项我觉得留默认就好了,反正我没管。
--------------------------------------------------------------
下面到Device Drivers部分,单独列出来是因为这部分的确比较重要。
默认的配置是支持SCSI硬盘的,如果你和我(或者说是和Linus)一样,用的是SCSI硬盘,那么恭喜你,你不用关心磁盘驱动了……因为默认就是这个。因为配置这个驱动比较复杂,而我恰好用的是和默认配置一样的硬盘,所以我就没管这一块,这里就不再说这里,如果有人用IDE硬盘什么的,可以自己找资料查查怎么设置。唯一的一点是我把Multiple devices driver support (RAID and LVM)下面的RAID support全部去掉了,因为我不用RAID,如果你也不用,完全可以去掉。
下面说主要的了:
19.Macintosh device drivers,这个东西比较奇怪,看起来好像是苹果的硬件,但是我记得某一次我试验了一下,把这个选项去掉了,结果发现我的电脑的触摸板没法用了(我是thinkpad的机子,为什么会有苹果的设备?)……有兴趣的可以放狗搜一下为什么,然后详细解答。
20.Network device support-->Ethernet (10000 Mbit),我没有万兆以太网卡,所以我把这个去掉了,如果你有,就留着,说明你电脑牛X……
21.Wireless LAN,这个东西我看了好久,发现没有我的电脑能用的硬件,所以我只选择了Wireless LAN (IEEE 802.11)这一项,至于它下属的各个特定的硬件驱动一个都没选,打算以后安装第三方驱动,默认选择的是Atheros 5xxx wireless cards support这个网卡。
22.Input device support,我估计很少有人有Touch screens,所以可以把这个去掉,其他下面还包括游戏手柄什么的驱动,不要的都可以去掉。
23.后面好几个选项基本都可以不管,反正我没管,用默认就好,因为默认好像什么都没选。直接看Hardware Monitoring support,因为我是thinkpad的本本,所以选择了IBM Hard Drive Active Protection System (hdaps)选项,是硬盘防震保护的,不过我看好像这个功能在Linux下面没有windows下面强大哦,win下面有一个窗口直接可以看到笔记本目前是什么状态,就是倾斜还是水平的,硬盘是在运行还是暂停的,linux下面什么都看不到,我甚至怀疑这个功能是否还存在,有了解的给我说一下怎么开发这个功能,或者介绍些资料哈。其他的电脑可以根据自己电脑的硬件监测功能选择,如果没有就不用选了。
24.Generic Thermal sysfs driver下面的Hardware Monitoring support选上,我选了,不过不了解为什么这里还会出现一个硬件监视……
25.Bootup logo 可以去掉,因为不管我怎么选,我都看不到企鹅……不知道为什么。
26.Sound Card support,建议这里别乱动了,留默认就好,当然前提你的声卡必须是Intel的,否则还是自己看怎么选吧,我以前编译内核从来没有把声卡驱动配置对过,编译出来根本没有声音。
27.声卡以及声卡下面的好几个选项我都没管,感觉也没啥用,直接看X86 Platform Specific Device Drivers,我选择了ThinkPad ACPI Laptop Extras,其他品牌的电脑可以根据自己的品牌和功能选一下。
28.我吧Firmware Drivers下面的所有东西都去掉了,好像是和固件什么的有关。我估计我永远都不会在自己的电脑上做和固件有关的东西,所以去掉了。
29.File systems,默认只选择了Ext3和下面几个不知道是干什么的选项,但是我的/home分区用的是xfs,所以我把xfs选上了,不过是编译为模块的。
30.DOS/FAT/NT Filesystems,默认选择了前两项,没选NTFS,我只留了MSDOS那一项,如果你想读写NTFS,把最后一项选上。
31.下面几项内容估计一般人也用不到,好像是分区类型和网络文件系统的,我留默认了。Native language support我只增加了简体中文那一项,其他都默认了。
32.从Kernel hacking往下我都留了默认,因为我目前还看不懂那些选项是做什么的,反正我看已经足够简洁了,就没管。
-------------------------------------------------------------------
下面开始第二阶段的配置,要准备下面几个文件:
我用的是vim,所以我这里也只用vim来讲,因为用到vim的查找功能,其他的文本编辑器自己看吧,一点都不难。
首先:
$mkdir linuxtmp //建议建立这么一个目录,到最后可以统一删除,方便
$cd linuxtmp
$lshw>hw.txt
$lspci>pci.txt
$vi hw.txt
然后,已经进入了vim了
搜索 module 这个词:
/module
然后一个一个看,首先,我看到的是intel_agp,然后我在配置界面下面按ctrl+F,然后搜索intel_agp,结果当然是搜不到了……用lshw列出来的模块名称并不一定和源代码配置里面的模块名称一致。我也不知道为什么会这么奇怪,不过人家就这样做的,咱也没办法。好吧,我重新搜索了agp,发现了,在graphics support --> /dev/agpgart (AGP Support)下面,好了,找到地方了,大家可以根据自己的显卡来选择,我是集成的X3100,就选了intel的那一项,看后面的名称,竟然是AGP_INTEL,怪不得我搜不到……这里只举这么一个例子,搜不到的时候多动脑筋,只搜关键词的一部分,也许能搜到,后面的搜索我就只说原本的模块名了,至于搜不到的时候怎么裁减关键字,自己看着办。
好,配置完显卡,回到vim下面按n键,跳到下一个模块,名称是e1000e,搜索,然后选择相应的选项,为了保险起见,我把上面的那个e1000的也选上了,后来才觉得没用。
继续,uhci_hcd,选择,ehci_hcd,选择,hw.txt里面有好几个uhci_hcd,但是搜到配置文件里只有一个,所有就选这一个了,ehci_hcd也是。
继续还有yenta等等,分别选上,不再赘述,不过有一点,如果你选择了一个选项,而默认的是另一个,一般情况下可以把默认的去掉。
另外如果你的声卡的intel的,那么就必须注意,如果你只选择snd_hda_intel这一个模块是不行的,我试了很多次,根本没声音,所以对于声卡,我的意思是除非你特别了解,否则还是留默认的比较好,至于其他的声卡我就不了解了,自己放狗看看吧。
搜完了hw.txt,再打开刚刚生成的pci.txt
$vi pci.txt
继续上面的搜索
这里说几个我试验了半天都搜不到的模块,分别是shpchp,ath_pci,intelfb,遇到这几个模块就没必要去搜了,我试了,搜不到,有知道为什么的请告诉我。
如果你要求高一点,可以搜索debug这个词,所列出的选项我估计都可以去掉,貌似无害。
此外还要注意的是,默认是没有1394接口驱动的,如果要打开,必须直接到IEEE 1394 (FireWire) support下面去选上,我一般不用1394的口,所以我只选了带有ohci1394字样的几项,剩下的没选。
呃……还有一个重要的问题没说,关于网络的,默认似乎不编译ppp网络驱动,我也不知道为什么,我目前用的是adsl上网,里面貌似也没有驱动,如果你和我一样用adsl,那么你需要增加下面几个选项
CONFIG_PPP=m or CONFIG_PPP=y
CONFIG_PPP_ASYNC=m or CONFIG_PPP_ASYNC=y
CONFIG_PPP_SYNC_TTY=m or CONFIG_PPP_SYNC_TTY=y
CONFIG_PPP_DEFLATE=m or CONFIG_PPP_DEFLATE=y
CONFIG_PPP_BSDCOMP=m or CONFIG_PPP_BSDCOMP=y
CONFIG_PPPOE=m or CONFIG_PPPOE=y
CONFIG_N_HDLC=m or CONFIG_N_HDLC=y
上面是我搜出来的,好像是一个外国人写的,里面直接给的是配置文件里面的选项,如果自己选,不用管前面的CONFIG几个字,直接搜索ppp、async、sync_tty、deflate、pppoe、bsdcomp、n_hdlc几个关键字,然后选上相应的就可以,你可以选择m编译为模块或者按下y键编译进内核,一般选m吧。(P.S:我很奇怪为什么那个人给出的是纯粹的配置文件里面的选项,难道说此人很牛,配置内核连make config都不用,直接用文本编辑器修改配置文件的???)

到此为止,内核选型基本配置完毕,请参照上文给出的方法进行编译。
目前除了有一次我安装2.6.31-rc6的安装包需要安装一个有关无线网卡的安装包意外,尚未发现还有什么版本的内核需要额外安装包的。下面是以前写的安装rc6内核的时候的内容,保留至此:

代码: 全选

安装2.6.31-rc6的内核需要一个什么安装包,不然依赖关系不成立,详细的情况看[url]http://forum.ubuntu.org.cn/viewtopic.php?f=77&t=221265[/url],主要看3楼跟4楼,照着做就可以了。
重启后我发现启动速度有些块,但快的不明显,唯一明显的是内存占用小了许多。
以上是我根据自己的配置经过为主线写的,编译出来的内核在我的机子上运转正常,但是我不保证以上配置能在别的机子上正常运转,所以一定要注意配置好硬件。
最后,我的语言表达能力不强,因为小学到高中语文没学好,可能说话思路有些混乱,没有考虑读者的感受,还有些错别字,在这里先行致歉。还有,即使编译出来的内核能够正常运作,我也建议大家保留原有的内核,万一电脑上要接一个什么硬件,而自己编译的内核没有带驱动的,可以回到原来的内核下。
祝大家编译过程顺利!




ChangeLog
--------------------------------------------------------------------------------
给本文打一个补丁,根据今天编译2.6.31的经历,发现,如果要使用比较新的ext4文件系统,那么配置内核的时候必须把Enable the block layer-->Support for large (2TB+) block devices and files选上,至于为什么有兴趣的可以上网放狗看看。
另外想说明的是,其实不管是intel还是amd或者其他什么平台,都可以使用make defconfig,不过就是在后来的配置中非intel平台的配置起来要稍稍麻烦一些罢了,本文开头我说make defconfig是linus自己的配置,是我在一本书里面看到的,书名字给忘了,有兴趣考证这句话真实性的可以写信给linus问问,我这里这么说无非是想借助一下linus的光辉来提升一下本文的关注率。我个人估计make defconfig是由于linux内核最开始是针对i386平台的,另外现实的考虑,使用intel平台的人的确占绝大多数,所以才defconfig才是针对intel平台的。
--------------------------------------------------------------------------------
本文的第二次大的修改,将使用ketchup工具来管理源代码,更加方便大家编译和开发工作,同时文章标题改为内核编译,呃……更加醒目一些。本次更新主要针对代码管理方面,对于内核配置上没有做出修改,主要是由于最近太忙。
给大家介绍一些写作本文时候用到的资料,有兴趣的可以阅读:
1、linux内核中文社区 http://wiki.zh-kernel.org/
2、《linux内核测试指南》 上面的网站上就有下载,大家可以阅读有关ketchup工具更加详细的信息。
3、《linux内核设计与实现》 这本书应该是每个想深入了解linux内核的人必读,当然所要求的基础比较高。
4、《linux内核编程》 英文名称叫做the linux kernel primer,中文可能有重名的书。作者之一是Claudia Salzberg Rodriguez,对于上一本书是一个很好的补充,但是同样需要比较高的基础。
上次由 dshbusiness 在 2009-10-29 12:53,总共编辑 5 次。
头像
yingtianli
帖子: 631
注册时间: 2008-09-20 14:27

Re: 精简内核的最终方法……

#2

帖子 yingtianli » 2009-08-21 17:32

不错勇于实践。
头像
wangdu2002
帖子: 13284
注册时间: 2008-12-13 19:39
来自: 物华天宝人杰地灵

Re: 精简内核的最终方法……

#3

帖子 wangdu2002 » 2009-08-21 17:43

叙述得还算详细,对编译内核者,特别是Intel系有较大参考作用。 :em09
行到水穷处,坐看云起时。
海内生明月,天涯共此夕。
--------------------吾本独!
pellicon
帖子: 126
注册时间: 2009-01-08 1:21

Re: 精简内核的最终方法……

#4

帖子 pellicon » 2009-08-21 19:09

mark
头像
harteg
帖子: 158
注册时间: 2009-07-07 21:00
来自: 地址?

Re: 精简内核的最终方法……

#6

帖子 harteg » 2009-08-25 19:23

mark! :em05
飘过~
头像
guishugan
帖子: 379
注册时间: 2009-03-02 19:30
来自: 河北石家庄

Re: 精简内核的最终方法……

#7

帖子 guishugan » 2009-08-25 21:02

长知识了 慢慢研究一下
除了真相,女人也是赤裸裸的
ygmvla
帖子: 82
注册时间: 2006-11-12 9:39
来自: 湖南祁阳

Re: 精简内核的最终方法……

#8

帖子 ygmvla » 2009-08-28 20:20

晕倒,三十分钟也叫快呀,我都十五分钟都觉的慢`把硬件配置全编进内核,启动快多了,三秒钟就可以挂载文件系统,看看gentoo默认配置全是*。真想把我的还精简一点,就是E文太差了~
可惜了,我的是amd不然我也试试这个方法,呵,看看快不快~
dshbusiness
帖子: 1831
注册时间: 2009-04-03 15:10

Re: 精简内核的最终方法……

#9

帖子 dshbusiness » 2009-08-30 1:02

ygmvla 写了:晕倒,三十分钟也叫快呀,我都十五分钟都觉的慢`把硬件配置全编进内核,启动快多了,三秒钟就可以挂载文件系统,看看gentoo默认配置全是*。真想把我的还精简一点,就是E文太差了~
可惜了,我的是amd不然我也试试这个方法,呵,看看快不快~
全部编译进内核会快?
头像
AutoXBC
帖子: 1744
注册时间: 2007-10-23 12:54

Re: 精简内核的最终方法……

#10

帖子 AutoXBC » 2009-08-30 1:55

内核的开发者对编译配置的很多参数也没有统一的意见,所谓 Linus 的方法听听就行了,别太认真。

终极的方法就是不编译吧,Ubuntu 所谓"给正常人用的 Linux" 就是这么来的。
knowfarway
帖子: 877
注册时间: 2007-08-25 10:37

Re: 精简内核的最终方法……

#11

帖子 knowfarway » 2009-08-30 11:55

关注中,以后手上的机器多了一定试试。
Judson
帖子: 257
注册时间: 2008-06-16 11:32
来自: 四川

Re: 精简内核的最终方法……

#12

帖子 Judson » 2009-09-09 12:54

mark too。。。
头像
a9z1
帖子: 91
注册时间: 2007-02-06 17:06

Re: 精简内核的最终方法……

#13

帖子 a9z1 » 2009-09-10 10:26

顶~~~~ :em11
dioscuri
帖子: 90
注册时间: 2008-10-21 13:19

Re: 精简内核的最终方法……

#14

帖子 dioscuri » 2009-09-14 19:46

唉,失败。竟然无法识别我的用户目录。难道不能识别独立的home分区?

等熟悉内核在考虑编译了。
头像
Jarson
帖子: 2371
注册时间: 2008-07-21 9:44
来自: 深圳
联系:

Re: 精简内核的最终方法……

#15

帖子 Jarson » 2009-09-15 1:33

mark
回复