如何编译一个内核Ubuntu方式.docx
- 文档编号:30537191
- 上传时间:2023-08-16
- 格式:DOCX
- 页数:16
- 大小:82.14KB
如何编译一个内核Ubuntu方式.docx
《如何编译一个内核Ubuntu方式.docx》由会员分享,可在线阅读,更多相关《如何编译一个内核Ubuntu方式.docx(16页珍藏版)》请在冰豆网上搜索。
如何编译一个内核Ubuntu方式
如何编译一个内核-Ubuntu方式
来源:
ChinaUnix博客 日期:
2007.08.2607:
12 (共有0条评论)我要评论
如何编译一个内核-Ubuntu方式
日期:
2006-11-21 作者:
赵珂译 来自:
每一个Linux发行版都有自己专门的工具去构建自定义的内核.本文主要介绍在Ubuntu平台上编译内核,如何从
www.kernel.org
(也叫
vanillakernel
)获得最新且未改动的内核源代码来构建一个自定义的内核,这样你可以使用自己的内核而不是发行版的内核,另外也介绍了如何给内核打补丁,从而方便增加新的功能.
下面的工作我都在Ubuntu6.10Server("EdgyEft")和Ubuntu6.06Desktop("DapperDrake")上经过了测试.
我想首先要说的是文章中构建自定义内核的方式不是唯一的,还有许多其它的方式,这不过是我习惯的方式.我不能保证使用后不会出现任何问题.
1.预备工作
我推荐使用root用户执行下面所有的步骤.如果你还没有创建root登陆口令,请运行下面的命令:
sudopasswdroot
然后,以root身份登陆:
su
如果你想使用一般用户来替代root用户,记住在本文所有命令前输入sudo,比如当我运行
apt-getupdate
你需要运行下面的命令来替代,等.
sudoapt-getupdate
1.1Ubuntu6.10上的/bin/sh("EdgyEft")
在Ubuntu6.10,/bin/sh缺省是一个链接到/bin/dash的字符链接.当你编译软件源代码的时候,/bin/dash似乎还存在问题.至少我已经遇到了一些问题.所以我把/bin/sh链接到了/bin/bash.
如果你使用Ubuntu6.10,现在你可以运行:
rm-f/bin/sh
ln-s/bin/bash/bin/sh
2安装必需的软件包(为内核编译做准备)
首先我们升级软件(包)库:
apt-getupdate
然后我们安装所有需要的软件包:
apt-getinstallkernel-packagelibncurses5-devfakerootwgetbzip2
3下载内核源代码
接下来我们下载需要的内核到/usr/src目录(去
www.kernel.org
网站下载你需要的内核版本,比如.linux-2.6.18.1tar.bz2(你可以从这里下载所有的2.6内核:
http:
//www.kernel.org/pub/linux/kernel/v2.6/).然后下载到/usr/src目录:
cd/usr/src
wgethttp:
//www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.18.1.tar.bz2
然后解压内核源代码,创建一个指向内核源代码目录的linux字符链接:
tarxjflinux-2.6.18.1.tar.bz2
ln-slinux-2.6.18.1linux
cd/usr/src/linux
4给内核源代码打补丁(可选)
有时你的缺省内核不支持新买的设备,你需要安装新的驱动.或者你需要使用虚拟技术或其它高级的技术,而这些现有的内核都不支持.这样情况下你需要给给内核源代码打补丁(当然补丁已经发布..)
现在我们假设你已经下载需要的补丁(以下例子我叫它patch.bz2)到/usr/src.运行下面的命令给内核源代码直接打上补丁(你的用户必须位于/usr/src/linux目录):
bzip2-dc/usr/src/patch.bz2|patch-p1--dry-run
bzip2-dc/usr/src/patch.bz2|patch-p1
第一个命令用于测试,对内核没有任何影响.如果没有显示错误,你可以运行第二个命令给内核打补丁.如果第一个命令有误,请务继续的操作!
你也能够通过内核的prepatches方式打补丁.比如,如果你需要一个功能,而这个功能仅存在于2.6.19-rc4中,
正式完整的内核版本仍没有发布,而patch-2.6.19-rc4.biz2已经发布.你可以把这个补丁打到2.6.18的内核源代码中,
但请不要达到2.6.18.1或2.6.18.2,等.这个规则在接下来的网页中注明:
http:
//kernel.org/patchtypes/pre.html
prepatches等同于linux中的测试发行;他们位于存档的测试目录中,
我们可以使用patch
(1)工具对上一个完整发行版(版本号分三部分)打补丁(例如,2.6.12-rc4
prepatch只可以给2.6.11内核源代码打补丁,而不是2.6.11.10.)
所以如果你想编译2.6.19-rc4内核,你必须在步骤3.1下载2.6.18(
http:
//www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.18.tar.bz2
)替代2.6.18.1内核源代码!
下面是如何给2.6.18打上2.6.19-rc4补丁:
cd/usr/src
wgethttp:
//www.kernel.org/pub/linux/kernel/v2.6/testing/patch-2.6.19-rc4.bz2
cd/usr/src/linux
bzip2-dc/usr/src/patch-2.6.19-rc4.bz2|patch-p1--dry-run
bzip2-dc/usr/src/patch-2.6.19-rc4.bz2|patch-p1
5.配置内核
使用当前工作内核的配置文件做为新内核配置文件的基础是一个很好的主意.因此我们拷贝已存的配置文件到/usr/src/linux:
cp/boot/config-`uname-r`./.config
然后运行
makemenuconfig
然后我们看到内核的配置菜单.移动绿色光标到LoadanAlternateConfigurationFile行后选择.config文件(包含了当前工作内核的配置)做为配置文件:
然后浏览内核配置菜单,选择你需要的功能.完成配置后,选择Exit,回答下面的问题(Doyouwishtosaveyournewkernelconfiguration?
你希望保存新的内核配置吗?
),选择Yes:
6构建内核
执行下面命令来构建内核:
make-kpkgclean
fakerootmake-kpkg--initrd--append-to-version=-customkernel_image
kernel_headers
在--append-to-version=后面你可以写上任何字符串来区别内核版本,但是必须以"-"符号开始而且后面不包括任何空格.
保持耐心,内核编译需要一定时间,主要看你的内核配置和处理器速度.
7安装新内核
在成功构建内核后,你在/usr/src目录能发现两个.deb软件包.
cd/usr/src
ls-l
在我的测试系统上,他们分别名为
linux-image-2.6.18.1-custom_2.6.18.1-custom-10.00.Custom_i386.deb
(包含了实际的内核)和
linux-headers-2.6.18.1-custom_2.6.18.1-custom-10.00.Custom_i386.deb
(包含了需要的文件,用于以后需要编译额外的内核模块).我是这样安装的:
dpkg-ilinux-image-2.6.18.1-custom_2.6.18.1-custom-10.00.Custom_i386.deb
dpkg-ilinux-headers-2.6.18.1-custom_2.6.18.1-custom-10.00.Custom_i386.deb
(现在你甚至能够拷贝这两个.deb文件到其它的Ubuntu系统,通过上面的方式安装.你将不再需要编译内核.)
然后检查/boot/grub/menu.lst文件,现在你将能发现新内核使用的两个引导配置块:
vi/boot/grub/menu.lst
在我测试系统上已经添加好的引导配置块是这样的:
titleUbuntu,kernel2.6.18.1-custom
root(hd0,0)
kernel/boot/vmlinuz-2.6.18.1-customroot=/dev/sda1roquietsplash
initrd/boot/initrd.img-2.6.18.1-custom
savedefault
boot
titleUbuntu,kernel2.6.18.1-custom(recoverymode)
root(hd0,0)
kernel/boot/vmlinuz-2.6.18.1-customroot=/dev/sda1rosingle
initrd/boot/initrd.img-2.6.18.1-custom
boot
现在重启系统:
shutdown-rnow
如果一切进展顺利,你的新内核正常工作.你还可以通过运行下面命令来检查新内核是否运行:
uname-r
这将会显示如:
2.6.18.1-custom
如果系统没有起来,重启一下,你会看到:
按ESC进入GRUB菜单:
选择你以前的内核启动系统,现在你能再次尝试编译新的工作内核.不要忘记从/boot/grub/menu.1st文件中移去不需要的引导内核信息.
=======================================================================================================
=======================================================================================================
======================================================另一篇=====================================================
=======================================================================================================
=======================================================================================================
编译Linux2.6内核总结
在X86,Ubuntu上编译Linux2.6内核,总结如下:
基础知识
在介绍如何编译内核之前,需要对内核相关概念有一定的了解.关于Linuxkernel的介绍浩如烟海,这里只介绍系统中相关的目录,文件及命令.
/boot
/boot/vmlinuz- :
用于启动的压缩内核镜像,它也就是/arch//boot中的压缩镜像.
/boot/system.map- :
存储内核符号地址.
/boot/initrd.img- :
初始化RAM硬盘时,用来存储挂载根文件系统所需的模块.
/boot/grub/menu.lst :
grub的配置文件.(不同的发行版中它可能位于不同位置.
/lib/modules
该目录包含了内核模块及其他文件.注意,modules中一般会有多个目录:
系统自带的内核模块在这里,你编译自己的内核模块后,它们也会被安装到这里.不同的目录由内核版本号来区分.即modules里目录的名称是内核版本号.(使用$uname-r可知当前系统内核所用的模块位于哪个目录).
/lib/modules//build
储存为该版本的内核编译新模块所需的文件.包括Makefile,.config,module.symVers(模块符号信息),内核头文件(位于include/,include/asm/中)
/lib/modules//kernel
储存内核目标文件(以.ko为后缀).它的目录组织和内核源代码中kernel的目录组织相同.
/lib/modules//中:
modules.alias :
模块别名定义.模块加载工具使用它来加载相应的模块.
modules.dep :
定义了模块间的依赖关系.
modules.symbols:
指定符号属于哪个模块.
这些文件都是文本文件,可以查看它们.
$uname-r
uname
(1)被用来查看系统信息,这里对我们有用的是它的"-r"选项,它显示内核版本信息.
下载内核,验证签名,解压缩
到
http:
//www.kernel.org/pub/linux/kernel/
下载最新版本的2.6内核.速度还比较快.这里以linux-2.6.17.13为例:
1,下载内核压缩包
bzip2格式比gzip压缩效率更高,一般就下载bz2的压缩包.下载了内核压缩包之后,还可下载对应的sign文件.它被用来验证内核压缩文档的openPGP签名.详细信息可参考
这里
.
$wget-chttp:
//www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.17.13.tar.bz2
$wget-chttp:
//www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.17.13.tar.bz2.sign
2,验证签名
首先从pgp的服务器获取签名公匙,linux内核包的公匙编号是0x517D0F0E.再利用sign文件来验证.bz2压缩包的签名. 如果输出中有类似gpg:
Goodsignaturefrom"Linux
KernelArchivesVerificationKey"的内容,
说明该包是有效的.后面给出的警告信息可以忽略.
$gpg--keyserver--recv-keys0x517D0F0E
$gpg--verifylinux-2.6.17.13.tar.bz2.signlinux-2.6.17.13.tar.bz2
GPG签名只是保证镜像网站提供的压缩包和kernel.org所提供的是相同的,如果你在kernel.org下载,不需要验证签名.
3,解压缩
解压缩之前,有个问题值得思考:
要将压缩包解压到何处?
即要在哪个目录进行Linux内核源代码的编译?
内核源码树的
README
中有这样一段话:
DoNOTusethe/usr/src/linuxarea!
Thisareahasa
(usuallyincomplete)setofkernelheadersthatareusedbythelibrary
headerfiles. Theyshouldmatchthelibrary,andnotgetmessed
upbywhateverthekernel-du-jourhappenstobe.
实
际上,在我的Ubuntu系统中,/usr/src/目录中最初是没有linux目录的.你可以在/usr/src中新建一个目录,
用内核版本命名,比如/usr/src/linux-2.6.17.13.这样,即便之前在/usr/src中安装了linux的头文件,
也不会对它们造成影响.
我采用的方法是:
在/usr/local/src/kernel目录中进行.
编译内核时候,若在make后添加"O="将会使生成的目标文件(包括.config)被放置到指定的目录.否则,生成的目标文件默认地被放到内核源码目录.我们就采用默认的方法.这是安全的.
4,打补丁
对于kernel.org中的内核,我个人认为没必要下载patch,再打补丁.费那事干嘛,直接下载bz2包不就行了.特定的补丁只能针对紧随其前的一个版本.比如你想从2.6.17.1升级到2.6.17.13.你得打12次补丁,忒麻烦了.
但
是,有时候需要对"官方内核"添加补丁,以支持特定的系统.比如ARMLinux,它往往不是发布完整的内核,
而是发布针对特定版本的补丁包.这种情况下就要知道如何打补丁了.方法很简单:
把补丁下载,解压.
得到patch-.将它放到解压后的内核目录树的父目录中(也就是补丁和内核目录在同一目录).然后cd到内核目录树中运行:
$patch-p1
配置内核
1,前提:
构建编译环境
显然,需要make,gcc等工具,在Ubuntu中,只需一条简单命令就可安装所有的源代码编译工具:
#apt-getinstallbuild-essential
当然,如果你的内核是要安装到不同体系结构的目标系统中,还需要构建cross编译环境.
2,内核配置工具介绍
Linux提供了多种内核配置工具,最基础的是makeconfig,它列出每个编译选项,而且是基于文本的,一般不用它.
menuconfig(makemenuconfig)
menuconfig是比较主流的配置工具,它需要curse库的支持,在Ubuntu中默认是没有的,先安装它:
#apt-getinstalllibncurses5-dev
xconfig(makexconfig)
xconfig基于X11,使用qt库,在Ubuntu中先安装qt库:
#apt-getinstalllibqt3-headerslibqt3-mt-dev
3,内核配置相关
.config配置文件
在内核树的根目录中,有一个.config文件,它记录了内核的配置选项,可直接对它进行修改,再运行(若.config不存在,对内核进行配置后会生成它,这种情况下当然不能开始就运行oldconfig).实际上,如果你手头有合适的.config文件,可以运行makeoldconfig 直接按.config的内容来配置
$sudomakeoldconfig
对内核的配置都是围绕.config来展开的. 即便开始.config文件不存在,进行配置后会创造它.
其实可以直接在menuconfig中加载已有的配置文件,不要将它改名为.config.否则完成配置,退出menuconfig时会提示你运行makemrproper.上面提到的方法只是比较适合于oldconfig!
make相关命令
$makeoldconfig :
基于已有的.config进行配置,若有新的符号,它将询问用户.
$makedefconfig :
按默认选项对内核进行配置(386的默认配置是Linus做的).$makeallnoconfig:
除必须的选项外,其它选项一律不选.(常用于嵌入式系统).
$makeclean :
删除生成的目标文件,往往用它来实现对驱动的重新编译.
$makemrproper:
删除包括.config在内的生成的目标文件.
可以查看内核源码树中的README和Makefile了解上述配置方法.
4,开始配置
1,修改Makefile(可选)
在Makefile中,有这样的内容:
VERSION=2PATCHLEVEL=6SUBLEVEL=16EXTRAVERSION=.20NAME=SlidingSnowLeopard
我们在编译内核之前,可以先修改Makefile中的版本信息(一般是修改EXTRAVERSION,比如EXTRAVERSION=-zp).这样就能将自己编译的内核同别人编译的相同版本内核区分开来.修改,编译之后,可使用$uname-r查看内核版本信息.
但实际上,从2.6.8的版本起可在内核版本号后面添加个性化字符串.所以也就没有必要修改Makefile了:
() Localversion-appendtokernelrelease
如果你即修改了Makefile中的EXTRAVERSION,又在配置时定义了localversion.那么localversion所定义的字符串将位于末尾,紧跟在EXTRAVERSION的值之后.
另外,如果要用到ccache,也需要修改Makefile.参考后面的内容!
2,准备一个.config文件.
内核配置选项众多,一个个去配置相当麻烦.建议使用手头已有的配置文件.如果你手头没有, 有多种方法获得它:
(1)使用makedefconfig将在源码树的根目录得到.config.
(2)使用当前系统内核的配置文件,一般位于/boot目录中.它的名称并不是.config.
(3)使用别的发行版提供的配置文件(网上去下载).
slackware的.config是个不错的起点.在它的配置文件基础上作出适合自己系统的修改,比较方便. 也可以拷贝发行版提供商的.config文件.
3,建议配置步骤:
(1)将配置文件(不要将它命名为.config!
)拷贝到内核源
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 如何编译一个内核 Ubuntu方式 如何 编译 一个 内核 Ubuntu 方式