PC机上Linux内核升级
一、 准备工作
1. 编译环境准备
首先编译环境的搭建,我是从虚拟机下的redhat RHEL5.3的系统环境进行全部工作的,为了给编译内核一个干净的环境,我在虚拟机下重新安装了Redhat系统。现在比较流行的操作系统还有centos,Fedora,Debian等Linux操作系统
其次,从官网上下载最新稳定版内核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
解决方法:用虚拟机的光驱加载redhat的iso文件,在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目录下,同时生成链接文件vmlinuz和System.map分别指向vmlinuz-2.6.27.62和System.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版本的内核不通过,出现类型冲突错误,初步分析也许跟gcc,make,ld的版本有关系,网上有人说在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文件来支持内核的启动。