linux内核编译:菜鸟浅谈Linux内核编译过程

    双眼皮猪         
  菜鸟俺最近研究了下Linux内核编译有些许心得体会望同大家分享故有此文…我们这里要谈不涉及到源码只是些内核编译步骤及相关知识…本人是菜鸟所以也就希望和菜鸟们分享下…
首先您要确定您有台装有Linux系统,编译内核可以在本机上直接对本机内核进行编译也可以从网上下载内核在其基础上进行编译.我们这里详细讲下升级内核思路方法
您可以从www.kernel.org下载到最新Kernel版本我们这里以RedHat9为例(其他版本其实也都只是在make menuconfig中有点区别)详细讲下内核编译步骤 :
首先确认您是以[color=red]root 用户[/color]登陆.把内核源码cp到/usr/src目录底下(请确认您是以root身份在进行操作否则会返回Permission Denied提示):
mkdir /usr/src/linux-2.4.22
cp 2.4.22.tar.bz2 /usr/src/linux-2.4.22 (我用是2.4.22kernel)
解压缩的熟悉linux系统朋友应该会知道:
bunzip2 ***.tar.bz2 | tar xvf 
进入到/usr/src/linux-2.4.22目录,请确定您是在此目录下操作而且保证您所敲入命令是正确不然会返回No rule to make target ***,stop类似提示这可是菜鸟们所要注意不然开头搞不好后面就不用谈了哦…
[color=red]1#cd /usr/src/linux-2.4.22
2#make mrproper[/color]
其实这个步骤是可以不用要,这个目是清除原先此目录下残留.config和.o(object文件)如果我们是刚下载源码那么这步您就可以省了:)但是如果您已经编译过多次内核步可是定要不然以后出现很多小问题可别怨我没告诉你….config文件我们会在后面提到…
[color=red]3#make menuconfig或make config或make xconfig[/color]
这就开始编译内核了打起十 2分精神编译不好系统是无法启动啦.小心应付其实这个步骤还有其他两种方式make config以及make xconfigmake config是回答问题命令行方式您如果回答错了您就不能改正了哦(所以不推荐这种编译方式)make menuconfig和make xconfig提供了更友好操作方式不过make menuconfig需要ncurse包而make xconfig也需要某个东东好象是tk忘记了般都安装了俺就不提了如果没有您可没法运行哦.什么你不知道什么是ncurse和tk是什么?那我就不说了去www.google.com去搜索下吧...
这里边很多东东都要注意选啊这个要求您对硬件软件Software网络有认识实在不知道就按默认来吧.免得以后启动不了骂天骂地都没用哦我可是好多次启动不了最后才摸出窍门
这个不是这个帖子主题(其实我很想写但是没人合作个人写又太累再加上我最近也忙考试所以…)所以我们就略过哦…
在make menuconfig中让您选择[*],有让您选择[M],有让你选择,*表示选中直接加载进kernel,而M则表示会在后面make modules中编译成modules,让您随时可以通过insmod和modprobe调入内核…个人认为Linux这个功能确实非常非常棒…而这可是其他操作系统所没有哦. ..而make *config就是生成.config文件.至于想知道.config文件是干啥子下就知道了…J
这个步骤完成的后系统会提醒您next step you should run “make dep”
[color=red]4#make dep  [/color](到两分钟)
在确定要编译哪些东东的后(make *config)这个要确定依赖性这个东东手工也可以完成只是….怕您要把什么东东都放下然后花上十天半个月来搞还把您忙焦头烂额还会出错不过我们用这条指令就可以完成了也就不用麻烦您那么忙着搞了呵呵这个确定依赖性以后然后就要清除些东东了… 
[color=red]5#make clean  [/color](少于分钟)
清除些不必要文件那些乱 7 8糟东东是可能会导致您在编译过程中出现定要做哦…
[color=red]6#make bzImage[/color](15分钟左右)-
这个可是最最最重要啦.这个就是生成您新核心了不要告诉我您不知道核心是什么啊也就是kernel啦所有系统硬件软件Software交互都靠它了哦..

其实可以是make zImage但是你要确保您所编译这个新内核在640K的下您就可以使用make zImage,如果比640K大那就要用make bzImage您要说没编译出来咋知道多大呢?我看法是建议用bzImage,我编译出来内核般都是800~900K左右. …我是菜鸟本帖子也是为我菜鸟所写所以. ..咱们就默认make bzImage…
还要注意哦这段时间你是没法做事你会看见屏幕上字往下跑不用担心哦你可以选择把这些标准输出上东东都重定向到/dev/null去哦这样您就看不到这些东东了当然你也可以把它放在背景执行啊在运行要开始时候在后面加上个&符号这个表示是后台运行…如果您怕这些会对您编译内核有什么影响(其实没什么影响哦)那您干脆就这样按Alt+F2,直接打开另个虚拟终端在那里边做事等到编译完时候机器会咚声通知您您要真不想等就去玩会吧听听歌什么过会再回来这里可是考验您耐心时候哦如果这您都没耐心那后面还有个耗时步骤哦还是忍忍吧为了不让系统浪费资源你还是忍忍哦成功后您定会很高兴
假如您内核现在已经编译好了当然越小越好哦J,这时候系统会有个提示编译后bzImage放到哪里去了提示最后几行已经告诉了您新编译出核心位置啊般都在这里哦(我这里是RedHat9),/usr/src/linux-2.4.22/arch/i386/boot/,这时候您要做就是把它放到/boot目录底下去哦不然系统可没法启动
#cp /usr/src/linux-2.4.22/arch/i386/boot/bzImage /boot/vmlinuz-2.4.22
(这里其实已经把bzImage更名为vmlinuz-2.4.22,呆会在/boot/grub/grub.conf里就指定这个新内核)

