内核升级综合谈

来源:互联网 发布:华为交换机给端口命名 编辑:程序博客网 时间:2024/05/22 08:53
目录说明:

/lib/modules                          目录存放内核加载用到的所有模块。没有新的模块的话,看到的是系统本身旧的模块。
/boot/                                存放系统加载用到的核心和System.map 以及.img config-版本号 的地方,没有编译新内核的话,看到的是旧的文件。
/usr/src/                             目录存放系统内核代码,在没有新内核的情况,看到的是系统本身旧内核代码。
/usr/src/X.Y.Z/configs                目录下存放编译内核所用的配置。这里的X.Y.Z指的是系统的内核版本号。
/usr/src/x.y.z/arch/i386/boot/        存放编译后的新内核bzImage。x.y.z代指版本号。
/usr/src/x.y.z/                       存放编译后的新System.map 以及新的.config。x.y.z代指版本号。
/usr/src/x.y.z/Arch                   arch子目录包括了所有和体系结构相关的核心代码。它的每一个子目录都代表一种支持的体系结构
/usr/src/x.y.z/Include                include子目录包括编译核心所需要的大部分头文件。与平台无关的头文件在 include/linux子目录下,与 intel cpu相关的头文件在include/asm-i386子目录下,而include/scsi目录则是有关scsi设备的头文件目录
/usr/src/x.y.z/Init                   这个目录包含核心的初始化代码(注:不是系统的引导代码),包含两个文件main.c和Version.c,这是研究核心如何工作的一个非常好的起点。
/usr/src/x.y.z/Mm                     这个目录包括所有独立于 cpu 体系结构的内存管理代码,如页式存储管理内存的分配和释放等;而和体系结构相关的内存管理代码则位于arch/*/mm/,例如arch/i386/mm/Fault.c
/usr/src/x.y.z/Kernel                 主要的核心代码,此目录下的文件实现了大多数linux系统的内核函数,其中最重要的文件当属sched.c;同样,和体系结构相关的代码在arch/*/kernel中;
/usr/src/x.y.z/Drivers               放置系统所有的设备驱动程序;每种驱动程序又各占用一个子目录。
/usr/src/x.y.z/Lib                    放置核心的库代码 
/usr/src/x.y.z/Ipc                    这个目录包含核心的进程间通讯的代码 
/usr/src/x.y.z/Scripts                此目录包含用于配置核心的脚本文件等。   
/usr/src/x.y.z/Net                    核心与网络相关的代码
/usr/src/x.y.z/Fs                    所有的文件系统代码和各种类型的文件操作代码,它的每一个子目录支持一个文件系统,例如fat和ext2;

一般,在每个目录下,都有一个 .depend 文件和一个 Makefile 文件,这两个文件都是编译时使用的辅助文件,还有Readme 文件,它是对该目录下的文件的一些说明。


内核配置方式:

make gconfig     基于图形窗口模式的配置界面,需要Gtk开发库的支持
make xconfig     基于图形窗口模式的配置界面,需要Qt开发库的支持
make config      基于文本的最为传统的配置界面
make menuconfig  基于文本选单的配置界面
make oldconfig   只在原来内核配置的基础上修改

命令说明:

1。make menuconfig       配置内核(整个内核编译的关键所在,直接影响你系统的功能)
2。make mrproper         这步是为确保原代码目录下没有不正确的.o文件及文件的相互依赖,刚解开的新内核包不需此步骤。
3。make def              确保关键文件在正确的位置,也就是验证文件依赖关系,编译2.6内核无需此步骤
4。make clean            清除内核编译完成的用不到的临时文件 /确保所有有关文件都处于最新版本状态
5。make -jn              n代表同时编译的进程,可以加快编译速度,n由你的配置决定,一般为15-25。注意: 此命令已完成make bzImage及make modules的工作, 生成的bzImage内核文件在arch/i386/boot目录中,你的CPU不同内核文件存放位置也不同,如arch/i586/boot、arch/i686/boot这样子。
6。make zImage           编译压缩形式的内核,即:小内核
6。make bzImage          编译内核(大内核) 编译后的内核文件会存放在/usr/src/新内核版本号/arch/i386/boot/下文件名字是:bzImage
7。make modules          编译内核需要的模块
8。make modules_install  安装编译好的模块。模块会被安装在/lib/modules/ 名字为:新内核版本号比如2.4.8
9。mkinitrd              mkinitrd会在/boot目录下生成initrd-XX.img文件,如: mkinitrd /boot/initrd-2.4.26.img 2.4.26  在/boot目录下生成initrd-2.4.26.img文件
10 make install          完成mkinitrd命令及内核(bzImage)和System.map的拷贝,如果使用Grub可以不用修改grub.conf文件了。直接reboot就可以。

