linux内核编译

PC机上Linux内核升级

一、        准备工作

1.        编译环境准备

首先编译环境的搭建,我是从虚拟机下的redhat RHEL5.3的系统环境进行全部工作的,为了给编译内核一个干净的环境,我在虚拟机下重新安装了Redhat系统。现在比较流行的操作系统还有centosFedoraDebianLinux操作系统

 

其次,从官网上下载最新稳定版内核http://www.kernel.org/选择好版本后,下载Full Source 全部的源码。

 

2.        下载解压内核文件

 

(编译linux3.3.5的内核会出现类型冲突错误,原因是当前Linux系统的c库版本低,参见http://www.oschina.net/question/181920_59668  当编译3.x以上的内核都会出现以上的错误,故采用2.6.27.62的内核进行编译)

 

把下载的内核文件inux-2.6.27.62.tar.bz2放到系统里面,我的路径是/home/xiaoxiao 将文件解压出来:

#cd /home/xiaoxiao

#tar –xvfj linux-2.6.27.62.tar.bz2 解压完成后,会生成一个linux-2.6.27.62目录。

解压参数说明:

-x解压;-v输出信息;-f 指定解压文件;-j 针对.bz2文件解压

 

3.        内核升级工具下载安装

initrd:Linux初始 RAM磁盘(initrd)是在系统引导过程中挂载的一个临时根文件系统,用来支持两阶段的引导过程。初始 RAM磁盘(initrd)是在实际根文件系统可用之前挂载到系统中的一个初始根文件系统。initrd与内核绑定在一起,并作为内核引导过程的一部分进行加载。内核然后会将这个 initrd文件作为其两阶段引导过程的一部分来加载模块,这样才能稍后使用真正的文件系统,并挂载实际的根文件系统。

在桌面或服务器Linux 系统中,initrd 是一个临时的文件系统。其生存周期很短,只会用作到真实文件系统的一个桥梁。在没有存储设备的嵌入式系统中,initrd 永久的根文件系统。

在进行内核编译时,需要进行制作initrd.img.在Fedora下面一般是用mkinitrd,而在Ubuntu/Debian下是用mkintramfs.

从网上下载升级工具:module-init-tools-3.5.tar.bz2

将文件解压,进入目录后,执行命令安装;

# tar jvxf module-init-tools-3.5.tar.bz2 (解压module-init-tools) 
# cd module-init-tools-3.2 (
/usr/src目录进入module-init-tools目录下)
#./configure --prefix=/ 

这样就安装好了,可以用mkinitrd –help 查看是否安装成功

 

二、        内核定制

 

1.      内核定制配置

# cd /home/xiaoxiao/linux-2.6.27.62 (进入到/home/xiaoxiao/linux-2.6.27.62目录下)
# make mrproper (
该命令可确保源代码目录下没有不正确的.o文件)
# make menuconfig (
配置内核各选项)

 

配置内核可以根据需要与爱好使用下面命令中的一个:
#make config(基于文本的最为传统的配置界面,不推荐使用)
#make menuconfig(基于文本选单的配置界面,字符终端下推荐使用)
#make xconfig(基于图形窗口模式的配置界面,需要QT开发库的支持,Xwindow下推荐使用)
#make oldconfig(如果只想在原来内核配置的基础上修改一些小地方,会省去不少麻烦)
  这三个命令中,make xconfig的界面最为友好,如果你可以使用Xwindow,那么就推荐你使用这个命令。 如果你不能使用Xwindow,那么就使用make menuconfig好了。界面虽然比上面一个差点,总比make config的要好多了。

具体的内核配置选项请参见其它参考资料,这里我们可以使用默认配置即可。

 

注意:即时只用默认配置,我们也要make menuconfig下,进入图形界面后也要保存退出,保存退出后会在当前目录下产生一个.config配置文件,下一步的make bzImage就会根据这个配置文件来进行内核编译工作,否则不能进行编译工作)

 

 

@1. 注意:我采用的redhat5.3 make menuconfig时会出现这种错误

 

[root@localhost linux]# make menuconfig

  HOSTCC  scripts/basic/fixdep

  HOSTCC  scripts/kconfig/conf.o

 *** Unable to find the ncurses libraries or the

 *** required header files.

 *** 'make menuconfig' requires the ncurses libraries.

 ***

 *** Install ncurses (ncurses-devel) and try again.

 ***

make[1]: *** [scripts/kconfig/dochecklxdialog] Error 1

make: *** [menuconfig] Error 2

 

由于redhat系统默认没有安装ncurses所以找不到ncurses libraries

解决方法:用虚拟机的光驱加载redhatiso文件,在iso文件的Server文件夹中有很多你所需要的安装程序。

进入Server目录:cd /media/RHEL_5.4 i386 DVD/Server