[color=red]7#make modules[/color](耗费时间取决于您所选择编译为modules数量)
哇哇个耗费时间步骤来了您还是找点什么做做吧估计也要好久哦大概20分钟吧这个步骤就是把您在make menuconfig里边所选择为M东东,全部编译成模块并放在/usr/src/linux-2.4.22/下…如果你选择M比较多还是…去玩会吧家务没做啊?功课没做啊什么?不过如果您比较喜欢把所有东东都编进内核那就不需要多长时间少选些为M这样很快就可以完成只用了分钟就完成了不过如果您有很多不知道而选择默认那恐怕就要好花时间了. ..
[color=red]8#make modules_[/color]
hoho这里可是安装module步骤了您所选择模块编译完成后都放在/usr/src/linux-2.4.22某子目录下哪个子目录您看下就知道了make modules的后会有提示..我也忘记了呵呵:)这多不好而insmod以及相关指令都是从/lib/modules/linux-2.4.22下取module这个指令就是把编译好mod放到/lib/modules下去如果开始没有Linux-2.4.22目录(也就是说您是第次编译2.4.22内核)那么这条指令就会自动创建该目录如果已经有了那就会把编译后内核放进该目录 …您以后要把mod调进kernel时候(insmod,modprobe)都从这里寻找.o哦…
[color=red]注意[/color]哦如果你用是SCSI硬盘并且采用是ext3分区格式请注意定要制作initrd.img(SCSI卡驱动包括在这个里边)如果你使用是IDE硬盘您可以跳过这当然您要是有耐心这里学习下也没什么坏处哦
mkinitrd可以制作initrd.img,般是这么使用如果想具体了解可以man mkinitrd,如果只想搞个initrd.img出来那就mkinitrd /boot/initrd-custom.img 2.4.22就在/boot目录下创建了个initrd-custom.img文件也就是化镜像…(initialed ramdisk)…里边主要有些驱动放在内核中就显得过大所以编译进initrd.img在启动中释放…而这个2.4.22就表示/lib/modules下面2.4.22目录了…
到这里[color=olive]以下就有两种做法哦…[/color]
[color=olive]  手动更新.map文件[/color]
它是当前正在运行kernelfuctions介绍说明如果您编译内核后不更新.map,如果碰到问题.,Trouble shooting就很困难了哦您可有可能遇见很多烦人信息哦所以我们还是手动更新次哦也蛮简单
#cp /usr/src/linux-2.4.22/.map /boot/.map 
系统会提示您: 
Overwrite the ‘boot/.map’
敲入Y回车
[color=olive] 2 make [/color]
说到make 我们这里又有点话要说哦make 就相当于个自动化过程啦其他东东它都会帮您做好如果您确实比较懒或者已经对前边步骤已经很没耐心了您就直接执行此步骤吧…当然您可以很快做好新系统了而且可以重新从新内核启动哦但是您可能对这中间发生事情就不明白了哦小时侯上课时候老师谈什么要授的以渔而不要授的以鱼没办法您要是觉得麻烦俺就省了俺手还觉得累呵呵:)
还是谈谈这个过程吧这期间系统会把您当前release版本号后面加上个custom然后写到grub.conf里边去重新启动后您就可以看到2.4.22custom选单了 …
至于这个文件名是如何决定出来呢?您可以看看/usr/src/linux-2.4.22哦里边有个Makefile,您试
#head –n 5 Makefile
相信你已经看出来了吧…这也就是命名原因啦,于是您也可以自己修改您Linux哦…自己custom下release名称岂不爽哉…
从以上步骤来看基本上已经没有什么问题了当然请确认您在make menuconfig里边没有做过任何事情哦不然重新启动后依然引导不了譬如fs里边定要选中VFS,EXT3编译为M现在系统般都采用了ext3格式您要是漏掉这个东东加载不了分区可别怨我没告诉你哦当然second extended fs更是定要选啦:)
我在编译历史中曾经有VFS:Unable to mount root fs _disibledevent=>上边这行是指定kernel 路径记得我们前边生成个vmlinuz-2.4.22新内核吗?对了哦就是它了…这里指定为它后在您选择以这个选项启动后就会起用这里新内核了.
后面跟着ro 表示是readonly,就是只读意思咯root=LABEL=/是指定路径
initrd /initrd.img
这里要指定为您所制作initrd.img哦如果这个制作可启动不了哦…当然这说是您使用是SCSI硬盘如果是IDE硬盘您可以在这里写上no initrd取代这样系统就不会使用ird啦当然这个最好还是带着吧前边我们也讲了它作用了主要还是些驱动….以及系统
好了就到这里了…假如您有什么疑问在下面跟贴讨论啊:)
本来要有好长但是实在考试太多…又要忙着毕业…所以简短完成…对不住哦…有问题请发MAIL到j[email protected]讨论吧…

ps:如果谁有兴趣把make menuconfig全过成以及详细解释写出来那就最好了….
这个实在写太菜….等偶进步完善….有什么请大家斧正谢谢...

Tags:  linux2.6内核编译 如何编译linux内核 linux内核编译

延伸阅读

最新评论

发表评论