编译准备:

1、要安装了相关编译工具或套件。比如GCC等。
2、具备管理员权限,也就是root。
3、做好相关的备份工作。
4、默认情况下(使用Intel x86 CPU系列),下面这一步可以省略。否则将/usr/include/asm、/usr/inlude/linux、/usr/include/scsi链接到/usr/src/linux/include目录下的对应目录中。方法如下:

# cd /usr/include
# rm -Rf asm linux
# ln -s /usr/src/X.Y.Z/include/asm-i386 asm  (如果你使用其它CPU比如PPC,那就需要连接到相应的目录) 这里的X.Y.Z 是你新内核版本
# ln -s /usr/src/X.Y.Z/include/linux linux   这里的X.Y.Z 是你新内核版本
# ln -s /usr/src/X.Y.Z/include/scsi scsi     这里的X.Y.Z 是你新内核版本


编译过程:

这里以2.4.26为例:

[root@localhost root]# cd /usr/src
[root@localhost src]# tar vxfj linux-2.4.26.tar.bz2
[root@localhost src]# cd /usr/src/linux -2.4.26
[root@localhost linux-2.4.26]# cp /boot/config-2.4.20-8 .config
[root@localhost linux-2.4.26]# make menuconfig
[root@localhost linux-2.4.26]# make dep
[root@localhost linux-2.4.26]# make clean
[root@localhost linux-2.4.26]# make bzImage
[root@localhost linux-2.4.26]# make modules         这里的make bzImage 和make modules 可以用make -jn一个命令来替代 保险起见,不使用make -jn。                        
[root@localhost linux-2.4.26]# make modules_install
[root@localhost linux-2.4.26]# cp arch/i386/boot/bzImage /boot/vmlinuz-2.4.26
[root@localhost linux-2.4.26]# cp .config /boot/config-2.4.26
[root@localhost linux-2.4.26]# cp System.map /boot/System.map-2.4.26
[root@localhost linux-2.4.26]# mkinitrd /boot/initrd-2.4.26.img 2.4.26
[root@localhost linux-2.4.26]# cd /boot
[root@localhost boot]# rm -f System.map vmlinuz   这个步骤可以不做。
[root@localhost boot]# ln -s System.map-2.4.26 System.map 这个步骤也可以不错。但是如果搞开发的话,可能会用到System.map这个文件。
[root@localhost boot]# ln -s vmlinuz-2.4.26 vmlinuz       同上解释。
[root@localhost boot]# cd grub
[root@localhost grub]# vi grub.conf        这里是修改引导程序,如果你的是LILO引导方法类似。
[root@localhost grub]# reboot


GRUB的修改:以2.4.20-8和2.4.6为例子:

如果你用make install安装过了内核,那么下面的Grub的修改仅做参考。

vi grub.conf

# grub.conf generated by anaconda
#
# Note that you do not have to rerun grub after making changes to this file
# NOTICE:  You have a /boot partition.  This means that
#          all kernel and initrd paths are relative to /boot/, eg.
#          root (hd0,0)
#          kernel /vmlinuz-version ro root=/dev/hda2
#          initrd /initrd-version.img
#boot=/dev/hda
default=1
timeout=10
splashimage=(hd0,0)/grub/splash.xpm.gz
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

#添加如下文字:
title Red Hat Linux (2.4.26)
        root (hd0,0)
        kernel /vmlinuz-2.4.26 ro root=LABEL=/
        initrd /initrd-2.4.26.img

#注意要把kernel /vmlinuz-2.4.26 ro root=LABEL=/ 改成  kernel /vmlinuz-2.4.26 ro root=/dev/hdaX  其中X是你的/的分区。如果不知道你的/分区,用命令df就可以知道了。


LILO的修改:

vi /etc/lilo.conf

#在该文件中加入下面几行:

image=/boot/X.Y.Z                    #X.Y.Z 表示内核版本号
label=linux-custom                   #自定义的Lable
initrd=/boot/initrd-X.Y.Z.img        #X.Y.Z 表示内核版本号
read-only
root=/dev/hdaX                       #这与你的具体配置有关有可能是hdaX或sdaX  X在这里是指/的挂载点

#并把   default=linux
#改为   default=linux-custom          #linux-custom是自定义的名字

2.使新配置生效
# /sbin/lilo

关于grub的界面操作:

e -编辑引导命令
ESC键 -回到上级目录
o -插入一行命令
b -开始引导系统
d -删除一行

利用这些命令也可以在利用grub引导之后,对grub.conf进行编辑。


写在最后,这里含概了大部分内核编译涉及的到的各个方面的问题和解决方法,其中有些地方是我引用其他人的经验描述,当然很多地方我也自己修改了。目的是使它更为详细更为明了。

原创粉丝点击