使用命令: ls -al | grep ncurses 即可找到所需要安装的程序

使用命令:“rpm -ivh 文件名  ”即可安装。

 

三、        内核以及模块的编译安装

1.      编译内核及模块

/home/xiaoxiao/linux-2.6.27.62目录下,执行以下命令即可编译。编译需要一段时间,给自己倒杯茶耐心等候吧!
# make dep (建立编译时所需的从属文件。注意:如果内核从未编译过,此步可跳过)
# make clean (
清除内核编译的目标文件。注意:如果内核从未编译过,此步可跳过)
# make bzImage (
注意大小写。这一步才是真正编译内核)

# make modules (编译可加载模块)

 

内核编译成功后,会在/home/xiaoxiao/linux-2.6.27.62/arch/x86/boot目录中生成一个新内核的映像文件bzImage

 

2.      安装模块及内核文件(安装过程中一定要保证根分区有足够的空间!)

# make modules_install (安装可加载模块)
安装成功后,系统会在/lib/modules目录下生成一个2.6.27.62子目录,里面存放着新内核的所有可加载模块。
# make install (安装新内核)

       make install命令会自动将编译生成的Linux系统内核(/home/xiaoxiao/linux-2.6.27.62/arch/x86/boot/compressed/vmlinux)和符号文件(/home/xiaoxiao/linux-2.6.27.62/System.map)拷贝到/boot目录下,同时生成链接文件vmlinuzSystem.map分别指向vmlinuz-2.6.27.62System.map-2.6.27.62文件;并在/boot的目录下自动生成内核引导临时根文件系统(initrd-2.6.27.62.img)并且将修改 grub配置文件(/boot/grub/grub.conf)引导项,重写引导记录。

 

查看此grub文件的配置内容:

default=1

timeout=5

splashimage=(hd0,0)/grub/splash.xpm.gz

hiddenmenu

title Red Hat Enterprise Linux Server (2.6.27.62)

        root (hd0,0)

        kernel /vmlinuz-2.6.27.62 ro root=LABEL=/ rhgb quiet

        initrd /initrd-2.6.27.62.img

title Red Hat Enterprise Linux Server (2.6.18-164.el5)

        root (hd0,0)

        kernel /vmlinuz-2.6.18-164.el5 ro root=LABEL=/ rhgb quiet

        initrd /initrd-2.6.18-164.el5.img

