最近研究了一下Linux内核的[color="#ff0000"]编译,有些许心得,望同大家分享一下,故有此文…我们这里要谈的不涉及到源码,只是一些内核[color="#ff0000"] 编译的步骤及相关知识…因为本人是菜鸟。所以,也就希望和菜鸟们分享一下… 首先,您要确定您有一台装有Linux的系统,编译内核可以在本机上直接对本机内核进行[color="#ff0000"] 编译,也可以从网上下载内核在其基础上进行[color="#ff0000"] 编译.我们这里详细讲一下升级内核的方法, 您可以从www.kernel.org下载到最新的Kernel版本,我们这里以RedHat9为例(其他版本其实也都一样,只是在make menuconfig中有点不同),详细讲一下内核[color="#ff0000"]编译的步骤 : 首先,确认您是以[color="red"]root 用户登陆.把内核源码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.22的kernel) 解压缩之,熟悉linux系统的朋友应该会知道: bunzip2 ***.tar.bz2 | tar xvf 进入到/usr/src/linux-2.4.22目录,,请确定您是在此目录下操作,而且保证您所敲入的命令是正确的,不然会返回No rule to make target ***,stop类似的错误提示,这可是菜鸟们所要注意的哦。不然开头搞不好。后面就不用谈了哦… 1#cd /usr/src/linux-2.4.22 2#make mrproper 其实这个步骤是可以不用要的,这个目的是清除原先此目录下残留的.config和.o(object文件),如果我们是刚下载的源码,那么这一步您就可以省了:),但是如果您已经[color="#ff0000"]编译过多次内核的话,这一步可是一定要的哦,不然以后出现很多小问题,可别怨我没告诉你….config文件我们会在后面提到… [color="red"]3#make menuconfig或make config或make xconfig 这就开始[color="#ff0000"]编译内核了,打起十二分精神,[color="#ff0000"] 编译不好,系统是无法启动的啦.小心应付,其实这个步骤还有其他两种方式,make config以及make xconfig,make config是一个一个的回答问题,命令行方式,您如果回答错了一个,您就不能改正了哦(所以不推荐这种[color="#ff0000"] 编译方 式),make menuconfig和make xconfig提供了更友好的操作方式,不过make menuconfig需要ncurse包,而make xconfig也需要某个东东,好象是tk,忘记了,一般都安装了,俺就不提了,如果没有您可没法运行的哦.什么你不知道什么是ncurse和tk是什 么?那我就不说了,去www.google.com去搜索一下吧... 这里边很多东东都要注意选啊,这个要求您对硬件,软件,网络有一定的认识,实在不知道就按默认的来吧.免得以后启动不了骂天骂地都没用哦,我可是好多次启动不了,最后才摸出窍门的… 这个不是这个帖子的主题(其实我很想写的,但是没人合作,一个人写又太累,再加上我最近也忙考试,所以…)所以我们就略过哦… # 在make menuconfig中,有的让您选择,有的让您选择[M],有的让你选择[],*表示选中直接加载进kernel,而M则表示会在后面的make modules中[color="#ff0000"] 编译成modules, 让您随时可以通过insmod和modprobe调入内核…个人认为Linux的这个功能确实非常非常的棒…而这可是其他操作系统所没有的哦. ..而make *config的目的就是生成.config文件.至于想知道.config文件是干啥子的,看一下就知道了…J 这个步骤完成之后,系统会提醒您,next step you should run “make dep” [color="red"]4#make dep (一到两分钟) 在确定要[color="#ff0000"]编译哪 些东东之后(make *config),这个要确定依赖性,这个东东,手工也可以完成的,只是….怕您要把什么东东都放下,然后花上十天半个月的来搞,还把您忙的焦头烂额,还 会出错,不过我们用这条指令就可以完成了,也就不用麻烦您那么忙着搞了,呵呵,这个确定依赖性以后,然后就要清除一些东东了… [color="red"]5#make clean (少于一分钟) 清除一些不必要的文件,那些乱七八糟的东东是可能会导致您在[color="#ff0000"]编译过程中出现错误的哦,一定要做哦… [color="red"]6#make bzImage(15分钟左右)- 哦,这个可是最最最重要的啦.这个就是生成您的新核心了,不要告诉我您不知道核心是什么啊,也就是kernel啦,所有的系统硬件软件交互都靠它了哦.. 其实可以是make zImage的,但是你要确保您所[color="#ff0000"]编译的这个新内核在640K之下,您就可以使用make zImage,如果比640K大,那就要用make bzImage,您要说没[color="#ff0000"] 编译出来咋知道多大呢?我的看法是建议用bzImage,因为我[color="#ff0000"]编译出来的内核一般都是800~900K左右. …我是菜鸟,本帖子也是为我一样的菜鸟所写,所以. ..咱们就默认make bzImage… 还要注意哦,这段时间你是没法做事的,你会看见屏幕上一行一行的字往下跑,不用担心哦,你可以选择把这些标准输出上的东东都重定向到/dev/null去 哦,这样您就看不到这些东东了,当然,你也可以把它放在背景执行啊,在运行要开始的时候在后面加上一个&符号,这个表示是后台运行…如果您怕这些 会对您[color="#ff0000"]编译内核有什么影响(其实没什么影响哦),那您干脆就这样,按Alt+F2,直接打开另一个虚拟终端,在那里边做事,等到[color="#ff0000"] 编译完的时候。机器会咚的一声通知您的哦,您要真不想等的话,就去玩会吧,听听歌什么的,过会再回来,这里可是考验您耐心的时候哦,如果这您都没耐心,那后面还有个耗时的步骤哦,还是忍忍吧,为了不让系统浪费资源,你还是忍忍哦,成功后您一定会很高兴的… 假如您的内核现在已经[color="#ff0000"]编译好了,当然越小越好哦J,这时候系统会有个提示[color="#ff0000"]编译后的bzImage放到哪里去了,提示最后几行,已经告诉了您的新[color="#ff0000"]编译出的核心位置啊,一般都在这里哦(我这里是 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="#ff0000"]编译为 modules的数量) 哇哇,又一个耗费时间的步骤来了,您还是找点什么做做吧,估计也要好久哦,大概20分钟吧,这个步骤就是把您在make menuconfig里边所选择为M的东东,全部[color="#ff0000"]编译成 模块并放在/usr/src/linux-2.4.22 /下…如果你选择的M比较多的话,还是…去玩会吧,家务没做啊?功课没做啊什么的?不过如果您比较 喜欢把所有东东都编进内核的话,那就不需要多长时间,少选一些为M,这样很快就可以完成,我的只用了一分钟就完成了,不过如果您有很多不知道而选择默认的 话,那恐怕就要好花时间了. .. [color="red"]8#make modules_install hoho,这里可是安装module的步骤了,您所选择的模块[color="#ff0000"]编译完 成后都放在/usr/src/linux-2.4.22某子目录下,哪个子目录您看一下就知道了,make modules之后会有提示的..我也忘记了,呵呵:),这多不好,而insmod以及相关指令都是从/lib/modules/linux- 2.4.22下取module的啊,这个指令就是把[color="#ff0000"]编译好的mod 放到/lib/modules下去的哦,如果开始没有Linux-2.4.22目录,(也就是说您是第一次编译2.4.22的内核),那么这条指令就会自动创建该目录,如果已经有了。那就会把[color="#ff0000"] 编译后的内核放进该目录 …您以后要把mod调进kernel的时候(insmod,modprobe)都从这里寻找.o的哦… [color="red"]注意哦,如果你用的是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)…里边主要有一些驱动,因为放在内核中就显得过大,所以[color="#ff0000"]编译进 initrd.img,在启动中释放…而这个2.4.22就表示/lib/modules下面的2.4.22目录了… 到这里,[color="olive"]以下就有两种做法哦… [color="olive"]一 手动更新System.map文件 它是当前正在运行的kernel的fuctions的说明,如果您[color="#ff0000"]编译内核后不更新System.map,如果碰到问题.,Trouble shooting就很困难了哦,您可有可能遇见很多烦人的信息哦,所以我们还是手动更新一次哦,也蛮简单的… #cp /usr/src/linux-2.4.22/System.map /boot/System.map 系统会提示您: Overwrite the ‘boot/System.map’ 敲入Y,回车 [color="olive"]二 make install 说到make install我们这里又有点话要说哦,make install就相当于一个自动化的过程啦,因为其他东东它都会帮您做好的,如果您确实比较懒,或者已经对前边的步骤已经很没耐心了,您就直接执行此步骤 吧…当然您可以很快做好新系统了,而且可以重新从新内核启动哦,但是您可能对这中间发生的事情就不明白了哦,小时侯上课的时候老师谈什么要授之以渔,而不 要授之以鱼,没办法。您要是觉得麻烦,俺就省了,俺手还觉得累,呵呵:) 还是谈谈这个过程吧,这期间,系统会把您的当前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更是一定要选啦:) 我在[color="#ff0000"]编译的历史中曾经有VFS:Unable to mount root fs on 00:00的经历,一直卡在那里,好久都没解决啊,不过后来终于发现应该是fs的问题,或者是您的 root分区没指定好啊.. 看了这么多。相信您也很累了,帖子也快到头了,因为马上就要完了…(如果上边您选择了make install,这里您就不用看了哦)最最最最后一点,我们要修改Grub.conf(如果您采用的是grub来引导的话,抱歉我不懂lilo,因为我也 是菜鸟…),使系统在重新启动后可以从新的内核启动… #vi /boot/menu.lst menu.lst跟grub.conf内容是一样的哦,是个link,不过这里边可是彩色的文字,我很喜欢,就编辑它了.. 在原来的基础上添加一行: title new Linux(2.4.22) //这里您可以自己命名,也就是出现在grub启动菜单里的东东哦 kernel /vmlinuz-2.4.22 ro root=LABEL=/ 上边这行是指定kernel 的路径,记得我们前边生成一个vmlinuz-2.4.22的新内核吗?对了哦,就是它了…这里指定为它后,在您选择以这个选项启动后,就会起用这里的新内核了. 后面跟着的ro 表示是readonly,就是只读的意思咯,root=LABEL=/是指定路径 initrd /initrd.img 这里要指定为您所制作的initrd.img哦,如果这个制作错误的话,可启动不了的哦…当然,这说的是您使用的是SCSI硬盘,如果是IDE硬盘的话。 您可以在这里写上no initrd取代,这样系统就不会使用intird啦,当然这个最好还是带着吧,前边我们也讲了它的作用了,主要还是一些驱动….以及系统初始化的程序… 好了,就到这里了…假如您有什么疑问,在下面跟贴讨论啊:) 本来要有好长的,但是实在因为考试太多…又要忙着毕业…所以简短的完成…对不住哦…有问题请发MAIL到newjintao@yahoo.com.cn讨论吧 -------------------------------------------------------- debian下编译2.6.13.2内核的步骤及感受 http://www.linuxdiyf.com/viewarticle.php?id=8281 编译内核是每一个真正使用linux的用户一定要过的一道关。 linux的无穷魅力就在于用户可以根据自己的需要按需定制一个适合自已的内核。 还有新的硬件老的内核不能识别的话,编译一个新版的内核没准就能识别。 两个星期前我还对编译内核一无所知的,经过一个高手师兄的指点,现在总算可以 顺利编译内核了。 编译内核的主要步骤: 1 到 www.kernel.org 上下载内核源码,目前已经更新到2.6.13.4 但由于教育网不能随便访问国外网站,我到ftp.tsinghua.edu.cn 下载了一个2.6.13.2的内核。反正我的机器是IBM的老PII本子,kernel的新功 能一般用不上,主要是定制一个比较精简的内核,把用不到的东西去掉,节省资 源 2 下载linux-2.6.13.2.tar.gz到本地目录,我下到了root目录。我看很多人都 放在/usr/src下,可能是习惯问题吧。 3 解压缩:tar zxvf linux-2.6.13.2.tar.gz 4 这时root目录下会出现linux-2.6.13.2子目录 5 进入linux-2.6.13.2目录,make menuconfig 关键的一步,编译内核的成败全在这一步了。只要少选了什么重要的东西, 新kernel就要panic了。 6 配置完后会在当前目录下面生成一个.config文件。此文件具有隐藏属性 可以用ls -a查看,刚才编的配置文件都保存在这个文件 7 make 编译过程,最漫长的过程,建议找个地方看看书过两个小时再回来 我的CPU比较慢,所以我都是在宿舍晚上make menuconfig ,之后我就睡觉,让 我的本本自己compile,等到第二天早上肯定能编译好。 8 make modules_install 安装配置的模块 9 make install 执行完后会在/boot目录下面生成一个vmlinuz-2.6.13.2 同时在/arch/i386/boot/下面生成一个bzImage,我看了一下,跟vmlinuz-2. 6.13.2是一样大小的,所以推测可能就是一样的文件。 10 mkinitrd -o /boot/initrd.img-2.6.13.2 关于这个文件,我看了很多论坛的 帖子,但还是不太清楚这个东西是干什么用的,听说如果编译时不选择ramdisk就 不需要。 11 修改/boot/grub/menu.lst 加载新内核 12 reboot 编译内核的感受:我从国庆假期就在实验室一直在研究编译内核,经常到论坛上看相关 的帖子,或者用百度搜资料。我用的版本是hiweed Debian linux 0.7。研二的师兄告 诉我Debian下面用标准方式很难编译成功。但我就是觉得Debian的编译方式不如标准方 式用着顺手。在假期里我编了两次都失败了,Debian的方式我也试过,安装完内核后会 把我的Windows选项清掉。假期过完了,又接着编译,又编译了两次,每次还都是这个 错误 VFS:Connot open root device "hda12" or unknown-block(0,0) kernel panic--not syncing:VFS:Uable to mount root fs on unknown-block(0,0) VFS老师讲过是底层的物理设备和上层用户间通信的一个逻辑的过渡层。网友提供的一些 解决方法: 原因一:ext2文件格式支持没有编译进内核,不论你使用ext3或其它文件格式,ext2支持都 必须直接编译进内核,不能以内核模块形式编译。 原因二:如果使用initrd.img启动系统,则cromfs必须编译 cromfs在哪里配置我没有找到,但我把关于ATA/IDE/SATA/SCSI的选项都编译进内核就解决 了,不过到现在也不知道什么原因。 编译内核的苦恼就是每次配置都有很多选项要选,很多选项都不知道是做什么用的,去掉 以后会有什么后果,师兄告诉我很多看似无关的选项去掉后就是启动不起来。还有我用的 hiweed debian版本无法安装QT库和GTK库,上论坛发帖子求教也没有求教出结果,到baidu 上搜了一下也没有相关的资料,以前鄙视red hat丑陋的界面,现在开始羡慕red hat的 方便了,只要在安装时选择上Gnome 开发包就行了。而且关于2.6内核的配置资料很少的。 不过有忧必有喜,自己编译内核毕竟有成就感,很多没有用的模块我都没有编译进内核,启 动时快了很多。真正感觉到了It's my kernel!选上Frame Buffer,这样在Terminal里面 和文本模式下面就可以利用zhcon来显示中文了,把Embed fonts选中,这样启动时界面漂亮 很多的,还会显示企鹅。自己编的内核连启动界面都美化了剩下的事情就是阅读源码,真正 明白linux。 的原理,从而更深层次的了解操作系统。
菜鸟编译Linux内核
最新推荐文章于 2024-08-26 19:45:00 发布