一、简要概述
仍然想将自己的linux内核更换一下,换一个低版本的便捷平常做实验课程的时侯使用,于是就开始了Ubuntu下换内核的过程.
原系统:Ubuntu10.10(Virtualbox)平台中的linux内核2.6.35-22
降级为:linux内核2.6.39
具体操作:
1.首先下载Linux2.6.39内核并解压到/usr/src下
2.安装必备软件编译工具
#apt-getinstalllibncurses5-devbuild-essentialkernel-package
3.做个链接文件#ln-s/usr/src/linux2.6.33/usr/src/linux
4.步入linux文件#cdlinux
5.#makemrproper(删掉曾经到.o文件,初次更换可不用)
6.#makemenuconfig(这儿可以设置一些参数,并生成.config文件)
7.#makedep(构建依赖关系)
8.#makeclean(删掉没有用的文件)
9.#makebzImage(编译linux内核)
10.#makemodules(编译linux模块)
11.#makemodules_install(安装linux模块)
12.#makeinstall(构建initrd文件,加载LKM用的程序)
13.生成initrd.img文件:
#cd/lib/modules/2.6.39
#update-initramfs-c-k2.6.39
14.手动查找新内核,并添加到grub引导#update-grub
15.#shutdown-rnow(立刻重启,重启后会发觉多了一个linux2.6.33到启动项)
以下过程全部在root权限下操作:
二、详细步骤剖析
(一)下载内核
内核下载官网:
下载内核:2.6.39该内核版本与自己当前系统内核版本2.6.35-22比较接近
概念:内核,是一个操作系统的核心。它负责管理系统的进程、内存、设备驱动程序、文件和网路系统,决定着系统的性能和稳定性。在广大爱好者的支持下,内核版本不断更新。新的内核修订了旧内核的bug,并降低了许多新的特点。假如用户想要使用这种新特点,或想按照自己的系统度身定做一个更高效,更稳定的内核,就须要重新编译内核。
为何须要重新编译内核?
降低对某部份功能的支持,例如网路之类,可以把相应部份编译到内核中(build-in),在内核启动时就可以手动支持相应部份的功能,这样的优点是便捷、速度快,机器一启动,你就可以使用这部份功能了,我们可将常常使用的部份直接编译到内核中,例如网卡。静态调用的缺点是会使内核显得庞大上去,不管你是否须要这部份功能,它就会存在。也可以把该部份编译成模块(module),要使用的时侯再动态调用。假如编译成模块linux 内核编译文件说明,都会生成对应的.o文件,在使用的时侯可以动态加载,优点是不会使内核过于庞大,缺点是你得自己来调用这种模块。
安装必备软件编译工具:
#apt-getinstalllibncurses5-devbuild-essentialkernel-package
这几个文件介绍:
libncurses5-dev是为以后配置内核能运行makemenuconfig程序做打算
Build-essential为编译工具;
kernel-package是编译内核工具。
若果系统显示难以查找到这三个文件,输入#apt-getupdate更新数据源,更新完以后即可找到这三个文件了。
(二)编译替换内核
1.解压内核文件linux2.6.39到/usr/src下xx
首先先将下载的内核拷贝到/usr/src目录下;/usr/src/目录是linux内核源码储存的目录,上面的内核源码目录为:linux-2.XX.XX目录等。
这儿解压到任何目录都行,由于在这儿我们是要降低一个内核,而不是覆盖掉原有系统的内核,即便是覆盖掉原有系统内核,也可以在前面执行#makeinstall手动都会将对应文件拷贝到本机相应的目录下去了。
解压命令:#tar-jxvflinux-2.6.39.tar.bz2
注:较新的内核文件以tar.xz结尾的压缩文件时红帽linux系统下载,怎样解压
$xz-d***.tar.xz
$tar-xvf***.tar
可以看见这个压缩包也是打包后再压缩,外边是xz压缩方法如何安装LINUX,里层是tar打包形式。补充:目前可以直接使用tarxvJf***.tar.xz来解压
步入内核源码目录:#cd/usr/src/linux-2.6.39/可以查看相应内核文件
做个链接文件#ln-s/usr/src/linux2.6.39/usr/src/linux
步入linux文件#cd/usr/src/linux
/usr/src/linux这个目录是编译内核时储存源代码的目录,而/usr/src/linux2.6.33这个目录是实际储存代码的目录.即在/usr/src中构建一个软链接
2.订制内核
#makemrproper清除曾经加载的模块,第一次可省略
在每次配置并重新编译内核前须要先执行“makemrproper”命令清除源代码树,包括过去以前配置的内核配置文件“.config”都将被消除。实验完成以后,在测试了一下这个命令,如右图所示,即进行新的编译工作时将原先旧的配置文件给删掉到,以免影响新的内核编译。
即检测有无不正确的.o文件和依赖关系,假如使用刚下载的完整的源程序包即第一次进行编译,这么本步可以省略。而假如你多次使用了这种源程序编译内核,则最好要先运行一下这个命令。
#makemenuconfig(这儿可以设置一些参数,并生成.config文件)
使用makemenuconfig生成的内核配置文件,决定将内核的各个功能系统编译进内核还是编译为模块,或则不编译。
在这儿就不介绍具体的内核配置操作,并且建议即使不准备配置哪些也执行一下makemenuconfig这个命令,并在退出的时侯进行保存,由于假如不执行此操作的话在前面make编译内核的时侯会提示你回答好多问题。
这一步可以#cp/boot/config-XX/usr/src/linux/.config,即使用当前系统配置文件,然后步入makemenuconfig选择load配置文件以后,再做细微改动,或则不改动也可。
执行#cp/boot/config-,之后按下Tab键,系统会手动填上该目录下符合条件的文件名,之后继续输入.config,目的是使用在boot目录下的原配置文件。
3.编译安装内核和模块
#makedep构建依赖关系
依据上一步中加载的配置内容(.config)构建文件的依赖关系。
#makeclean消除内核编译的目标文件
清除一些毋须要的文件,假如你在先前编译的基础上,删掉了一些选项,建议你执行这一步操作,否则,就没有必要了。
#makebzImage编译内核
内核编译成功后,会在源码树枝目录即/usr/src/linux-2.6.39/arch/x86/boot/目录中生成一个新内核的映像文件bzImage。
#makemodules编译模块
编译可加载模块(即内核选项中选择为M的选项),便于将来使用insmod命令进行加载。编译时间跟M选项的数目有关。
#makemodules_install安装模块
编译成功后,系统会在/lib/modules目录下生成一个2.6.39子目录,上面储存着新内核的所有可加载模块(正式编译好的modules拷贝到/lib/modules下)。
#makeinstall
安装内核,即复制.config,vmlinuz,initrd.img,System.map文件到/boot目录、更新grub。
其实,在这儿我们也可以分别拷贝到/boot目录:
(1)将生成的linux-2.6.39/.config拷贝到要替换内核系统的/boot下,并重命名为config-2.6.39
(2)将生成的linux-2.6.39/arch/x86-64/boot/bzImage拷贝到要替换内核系统的/boot下,并重命名为vmlinuz-2.6.39(注:这儿需非常注意拷贝后的文件名变为vmlinuz-x.x.x)。
(3)将生成的linux-2.6.39/System.map拷贝到要替换内核系统的/boot下,并重命名为System.map-2.6.39
(4)将makemodules_install生成的系统目录/lib/modules/linux-2.6.39拷贝到要替换内核系统的/lib/modules下。
#new-kernel-pkg--install--mkinitrd--depmod2.6.33(将启动信息写入grub.conf中,这儿也可以去/etc/编辑grub.conf文件,将启动信息模仿原先到写进去。注:有的linux版本是lilo.conf文件)(测试了一下网上留传的这条指令,在我的笔记本上这条命令没有反应)
#cd/lib/modules/2.6.39
#update-initramfs–c–k2.6.39生成/boot/initrd.img-2.6.39文件
#update-grub手动查找新内核,并添加到grup引导中
#shutdown-rnow
立刻重启,重启后按shift会发觉多了一个linux2.6.39启动项。
补充:怎么在启动界面中加入你想要的个人信息
方式有许多,在这儿介绍三个方式:
1.Ubuntu的登录和欢迎信息控制/etc/issue和/etc/motd
其中/etc/issue与/etc/motd区别在于:当一个网路用户或通过并口登陆系统上时,/etc/issue的文件内容显示在login提示符之前,而/etc/motd内容显示在用户成功登陆系统以后。更改这两个文件都可以达到加入个人信息的疗效。
2.更改/boot/grub/grub.cfg文件来改动我们的引导项的名子来完成显示个人信息。
3.在编译之前加入个人信息,将信息编译进内核:对/usr/src/linux-3.6/init.c文件进行更改,在最后一个函数中,加入printk("***")复印想要的信息linux 内核编译文件说明,在这儿要注意复印的优先级,必须设置超过一定的优先级方可在控制台复印出想要的信息(可参考相关printk函数的介绍)。
3.卸载内核
首先我们须要查看一下当前使用的是那个内核:
uname-r
该命令会告诉你当前使用的内核版本,在登陆时侯,不能卸载当前的内核,以免引起难以启动的惨剧~~
接出来,假如你是自己动手编译的内核的话,请删掉以下文件和文件夹
1.删掉掉/lib/modules/目录下过时的内核库文件
2.删掉掉/usr/src/kernels/目录下过时的内核源代码
3.删掉掉/boot目录下启动的核心档案以及内核映像
4.修改/boot/grub/menu.lst,删掉掉不用的启动列表
在这儿就只接受自己动手编译的内核怎么卸载了,若果是安装包安装的内核,百度查询相关指令即可卸载,其实,自己自动卸载也是可以的。
三、重要Linux内核文件剖析
(一).config
使用makemenuconfig生成的内核配置文件,决定将内核的各个功能系统编译进内核还是编译为模块还是不编译。
(二)vmlinuz和vmlinux
vmlinuz是可引导的、压缩的内核,“vm”代表“VirtualMemory”。Linux支持虚拟显存,不像老的操作系统例如DOS有640KB显存的限制,Linux才能使用硬碟空间作为虚拟显存,因而得名“vm”。vmlinuz是可执行的Linux内核,坐落/boot/vmlinuz
vmlinuz的构建有两种形式:
一是编译内核时通过“makezImage”创建,之后通过:“cp/usr/src/linux-2.4/arch/i386/linux/boot/zImage/boot/vmlinuz”产生zImage适用于小内核的情况,它的存在是为了向后的兼容性;
二是内核编译时通过命令makebzImage创建,bzImage是压缩的内核映像,须要注意,bzImage不是用bzip2压缩的,bzImage中的bz容易造成误会,bz表示“bigzImage”,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的压缩文件。
(三)initrd.img
initrd是“initialramdisk”的缩写。initrd通常被拿来临时的引导硬件到实际内核vmlinuz才能接管并继续引导的状态。例如initrd-2.4.7-10.img主要是用于加载ext3等文件系统及scsi设备的驱动。假如你使用的是scsi硬碟,而内核vmlinuz中并没有这个scsi硬件的驱动,这么在放入scsi模块之前,内核不能加载根文件系统,但scsi模块储存在根文件系统的/lib/modules下。为了解决这个问题,可以引导一个才能读实际内核的initrd内核并用initrd修正scsi引导问题,initrd-2.2.39.img是用gzip压缩的文件。initrd映象文件是使用mkinitrd创建的,mkinitrd实用程序才能创建initrd映象文件,这个命令是RedHat专有的,其它Linux发行版其实有相应的命令。这是个很便捷的实用程序。具体情况请看帮助:manmkinitrd
(四)System.map
System.map是一个特定内核的内核符号表,由“nmvmlinux”产生而且不相关的符号被滤出。
(五)几个重要的内核文件剖析
arch子目录包括了所有和体系结构相关的核心代码。它的每一个子目录都代表一种支持的体系结构,比如i386就是关于intelcpu及与之相兼容体系结构的子目录。PC机通常都基于此目录;
include子目录包括编译核心所须要的大部份头文件。与平台无关的头文件在include/linux子目录下,与intelcpu相关的头文件在include/asm-i386子目录下,而include/scsi目录则是有关scsi设备的头文件目录;
init子目录包含核心的初始化代码(注:不是系统的引导代码),包含的两个文件main.c和Version.c,这是研究核心怎样工作的一个特别好的起点。
Mm子目录包括所有独立于cpu体系结构的显存管理代码,如页式储存管理显存的分配和释放等;而和体系结构相关的显存管理代码则坐落arch/*/mm/,比如arch/i386/mm/Fault.c
Kernel子目录包括主要的核心代码,此目录下的文件实现了大多数linux系统的内核函数,其中最重要的文件当属sched.c;同样,和体系结构相关的代码在arch/*/kernel中;
Drivers子目录放置系统所有的设备驱动程序;每种驱动程序又各占用一个子目录:如,/block下为块设备驱动程序,例如ide(ide.c)。假如你希望查看所有可能包含文件系统的设备是怎样初始化的,你可以看drivers/block/genhd.c中的device_setup()。它除了初始化硬碟,也初始化网路,由于安装nfs文件系统的时侯须要网路;
其他子目录:
Lib放置核心的库代码;Net,核心与网路相关的代码;Ipc,这个目录包含核心的进程间通信的代码;
Fs,所有的文件系统代码和各种类型的文件操作代码,它的每一个子目录支持一个文件系统,比如fat和ext2;Scripts,此目录包含用于配置核心的脚本文件等。通常,在每位目录下,都有一个.depend文件和一个Makefile文件,这两个文件都是编译时使用的辅助文件,仔细阅读这两个文件对弄清各个文件这间的联系和依托关系很有帮助;并且,在有的目录下还有Readme文件,它是对该目录下的文件的一些说明,同样有利于我们对内核源码的理解。
四、遇到的问题
1.源的问题
安装必备软件编译工具:#apt-getinstalllibncurses5-devbuild-essentialkernel-package的时侯,难以更新,输入#sudoapt-getupdate也难以更新数据。
在这儿是因为ubuntu10.10的源出现问题,致使未能更新、下载软件,这儿须要重新更改源文件。处理如下:
参考该网站内容后,将源换为地址,即可更新、下载软件(其实,其他可用的源地址也是可以的)。
2.权限问题
在这个内核的编译、安装过程中,涉及到的操作都是须要root权限能够进行操作的,假如权限不够,则形成错误。处理方式:使用sudo(必须给了给用户申请root的权限)或则直接suroot切换到root用户下进行整个过程操作。