作者:勒托
原文地址:http://blog.sina.com.cn/s/blog_43b8d6c20100b4me.html
一、 做准备
首先就是上google了,毕竟是第一次内核升级,搞不好是要出问题的,大概看了两篇不错的文章:
LINUX内核及升级简介
手把手教你内核升级
二、总结实践
1.Linux内核结构
首先我们介绍一下Linux内核的结构,Linux内核主要由五个部分组成:进程调度,内存管理,虚拟文件系统,网络接口,进程间通信。
1.1进程调度(SCHED):控制进程对CPU的访问。当需要选择下一个进程运行时,由调度程序选择最值得运行的进程。可运行进程实际上是仅等待CPU资源的进程,如果某个进程在等待其它资源,则该进程是不可运行进程。Linux使用了比较简单的基于优先级的进程调度算法选择新的进程。
1.2 内存管理(MM)允许多个进程安全的共享主内存区域。Linux的内存管理支持虚拟内存,即在计算机中运行的程序,其代码,数据,堆栈的总量可以超过实际内存的大小,操作系统只是把当前使用的程序块保留在内存中,其余的程序块则保留在磁盘中。必要时,操作系统负责在磁盘和内存间交换程序块。内存管理从逻辑上分为硬件无关部分和硬件有关部分。硬件无关部分提供了进程的映射和逻辑内存的对换;硬件相关的部分为内存管理硬件提供了虚拟接口。
1.3 虚拟文件系统(Virtual FileSystem,VFS)隐藏了各种硬件的具体细节,为所有的设备提供了统一的接口,VFS提供了多达数十种不同的文件系统。虚拟文件系统可以分为逻辑文件系统和设备驱动程序。逻辑文件系统指Linux所支持的文件系统,如ext2,fat等,设备驱动程序指为每一种硬件控制器所编写的设备驱动程序模块。
1.4网络接口(NET)提供了对各种网络标准的存取和各种网络硬件的支持。网络接口可分为网络协议和网络驱动程序。网络协议部分负责实现每一种可能的网络传输协议。网络设备驱动程序负责与硬件设备通讯,每一种可能的硬件设备都有相应的设备驱动程序。
1.5 进程间通讯(IPC) 支持进程间各种通信机制。
2.为什么要升级内核
从字面意思我们可以看出,Linux的内核承担着Linux操作系统的最为核心的任务,是其它程序和硬件等运行过程中的仲裁者:它要管理所有进程的内存,保证它们都能平等得到处理器的时隙。此外,它还提供程序和硬件之间的接口等功能。
通常,更新的内核会支持更多的硬件,具备更好的进程管理能力,运行速度更快、更稳定,并且一般会修复老版本中发现的许多漏洞等,经常性地选择升级更新的系统内核是Linux使用者的必要操作内容。
一般,内核的版本序列号使用三个数字表示,如2.4.8,版本号越高表示功能越强。版本号分为两个系列:一种是产品系列,以偶数命名,例如,1.2.x、2.0.x、2.2.x等,运行稳定,已经经过较为周密的测试;另外一种是开发测试系列,以奇数命名,用以进行最新功能的测试,不建议初学者和生产过程中使用。
3.让我们开始行动
3.1 利其器,首先我们的准备好要用的工具,有如下四个
module-init-tools
mkinitrd
lvm2
device-mapper
可以用rpm -qa *来查询,如果是fc8的话应该已经安装好了,版本嘛,不要太老的过分就好了
3.2下载你需要的内核源码
http://www.kernel.org/pub/linux/kernel/v2.6/这里面找去吧
要查看你自己的版本可以uname -r
3.3处理源码
1》# cd /usr/src (进入到/usr/src目录下,如果已经在/usr/src目录下,可不执行该命令)
# rm -rf linux (删除linux文件夹。值得一提的是,如果内核先前从未编译过,则没有这个文件夹,此 命令行可略过)
# tar jvxf linux-2.6.25.14.tar.bz2 (解压新内核)
# ln -s linux-2.6.25.14linux (重新生成linux文件夹)
Linux系统的核心代码存放于目录/usr/src/linux,实际上,该目录是一个链接,指向当前所用的核心版本的目录,例如如果当前使用的版本是 2.4,则该核心的实际目录应该是:/usr/src/linux-2.4,而新下载的内核中的目录是linux,这样,直接在/usr/src下解包会导致原来的内核目录被覆盖。所以稳妥的做法是,首先删除链接linux,然后解包、更名、重新链接。在解包前要确认在/usr/src目录下没有叫linux的目录,或者不再想保留该目录。
2》配置内核选项。有点繁琐,~~希望一次成功哦~~。
# cd linux-2.6.25.14(进入到/usr/src/linux-2.6.25.14目录下)
# make mrproper (该命令可确保源代码目录下没有不正确的.o文件)
# make menuconfig (配置内核各选项)
此时会出现一个图形界面,列出了所有的内核配置选项,有的选项下还有子选项,你可以用方向键来选择,用Y键来确定。经过我多次试验,大多数选项默认就行,以下几个选项必须选择(请认真核对下面每一个选项,否则编译很有可能前功尽弃):
(1)Loadable Module support选项中,选上“Module unloading”和“Automatic kernel module loading”这两项;
(2)Device Drivers--->Block Devices中选上“Loopback device support”;
Device Drivers--->Multi-device support(RAID and LVM)处要选上“device mapper support”;
Device Drivers--->Graphics support,一定要选上“ Support for frame buffer devices”;
Device Drivers --->USB support --->选上“USB Mass Storage support”(如果是在实环境中,想要更多USB支持,就全选吧。我的是在虚拟机中,用不着了)
Device Drivers --->;Network device support --->Ethernet (10 or 100Mbit) ---><*> AMD PCnet32 PCI support
(3)File system--->(以下9个选项是关于ext2和ext3文件系统配置,全部选上)
Second extended fs support
Ext2 extended attributes
Ext2 POSIX Access Control Lists
Ext2 Security Labels
Ext3 journalling file system support
Ext3 extended attributes
Ext3 POSIX Access Control Lists
Ext3 Security Labels
JBB (ext3) debugging support
File system--->DOS/FAT/NT Filesystems --->选上“NTFS file system support”;
注意:
ext2和ext3文件系统配置很重要,也是必需的,如果对Ext3、Ext2文件的支持直接编译进内核,在你reboot时机器就会当掉,出现如下错误信息:
kernel panic : no init found ,try passing init = option to kernel.....
或者是:
VFS:Cannot open root device "hdxy" or unknow-block(0,0)
Please append a correct "root=" boot option
kernel panic:VFS:Unable to mount root fs on unknown-block(0,0)
或者是:
mount: error 19 mounting ext3
pivotroot: pivot_root(/sysroot,/sysroot/initrd) failed: 2
umount /initrd/proc fail: 2
Freeing unused kernel memory: 244k freed
Kernel panic - not syncing: No init found. Try passing init = option to kernel
(我的机器就是在重启之后出现第三种错误,进不去系统,郁闷死,只好重装了~~~如果依照本文做完所有步骤,当你重启Linux系统后,若不幸进不去2.6.18内核,你会发现你的出错信息就是上面三种了~~~哈!)
(4)如果你在vmware下编译内核,硬盘用的是scsi的,以下三个选项必选:
Device Drivers ---><*>SCSI device support (此项不选的话,下面两项就选择不上)
Device Drivers ---><*>SCSI device support ---><*>SCSI disk support
Device Drivers---><8>SCSI device support--->SCSI low-level drivers---><*>; BusLogic SCSI support
注:1.内核的配置
Linux当前支持的CPU类型包括x86、ARM、DECAlpha、SUNSparc、M68000、MIPS、PowerPC等,应该说上述类型已经包括绝大多数用户使用的CPU型号。在安装与配置过程中,Linux会自动识别这些型号。
通常要运行的第一个命令是:#cd/usr/src/linux;makemrproper。确保源代码目录下没有不正确的.o文件以及文件的互相依赖。
接下来的内核配置过程比较烦琐,但是配置的适当与否与日后Linux的运行直接相关,有必要了解一下一些主要的且经常用到的选项的设置。
2.6内核配置包括:
#make config(基于文本的最为传统的配置界面)
#make menuconfig(基于文本选单的配置界面)
#make xconfig(基于图形窗口模式的配置界面)
#make oldconfig(如果只想在原来内核配置的基础上修改一些小地方,会省去)
#ALSA:{从2.4版本到2.6版本的升级,这就要使用到ALSA(Advanced Linux SoundArchitecture即:新的 Linux 音频体系结构)。它取代了OSS(Open SoundSystem)。配置内核时,选定ALSA的OSSAPI效法选项(SND_OSSEMUL、SND_MIXER_OSS和SND_PCM_OSS)和适当的声音驱动(PCI驱动)。最后,下载和安装最新的alsa-lib和alsa-utils。}
进行配置时,大部分选项可以使用其缺省值,只有小部分需要根据用户不同的需要选择。例如,如果需要内核支持DOS分区的文件系统,则要在文件系统部分选择FAT或DOS系统支持;系统如果配有网卡、PCMCIA卡等,需要在网络配置中选择相应卡的类型。
选择相应的配置时,有三种选择,它们分别代表的含义如下:
“Y”-将该功能编译进内核
“N”-不将该功能编译进内核
“M”-将该功能编译成可以在需要时动态插入到内核中的模块。
将与核心其它部分关系较远且不经常使用的部分功能代码编译成为可加载模块,有利于减小内核的长度,减小内核消耗的内存,简化该功能相应的环境改变时对内核的影响。许多功能都可以这样处理,例如像上面提到的网卡的支持、对FAT等文件系统的支持。
[color=#000]3》开始编译
[/color]在/usr/src/linux-2.6.25.14目录下,执行以下命令即可编译。编译需要一段时间,给自己倒杯茶耐心等候吧!
# make dep (建立编译时所需的从属文件。注意:如果内核从未编译过,此步可跳过)
# make clean (清除内核编译的目标文件。注意:如果内核从未编译过,此步可跳过)
# make bzImage (注意大小写。这一步才是真正编译内核)
内核编译成功后,会在/usr/src/linux/arch/i386/boot目录中生成一个新内核的映像文件bzImage。如果用make zImage编译,内核很大的话,系统会提示你使用make bzImage命令来编译,所以我直接用make bzImage来编译。
# make modules (编译可加载模块)
# make modules_install (安装可加载模块)
安装成功后,系统会在/lib/modules目录下生成一个2.6.25.14子目录,里面存放着新内核的所有可加载模块。
# make install (安装新内核)
上面的命令"make install"将:(1)把压缩内核映象拷贝到/boot目录下, 并创建相应的System.map符号链接; (2)修改bootloader的配置文件;(3)调用mkinitrd程序创建内核的initrd映象. 对于GRUB而言,将在/boot/grub/grub.conf配置文件增加如下类似的配置行:
title RedHat Linux (2.6.4)
root(hd0,1)
kernel/boot/vmlinuz-2.6.4 ro root=LABEL=/
initrd/boot/initrd-2.6.4.img
不幸的是,新内核并不识别"root=LABEL=/"这个启动参数. 如果现在你就重新启动新内核的话, 将发生kernel panic错误.因此, 必需把这个"root=LABEL=/"启动参数去掉, 就OK了.
注意:
make install的时候可能会出现如下错误信息:
No module BusLogic found for kernel 2.4.12
mkinitrd failed
此问题一般只出现在SCSI硬盘+VMWARE+REDHAT架构中,因为BusLogic被编译进了内核而不是一个module的形式(2.4内核的Buslogic模块即使静态编译进内核也不行)。解决方式是直接将BusLogic.o文件复制过去:
# cp /usr/src/linux-2.6.25.14/drivers/scsi/BusLogic.o /lib/modules/2.6.25.14/kernel/drivers/scsi
不过别忘记,复制过后再执行一下make install。
注:配置完内核,接下来需要对内核源代码文件的依赖性和完整性进行检验,并且进行编译,此时要保证系统所使用的gcc版本在gcc-2.95.3以上:
#make clean(确保所有有关文件都处于最新版本状态)
#make zImage(编译压缩形式的内核)
在需要内核支持较多的外设和功能时,内核可能变得很大,此时可以编译大内核:
#makebzImage
如果选择了可加载模块,编译完内核后,要对选择的模块进行编译:
#make module(编译选择的模块)
#make module-install(将编译后的模块转移到系统标准位置)
模块在系统中的标准目录位于/lib/modules/x.y.z,后面的x.y.z是版本号,为安全起见,在运行#makemodules-install之前最好对/lib/modules进行备份。模块通常是带有扩展名.o的文件,使用命令#lsmod可以对当前内核的模块进行列表。
[color=#000]4》[/color]启动新内核
[color=#000] 将新内核和System.map文件拷贝到/boot目录下[/color],依次执行以下命令:
# cp /usr/src/linux-2.6.18/arch/i386/boot/bzImage /boot/vmlinuz-2.6.18
# cp /usr/src/linux-2.6.18/System.map /boot/System.map-2.6.18
# cd /boot (进入boot目录)
# rm -rf System.map (删除原来的连接)
# ln -s System.map-2.6.18 System.map (重新建立连接)
[color=#000] 修改Grub启动管理器
[/color]如果没有错误的话, 下面开始修改grub配置文件(不要告诉我你用的lilo)
在/boot目录下,执行以下命令:
# new-kernel-pkg --mkinitrd --depmod --install 2.6.18 (这时候你的/boot下会生成一个initrd-2.4.18.img,并且你的grub.conf文件也作了相应更改)
# df (查看根目录在那个分区,下一步要用到。注意,这里根分区不时boot的那个50M的分区,而一般是你最大的那个分区,也就是“/”,千万不要搞错哦。我的为 /dev/hda2)
# vi /grub/grub.conf
进入grub.conf文件,找到如下信息:
default=1
timeout=10
splashimage=(hd0,0)/grub/splash.xpm.gz
title Red Hat Linux (2.6.18)
root (hd0,0)
kernel /vmlinuz-2.6.18 ro root= LABEL=/
initrd /initrd-2.6.18.img
做两处修改:
(1) 将default=1改为default=0(不改的话也可以,只不过重启之后会默认进入2.4内核)
(2) 将kernel行的“LABEL=/”换成根目录所在的分区(上一步查看的就是)
此步很重要,修改错误将可能导致进不去系统,我把我修改后的grub.conf文件列出来,不明之处,可以对照修改:
default=0
timeout=10
splashimage=(hd0,0)/grub/splash.xpm.gz
title Red Hat Linux (2.6.18)
root (hd0,0)
kernel /vmlinuz-2.6.18 ro root=/dev/hda2
initrd /initrd-2.6.18.img
title Red Hat Linux (2.4.20-8)
root (hd0,0)
kernel /vmlinuz-2.4.20-8 ro root=LABEL=/
initrd /initrd-2.4.20-8.img
OK,大功告成!赶快重启,看看升级后的2.6内核吧~~~~
4.总结
编译太费时了,还是用rpm快,但编译可以自定模块,关于用rpm升级内核可以参见这里


jilk005 于 2008-10-15 03:13:16发表:
!??
you_me 于 2008-10-09 22:05:45发表:
怎么到现在还有人叫Fedora叫Fedora Core!真是无奈!