分类: 嵌入式
2017-02-04 10:44:14
编译内核。
第一步:下载源码并存入Linux目录,我是放到了/usr/src目录下,别的目录也可以。一般下载下来的源码都是文件名为"linux-$版本号.tar.bz2"的数据包格式,比如"linux-2.6.15.5.tar.bz2”。
第二步:将数据包解压。这里一定要注意,解压这个过程必须在linux内完成,不要在windows下解压,如果在windows下解压,编译内核的时候会出现error,提示缺少某些文件,这是因为在windows下,文件名是不区分大小写的,比如direct.c和Direct.c,而在Linux下却区分大小写。在解压过程中windows会把这两个文件解压成一个文件从而导致文件丢失。linux内核源码里同目录下有很多这样的"同名"文件。
对于 .tar.bz2 后缀的文件,用tar -jxvf来解压。如"tar -jxvf linux-2.6.15.5.tar.bz2",解压后会在当前目录中生成名为 "linux-2.6.15.5"的文件夹。
附:(关于tar命令的用法详解,参考http://www.cnblogs.com/eoiioe/archive/2008/09/20/1294681.html)
第三步:进入上一步生成的内核源码目录 cd linux-2.6.15.5
第四步:清除内核源码目录中可能存在的以前编译过程中留下的中间文件。
一般用make clean命令即可,也可用make distclean。
二者的区别:
make clean 只清除中间文件不清除配置文件。
make distclean 全部清除。
第五步:配置内核
此处有多个命令可用:
make config:这个命令最不好用,必须在命令行里根据提示一项一项的配置,而很多项我们可能根本不了解是什么意思。所以如果不是对内核特别了解别用这个命令。咱们这种菜鸟级的可以直接无视它。
make menuconfig:这个命令不错,推荐。跟make config相比用这个命令会有菜单项辅助我们配置,结构清晰。而且有默认设置供我们参考。
make oldconfig:比第一个好点,也是命令行输出提示信息,不过只提示新项的配置。也不好用
make Xconfig:适用于桌面系统,最直观。不过还是推荐用make menuconfig。
配置时,对于每一项,一般都有Y,M,N三种选择。选择Y表示Yes,就是将这一项编译到内核中;选择N表示不编译此项;选择M表示编译此项,但是不是直接编译到内核中,而是编译成内核模块。
配置完相应项后,保存设置。这时候内核源码目录项就多了个 .config 文件,该文件是隐藏的,要用 ls -a 才可以看到。.config文件保存了我们刚才的配置信息。
第六步:
一切就绪。开始编译内核,用到的命令:make zImage和make bzImage。在x86平台下,使用make zImage只能编译512K以内的内核,如果编译出的内核大于512K就会报错,而使用make bzImage则可以编译任意大小的内核(bzImage=big zImage)。在其他平台上,这两个命令没有区别。
进入内核源码目录,直接: make bzImage。这时系统开始编译我们再上一步配置过程中选择Y的项。
然后就是漫长的等待,红帽子开始刷屏:
这个时间段我们最好先玩点别的,因为这个编译过程的确很漫长。
二十分钟后,终于刷屏结束,内核编译完成:
这时源码目录下的 arch/
第七步:编译内核模块。用到的命令:make modules。同样是在源码目录下使用这个命令。这时系统开始编译我们在配置过程中选择M的项。
木有截图。
第八步:安装内核模块。用到的命令:make modules_install。这一步执行后系统会将内核模块从内核源码目录拷贝到 /lib/modules 下(该目录下会出现一个以内核版本号命名的文件夹,如"2.6.15.5")。
木有截图。
第九步:制作init ramdisk。用到的命令 mkinitrd。
如"mkinitrd initrd-2.6.15.5 2.6.15.5"
中间的initrd-2.6.15.5可任意命名,但最好命名成这样子,清晰易懂。而后面的2.6.15.5不能随便写,是那个版本就是那个版本,它对应的是上一步在/lib/modules目录中生成的文件夹。这一步执行后会在源码目录下生成initrd-2.6.15.5文件。
第十步:安装内核。
这一步需要先将第六步中编译生成的内核bzImage 或zImage文件拷贝到 /boot目录下(拷贝后的文件名任意,但最好命名成"vmlinuz-2.6.15.6"这种形式,习惯)。再将第九步生成
的源码目录下的initrd-2.6.15.5文件拷贝到/boot中。
然后修该启动文件grub.conf,此文件位于/etc下。
在grub .conf文件中添加如下内容(加入我要安装的是上面举例用的2.6.15.5版本,而且各文件名也如前所说)
--------------------------------------------------------------------------------
title MyOwnLinux #(此处名称任意)
root (hd0,0)
kernel /boot/vmlinuz-2.6.15.5 ro root=LABEL=/ rhgb quietselinux=0
#上面的就是拷贝到/boot文件夹中的内核
initrd /boot/initrd-2.6.15.5 #拷贝到/boot目录下的的init ramdisk。
---------------------------------------------------------------------------------
grub.conf文件的配置说明参见http://blog.csdn.net/zhuliting/article/details/5502636。
弄好这一切后,重启 reboot
然后就会看到这样的开机界面:
最后一张插图是我编译2.6.34.13时的插图。前面的几张是2.6.15.5的。由于2.6.15.5我用的源码不是官网下载的所以出现了很多问题没有成功,最后发现它的源码都有问题。所以大家一定要下载官网上的源码,稳定。
这里说一下,编译内核的过程到第七步就算完成了,第八步往后用到的"make modules_install"、"mkinitrd"等命令不属于“编译”内核的过程,而属于内核的安装。上面我编译完后的内核之所以可以直接安装在我的PC上,是因为我编译的是基于x86平台的Linux内核,而如果编译过程选择的是其他的平台比如arm,编译出来的内核就不能直接往PC上安装了。编译内核时默认的是基于x86平台。编译基于其他平台的Linux内核的方法在 “【学习笔记】编译Linux内核(下)”中会提到。