发现已经将2.6.27.62的内核的引导添加到grub文件中,手动将hiddenmenu注释掉(在行首添加一个#号),否则系统重新启动后不能显示grub菜单。

 

四、        内核的启动

1.      启动2.6.27内核

重新启动虚拟机系统,将会出现grub的引导菜单,通过键盘的上下键来选择2.6.27.62的内核启动。

进入系统后使用命令查看内核的版本号;

#uname –a

Linux localhost.localdomain 2.6.27.62 #1 SMP Wed Sep 12 01:31:11 PDT 2012 i686 i686 i386 GNU/Linux

可以看到内核2.6.27.62已经启动,至此大功告成。

 

五、        相关知识

1.     相关编译工具版本

本次内核编译新内核所涉及软件版本

“gcc –version”可查寻GCC版本 “make –v”可查询 Gnu make版本

“ld –V(v)可查询GNU ld版本

“fdformat --version”命令检查 util-linux版本

“insmod –V”检查module-init-tools 版本-

“tune2fs –version”命令可检查 tune2fs 版本

“pppd --version”命令可检查pppd version 2.4.4

“isdnctrl 2>&1|grep version” 命令可检查isdnctrl version 3.9

 

注:之前编译3.5版本的内核不通过,出现类型冲突错误,初步分析也许跟gccmakeld的版本有关系,网上有人说在centos6.0下可以编译通过,故装了个centos6.3系统验证了一下,结果表明3.5内核能编译通过。

现在比较一下redhat RHEL5.3 centos6.3 相关的版本信息:

redhat RHEL5.3

# gcc --version

gcc (GCC) 4.1.2 20080704 (Red Hat 4.1.2-46)

Copyright (C) 2006 Free Software Foundation, Inc.

# make -v

GNU Make 3.81

#ld -V

GNU ld version 2.17.50.0.6-12.el5 20061020

CentOs6.3

# gcc --version

gcc (GCC) 4.4.6 20120305 (Red Hat 4.4.6-4)

# make -v

GNU Make 3.81

ld -V

GNU ld version 2.20.51.0.2-5.34.el6 20100205

  Supported emulations:

   elf_i386

   i386linux

   elf_x86_64

   elf_l1om

 

2.      vmlinux vmlinuz bzimage zimage 区别和联系

 

在编译内核的过程中会产生这几种内核映像文件

 

vmlinuz 是可引导的、压缩的内核。“vm”代表“Virtual Memory”。Linux 支持虚拟内存,不像老的操作系统比如DOS有640KB内存的限制。Linux能够使用硬盘空间作为虚拟内存,因此得名“vm”。vmlinuz是可执行 的Linux内核,它位于/boot/vmlinuz,它一般是一个软链接。

vmlinuz 的建立有两种方式。一是编译内核时通过“make zImage”创建,然后通过:“cp /usr/src/linux-2.4/arch/i386/linux/boot/zImage /boot/vmlinuz”产生。zImage适用于小内核的情况,它的存在是为了向后的兼容性。二是内核编译时通过命令make bzImage创建,然后通过:“cp /usr/src/linux-2.4/arch/i386/linux/boot/bzImage /boot/vmlinuz”产生。bzImage是压缩的内核映像,需要注意,bzImage不是用bzip2压缩的,bzImage中的bz容易引起 误解,bz表示“big zImage”。 bzImage中的b是“big”意思。

zImage(vmlinuz)和bzImage(vmlinuz)都是用gzip压缩的。它们不仅是一个压缩文件,而且在这两个文件的开头部分内嵌有gzip解压缩代码。所以你不能用gunzip 或 gzip –dc解包vmlinuz。

内 核文件中包含一个微型的gzip用于解压缩内核并引导它。两者的不同之处在于,老的zImage解压缩内核到低端内存(第一个640K),bzImage 解压缩内核到高端内存(1M以上)。如果内核比较小,那么可以采用zImage 或bzImage之一,两种方式引导的系统运行时是相同的。大的内核采用bzImage,不能采用zImage。

vmlinux是未压缩的内核,vmlinuz是vmlinux的压缩文件。

vmlinux 是ELF文件,即编译出来的最原始的文件。
vmlinuz应该是由ELF文件vmlinux经过OBJCOPY后,并经过压缩后的文件
zImage是vmlinuz经过gzip压缩后的文件,适用于小内核
bzImage是vmlinuz经过gzip压缩后的文件,适用于大内核

通常情况下是不能用vmlinuz解压缩得到vmlinux的

 

3.      grub.conf 文件解释

 

default=1

timeout=5

splashimage=(hd0,0)/grub/splash.xpm.gz

hiddenmenu

title Red Hat Enterprise Linux Server (2.6.27.62)

          root (hd0,0)

          kernel /vmlinuz-2.6.27.62 ro root=LABEL=/ rhgb quiet

          initrd /initrd-2.6.27.62.img

       title Red Hat Enterprise Linux Server (2.6.18-164.el5)

           root (hd0,0)

          kernel /vmlinuz-2.6.18-164.el5 ro root=LABEL=/ rhgb quiet

       initrd /initrd-2.6.18-164.el5.img

 

       default: 表示默认启动的操作系统,0表示第一个,1表示第二个,依次类推…

这里是default=1,表示默认启动Red Hat Enterprise Linux Server (2.6.18-164.el5)内核的操作系统

timeout:  超时时间,表示的是出现GRUB界面后,无操作情况下进入default设定的操作系统的时间,如果上下移动选择,则该选项无效

splashimage指定启动菜单的背景文件(xpm 图像或其gzip 压缩文件)

Hiddenmenu: 表示隐藏GRUB的启动菜单,直接进入由default庙宇的操作系统中去,为一可选项,删除该项,就可以在开机时显示grub菜单。

title定义启动操作系统的菜单项名称;

root (hd0,0): 设置 Grub 的根设备 (root) Linux 内核所在分区;

kernel: 后跟 Linux 内核文件为参数,加载 Linux 内核文件;

initrd后跟initrd文件,加载initrd文件系统,用于引导内核的一部分。

 

grub相关资料可参考:

http://blog.csdn.net/zhuliting/article/details/5502636

http://blog.163.com/rao_warrior/blog/static/137801616201022110402347/

 

六、        PC机上Linux内核升级小结

经过一天的努力,终于在RHEL5.3的系统上成功升级内核,虽然只是从2.6.18升级到2.6.27 ,由于在该系统上编译3.5内核出错(原因已经在第五节分析过了),故升级了2.6.27的版本。编译的过程中,跳过了一个重要的过程,那就是内核的定制,这个需要花更多的时间去搞清楚这些配置选项的功能。

现在抛开Linux内核配置,编译的过程中主要遇到了这几个问题:

第一个是在第二页中已经描述(@1);

第二个是Linux系统分区的空间问题,我在重装的centos系统中安装3.5内核时,/boot目录已经使用100%,所以在安装操作系统的时候注意手动分区,预留足够大的空间。

第三个是一定要安装mkinitrd软件包,参见第一页。make install 的过程中,会调用这个工具来生成initrd文件来支持内核的启动。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值