Linux内核升级全过程(linux2.4.x到linux2.6.x)[搜集整理实用]

来源:互联网 发布:旅游电商分销系统源码 编辑:程序博客网 时间:2024/05/22 00:22

Linux内核升级全过程

 

一、准备工作...1

二、配置工作...2

三、编译工作...5

四、启动新内核...7

五、System.map、vmlinuz、initrd-2.4.7-10.img的产生和作用...12

 

 

本文讲述linux2.4.x到linux2.6.x的升级过程:范本是linux2.4.20-8到linux2.6.18

主要参考:http://www.linuxdiyf.com/viewarticle.php?id=159840(在这个基础上改的)

                http://linux.chinaunix.net/techdoc/system/2007/09/01/966881.shtml

                当然,还参考了我的实践过程,嘿嘿~~

 

一、准备工作

启动Linux系统,并用根用户登录,进入终端模式下。

 

1、查看Linux内核版本

# uname -a

如果屏幕显示的是2.6.x,说明你的已经是2.6的内核,也用不着看下文了,该干什么干什么去吧!~~~如果显示的是2.4.x,那恭喜你,闯关通过,赶快进行下一步。

 

2、下载2.6内核源码

下载地址:http://www.kernel.org/pub/linux/kernel/v2.6/

红帽下载地址:http://downloads.lustre.org/public/kernels/rhel4/

 

3、下载内核升级工具

(1)下载module-init-tools-3.2.tar.bz2

http://www.kernel.org/pub/linux/utils/kernel/module-init-tools/module-init-tools-3.2.tar.bz2

(2)下载modutils-2.4.5.tar.gz

http://www.kernel.org/pub/linux/utils/kernel/modutils/v2.4/

(3)下载mkinitrd-4.1.18-2.i386.rpm

(4)下载lvm2-2.00.25-1.01.i386.rpm

(5)下载device-mapper-1.00.19-2.i386.rpm

这三个百度吧,网上一堆一堆的,mkinitrd程序包依赖于device-mapper包, 而device-mapper包又倚赖于lvm2包

(6)Binutils 开发包(binutils-2.17.tar.gz):如升级安装于虚拟机上的RedHat Linux,则必需该包;但是我没用到这个包,下边的过程未包含此包

 

4、备份(比如:/usr/src,/boot/etc,有很多网友将内核升级将要被替换的文件都保留了一份*.old文件,但我没有备份什么东西)

 

5、其他:查看/usr/src/linux-2.6.18/Documentation/Changes (假设新的内核版本2.6.18),升级里面所给出的软件包,有些不需要升级,但有些需要,因为给出的是2.6内核所要求的软件包的最低版本.在文件后面给出了各个软件包的简单介绍和下载网址。

在安装内核和软件包时,也许有些你不知如何安装,或者是安装时出错,在configure之前,你最好先读一下README或INSTALL, 里面讲了如何安装。

当然都是英文的,呵呵~

 

二、配置工作

好啦,2.6内核和5个升级工具都下载完了(少一个也不行,如果没有下载齐全,请不要尝试下面的步骤,升级是不会成功的),下面回到Linux系统中开始配置工作吧。

 

4、将下载好的内核和4个升级工具都拷贝到/usr/src文件夹下。怎么拷贝就不用我教了吧~~~~不会拷贝的去撞墙吧!~~呵呵!

 

5、拷贝完毕,开始解压新内核,具体操作请依次执行以下命令:

 

# cd /usr/src (进入到/usr/src目录下,如果已经在/usr/src目录下,可不执行该命令)

# rm –rf linux (删除linux文件夹。值得一提的是,如果内核先前从未编译过,则没有这个文件夹,此命令行可略过;我就是没有)

# tar -jvxf linux-2.6.18.tar.bz2 (解压新内核)

# ln -s linux-2.6.18  linux (重新生成linux文件夹)

 

6、安装modutils:

linux-2.6.x内核的module处理过程有所改变(很多原先在用户态下由modutils处理的工作都放到内核里去完成了), 因此2.4.x下的modutils工具包已经不在适合新的2.6.x内核, 必需将其升级到module-init-tools工具包.

在/usr/src目录下,依次执行下列命令:

 

#rpm –e –nodeps modutils (强行卸载原有的modutils包)

#tar –zxvf modutils-2.4.5.tar.gz

#cd modutils-2.4.5

#./configure

#make

#make install

注:modutils是管理内核的工具,例如insmod、rmmod、lsmod等。

值得注意的是:我用了此一步,所以在安装module-init-tools工具包并未使用到make moveold命令,所以关于下一步中的make moveold命令的解释并未考证,仅做参考。

 

7、安装module-init-tools工具包

在/usr/src目录下,依次执行下列命令:

 

# tar -jvxf module-init-tools-3.2.tar.bz2 (解压module-init-tools)

# cd module-init-tools-3.2 (由/usr/src目录进入module-init-tools目录下)

#./configure --prefix=/

# make (make moveold,有网友这样用,我没有用,因为我的执行不成功)

# make install  (make all install有网友这样用,我未加考证,没用)

#./generate-modprobe.conf  /etc/modprobe.conf

注:

安装module-init-tools工具时,命令"make moveold"将把系统原来的modutils工具程序改名为"*.old"(比如,lsmod.old等等). NOTE! 这是非常重要的一步, 千万不要省略. 这将使得你可以继续使用原有的linux-2.4.x系统, 因为在2.4.x系统下, 新的module-init- tools工具包实际上是倚赖原来"*.old"程序来加载内核模块. 如果忘记了这一步也不要紧张, 可以先下载并安装原来的modutils程序包, 然后按照上面的步骤重来一遍就可以了.

 

8、安装另外三个升级工具

回到/usr/src目录下,依次执行下列3个命令来安装另外三个升级工具:

 

# rpm -ivh --nodepsmkinitrd-4.1.18-2.i386.rpm (注意,这里一定要加入--nodeps参数,在安装升级工具时,如果加了--nodeps参数仍未能安装成功,请尝试再加入参数—force,下同)

# rpm -ivh --nodepslvm2-2.00.25-1.01.i386.rpm

# rpm -ivh --nodeps device-mapper-1.00.19-2.i386.rpm

 

如果不更新以上几个升级包,在后面编译内核时会提示以下错误:

mkinitrd failed

make[1]: *** [install] Error 1

make: *** [install] Error 2

 

9、配置内核选项。有点繁琐,~~希望一次成功哦~~。(本人失败了三次才成功,所以发奋整理了这个文档,当然抄袭了很多网友的资料,本人不以营利为目的,大家随便盗版,概不追究!嘿嘿~~)

 

 

# cd linux-2.6.18 (进入到/usr/src/linux-2.6.18目录下)

# make mrproper (该命令可确保源代码目录下没有不正确的.o文件以及文件的互相依赖)

# make menuconfig (配置内核各选项)

 

此时会出现一个图形界面,列出了所有的内核配置选项,有的选项下还有子选项,你可以用方向键来选择,“*”表示编译进内核,“M”表示编成内核模块,“ ”(即空)表示不选,用Y键来确定选“*”,用空格键可以切换。

 

详细的内核配置选项介绍参见以下网址的文章(推荐这几篇文章比较着看)

 

Linux2.6.19.1内核配置选项介绍:http://blog.chinaunix.net/uid-13075095-id-2907545.html

这个虽然只有残卷,但是介绍的更好一些,所以排在第一个参考的位置。

Linux 2.6.19.x 内核编译配置选项简介:http://blog.chinaunix.net/uid-20864319-id-448851.html

这个是金步国前辈写的,比较全,不过只是选项的介绍,没有推荐如何选择

 

http://tech.ccidnet.com/art/302/20070423/1068131_1.html

linux 2.6.15.6内核配置: http://www.233.com/linux/fudao/20100113/095153985.html

这两个作为参考,优点是大多选项有推荐选择,缺点是个别选项所推荐的选择是不同的。所以网友们一定要根据自己的需要配置,这些只是参考。

 

Linux 2.6.31内核优化指南:http://os.51cto.com/art/201003/190616.htm

Linux 2.6.3x内核配置:http://blog.chinaunix.net/uid/24188013/list/1.html?cid=107811

这两个是对于Linux2.6.3x内核的。

 

经过多次试验,大多数选项默认就行,以下几个选项必须选择(请认真核对下面每一个选项,否则编译很有可能前功尽弃,):

 

(1)Loadable Module support选项中,一定要选上“Module unloading”和“Automatic kernel module loading”这两项;

 

(2)Device Drivers--->Block Devices中一定要选上Loopback device support;

Device Drivers--->Multi-devicesupport(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 ---> Fusion MPT devicesupport ---> Fusion MPT (base + ScsiHost) drivers和 Fusion MPT misc device (ioctl)driver(这个要不要, 不确定 , 注意:这个只能选模块方式,直接编译进内核,就出错,不知道为什么,这个浪费了我好多时间才找到,编译了几十次的成果。出错信息如下:No module mptbase found for kernel vmware。。。。。。。)

 

(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 filesystem support”;

File Systems --> Miscellaneousfilesystems ---><*> Compressed ROM file system support (cramfs)

 

注意: ext2和ext3文件系统配置很重要,也是必需的,对Ext3、Ext2文件的支持必须编译进内核,而不能编译为模块,否则在你reboot时机器就会当掉,出现如下错误信息:

kernel panic : no init found ,try passinginit = 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 onunknown-block(0,0)

或者是:

mount: error 19 mounting ext3

pivotroot:pivot_root(/sysroot,/sysroot/initrd) failed: 2

umount /initrd/proc fail: 2

Feeing unused kernel memory: 244k freed

Kernel panic – not syncing: No init found.Try passing init = option to kernel

(我的机器就是在重启之后出现第三种错误,进不去系统,郁闷死,只好重装了~~~)

 

(4)由于在vmware中使用模拟的SCSI硬盘和AMD PCnet32网卡,因此需要“SCSI disk support”、“BusLogin SCSI support”、“AMD PCnet32 PCI support”的支持,最好编译进内核,而不是编译为内核模块。:

Device Drivers --->SCSI device support---><*> SCSI disk support

Device Drivers --->SCSI device support--->SCSI low-level drivers ---> <*> BusLogic SCSI support

Device Drivers ---> Networking support--->Ethernet (10 or 100Mbit) ---> <*> AMD PCnet32 PCI support

如果编译为模块,initrd则是必须的,否则启动过程中会出现“VFS:unable to mounting root fs”.程序包mkinitrd依赖于程序包device-mapper,而程序包device-mapper又依赖于lvm2,因此需要同时下载mkinitrd、device-mapper、lvm2程序包。

 

三、编译工作

OK,繁杂的配置工作完成了,至此,编译前的准备工作都做好了!

 

10、开始编译:

在/usr/src/linux-2.6.18目录下,执行以下命令即可编译。编译需要一段时间,给自己倒杯茶耐心等候吧!

 

# 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.18子目录,里面存放着新内核的所有可加载模块。

 

# make install

(安装新内核;一般来说自动生成并复制vmlinuz-2.6.20-1, System.map-2.6.20-1, initrd-2.6.20-1.img,在可以看到,然后第11步就不需要了,我就没有第11步;但是一定要检查/boot目录下有没有,以及System.map文件,如果没有的话,就需要第11步)

 

注意:makeinstall的时候可能会出现如下错误信息:

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.18/drivers/scsi/BusLogic.o/lib/modules/2.6.18/kernel/drivers/scsi

 

不过别忘记,复制过后再执行一下make install。

(如果makemenuconfig时,把BusLogic模块选成M--Module模式--就不会出现这个提示。)

如果查看时还是缺少initrd-2.6.18.img,可以使用命令mkinitrd /boot/initrd-2.6.18.img  2.6.18生成一个。

 

编译错误解决汇总

①错误1

OBJCOPYarch/i386/boot/compressed/vmlinux.bin

BFD: Warning: Writing section `.bss' tohuge (ie negative) file offset 0xc0277000.

objcopy:arch/i386/boot/compressed/vmlinux.bin: File truncated

make[2]: ***[arch/i386/boot/compressed/vmlinux.bin] Error 1

make[1]: ***[arch/i386/boot/compressed/vmlinux] Error 2

make: *** [bzImage] Error 2

 

解决方法:

在arch/i386/Makefile里面做一些修改:

将OBJCOPYFLAGS改成如下的:

OBJCOPYFLAGS :=-O binary--change-section-lma

.bss-0xc0000000 –R

.note -R .comment

–S

然后重新makebzImage.

编译成功提示如下:

OBJCOPYarch/i386/boot/compressed/vmlinux.bin

GZIP

arch/i386/boot/compressed/vmlinux.bin.gz

LD

arch/i386/boot/compressed/piggy.o

LD

arch/i386/boot/compressed/vmlinux

OBJCOPY arch/i386/boot/vmlinux.bin

HOSTCC

arch/i386/boot/tools/build

BUILD

arch/i386/boot/bzImage

Root device is (8, 1)

Boot sector 512 bytes.

Setup is 7498 bytes.

System is 1191 kB

Kernel: arch/i386/boot/bzImage is ready

(#3)

 

②错误2

ERROR: "crypto_free_tfm"[net/rxrpc/af-rxrpc.ko] undefined!

ERROR: "crypto_alloc_base"[net/rxrpc/af-rxrpc.ko] undefined!

make[1]: *** [__modpost] Error 1

make: *** [modules] Error 2

 

解决方法:

选中Cryptographicoptions---> Cryptographic API

 

四、启动新内核

 

11、将新内核和System.map文件拷贝到/boot目录下,依次执行以下命令:

 

# 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 (重新建立连接)

 

注:

(1) 由于linux2.6 内核增加了sysfs文件系统,所以要创建/sys目录

 

#mkdir /sys

 

(2)修改启动脚本/etc/rc.sysinit

 

①添linux2.6内核新支持的sysfs系统

 

1)找到“mount –f /proc”,在下面添加如下内容:

 

#Mount /sys for kernel-2.6.x

if [ "$KERNELVER"="2.6" ]; then

 

mount -f /sys

fi

 

2)找到“action$”Mounting proc filesystem:”mount –n –t proc /proc /proc”,在下面添加如此内容:

 

#Mount /sys for kernel-2.6.x

if [ "$KERNELVDER" ="2.6" ]; then

action $"Mounting sysfs filesystem:" mount -n -t sysfs /sys /sys

fi

 

②为linux2.6内核符号文件添加支持(添加的KERNELVAER变量,来判断内核版本)

 

#

#---------------------KERNEL 2.6.xsupport---------------------------

#This is for compatibility betweenkernel-2.4.x and kernel-2.6.x

#

UNAME='uname -r'

KERNELVER=${UNAME:0:3}

if [ "$KERNELVER" ="2.6" ]; then

#

#This is for kernel-2.6.x

#

KSYMS=/proc/kallsyms

KEYBDEV_NAME=usbkbd

MOUSEDEV=usbmouse

else

#

#This is for kernel-2.4.x

#

KSYMS=/proc/ksyms

KEYBDEV_NAME=keybdev

MOUSEDEV=mousedev

Fi

 

③添加USB键盘与鼠标的新支持

 

1)由于USB键盘模块名称从keybdev变为usbkbd,USB鼠标模块摸名称从mousedev变为usbmouse,所以必须修改启动脚本文件。通过定义KEYBDEV_NAME和MOUSEDEV_NAME两个变量来标识

 

相应的模块名,具体代码见②。

 

2)在rc.sysinit脚本中所有出现keybdev、mousedev的地方都变成$KEYBDEV_NAME和$MOUSEDEV_NAME。

 

3)对rc.sysinit以下内容进行修改

 

needusbstorage=

 

if [ $usb = "1" ]; then

 

needusbstorage=`LC_ALL=C grep -e "^I.*Cls=08"/proc/bus/usb/devices 2>/dev/null`

 

LC_ALL=C grep 'hid' /proc/bus/usb/drivers|| action $"Initializing USB HID interface: " modprobe hid 2>/dev/null

 

action $"Initializing USB keyboard:" modprobe $KEYBDEV_NAME 2> /dev/null

 

action $"Initializing USB mouse:" modprobe $MOUSEDEV_NAME 2> /dev/null

 

fi

 

修改为

 

needusbstorage=

 

if [ $usb = "1" ]; then

 

if [ "$KERNELVER" ="2.6" ]; then

 

needusbstorage=`LC_ALL=C grep -e"^I.*Cls=08" /sys/bus/usb/devices 2>/dev/null`

 

LC_ALL=C grep 'hid' /sys/bus/usb/drivers ||action $"Initializing USB HID interface: " modprobe hid 2>/dev/null

 

else

 

needusbstorage=`LC_ALL=C grep -e"^I.*Cls=08" /proc/bus/usb/devices 2>/dev/null`

 

LC_ALL=C grep 'hid' /proc/bus/usb/drivers|| action $"Initializing USB HID interface: " modprobe hid 2>/dev/null

 

fi

 

action $"Initializing USB keyboard:" modprobe $KEYBDEV_NAME 2> /dev/null

 

action $"Initializing USB mouse:" modprobe $MOUSEDEV_NAME 2> /dev/null

 

fi

 

(3)修改/etc/fstab文件系统列表

 

在/etc/fstab中增加,如下内容:

 

none /sys sysfs fefaults 0 0

 

(4)修改/etc/init.d/halt 脚本中的halt_get_remaining函数

 

找到halt_get_remaining函数,修改

 

awk '$2 ~ /^\/$|^\/proc|^\/dev/{next}

 

修改为

 

awk '$2 ~ /^\/$|^\/proc|^\/sys|^\/dev/{next}

 

(5)修改/etc/modprobe.conf配置文件

由于在linux2.6内核中USB驱动模块被改名了,在主机控制方面,usb-ohci被改成ochi-hcd,usb-uhci被改变成uhci-hcd,因此modprobe.conf配置文件中应该进行相应的改变。

 

alias usb-controller uhci-hcd

 

12、修改Grub启动管理器

如果没有错误的话, 下面开始修改grub配置文件(不要告诉我你用的lilo)

在/boot目录下,执行以下命令:

 

# new-kernel-pkg --mkinitrd --depmod--install 2.6.18 (这时候你的/boot下生成一个initrd-2.6.18.img,并且你的grub.conf也作了相应更改,因为我的在make install命令中已经生成了initrd-2.6.18.img所以我并没有用这条命令,下条命令也没用到)

# 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

 

 

13,# init 6 (重启机器,以启动新内核)

大功告成!看看升级后的2.6内核吧!

 

新内核启动期间问题

 

init[1]: segfault at 00000021 eip 00000021esp bfbb7bb8 error 4

或者

init[1]: segfault at 21 ip 00000021 spbf9e5878 error 4 in init[804800+6000]

Kernel panic - not syncing: Attempted tokill init!

 

1)有网友说:出现这个错误,而且系统应该算是崩溃了,一直不停刷屏。这个是在编译2.6.23和.2.6.24时出现的错误。尚未解决。网上好多朋友也都说碰到这个问题,好多也没有解决。有人解答说虚拟机下不能升级到2.6.20以上的版本。可能这样说还是有些问题,我曾经试过一下内核都是可以的,2.6.19,2.6.20,2.6.21,到2.6.22时没有出现上面的刷屏现象,但2.6.24刷屏前的代码和它相似,估计是从.26.22版本改了一些东西导致的。具体原因不解。

2)也有网友说:在vmware里只能升内核到2.6.18,2.6.23以上内核可以编译通过reboot后不能进入系统。如果要用2.6.24,在vmware中就用Fedora系统吧。

3)反正这个问题就是关于内核版本差异的问题,要想解决此问题,需要内核的可移植性支持,拭目以待高手出现吧

 

 

五、System.map、vmlinuz、initrd-2.4.7-10.img的产生和作用

   一、vmlinuz

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

  vmlinuz的建立有两种方式。一是编译内核时通过“make zImage”创建,然后通过:“cp /usr/src/linux-2.4/arch/i386/linux/boot/zImage/boot/vmlinuz”产生。zImage适用于小内核的情况,它的存在是为了向后的兼容性。

二是内核编译时通过命令makebzImage创建,然后通过:“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的压缩文件。

二、initrd-x.x.x.img

  initrd是“initial ramdisk”的简写。initrd一般被用来临时的引导硬件到实际内核vmlinuz能够接管并继续引导的状态。图中的initrd-2.4.7-10.img主要是用于加载ext3等文件系统及scsi设备的驱动。

  比如,使用的是scsi硬盘,而内核vmlinuz中并没有这个scsi硬件的驱动,那么在装入scsi模块之前,内核不能加载根文件系统,但 scsi模块存储在根文件系统的/lib/modules下。为了解决这个问题,可以引导一个能够读实际内核的initrd内核并用initrd修正 scsi引导问题。initrd-2.6.20-1.img是用gzip压缩的文件,initrd实现加载一些模块和安装文件系统等功能。

  initrd映象文件是使用mkinitrd创建的。mkinitrd实用程序能够创建initrd映象文件。这个命令是RedHat专有的。其它Linux发行版或许有相应的命令。这是个很方便的实用程序。具体情况请看帮助:manmkinitrd下面的命令创建initrd映象文件。

三、System.map

  System.map是一个特定内核的内核符号表。它是你当前运行的内核的System.map的链接。

  内核符号表是怎么创建的呢?System.map是由“nm vmlinux”产生并且不相关的符号被滤出。

  对于本文中的例子,编译内核时,System.map创建在/usr/src/linux-2.4/System.map。像下面这样:

  nm /boot/vmlinux-2.6.20-1> System.map

  下面几行来自/usr/src/linux-2.4/Makefile:

  nm vmlinux |grep -v '\(compiled\)\|\(\.o$$\)\|\( [aUw] \)\|\(\.\.ng$$\)\|\(LASH[RL]DI\)' |sort > System.map

  

  然后复制到/boot:

  cp/usr/src/linux/System.map /boot/System.map-2.6.20-1

  

  下面是System.map文件的一部分:

c0100000 A _text

c0100000 t startup_32

c01000a5 t checkCPUtype

c0100133 t is486

c0100142 t is386

c010018c t L6

c010018e t ready

c010018f t check_x87

c01001b6 t setup_idt

c01001d3 t rp_sidt

c01001e0 T stack_start

c01001e8 t int_msg

c01001fc t ignore_int

c010021e T idt_descr

c0100224 T cpu_gdt_descr

c0101000 T swapper_pg_dir

c0102000 T pg0

c0103000 T pg1

c0104000 T empty_zero_page

c0105000 T _stext

  在进行程序设计时,会命名一些变量名或函数名之类的符号。Linux内核是一个很复杂的代码块,有许许多多的全局符号。

  Linux内核不使用符号名,而是通过变量或函数的地址来识别变量或函数名。比如不是使用size_t BytesRead这样的符号,而是像c0343f20这样引用这个变量。

  对于使用计算机的人来说,更喜欢使用那些像size_t BytesRead这样的名字,而不喜欢像c0343f20这样的名字。内核主要是用c写的,所以编译器/连接器允许我们编码时使用符号名,当内核运行时使用地址。

  然而,在有的情况下,我们需要知道符号的地址,或者需要知道地址对应的符号。这由符号表来完成,符号表是所有符号连同它们的地址的列表。上图就是一个内核符号表,由上图可知变量名checkCPUtype在内核地址c01000a5。

  Linux 符号表使用到2个文件:

  /proc/ksyms

  System.map

  

  /proc/ksyms是一个“proc file”,在内核引导时创建。实际上,它并不真正的是一个文件,它只不过是内核数据的表示,却给人们是一个磁盘文件的假象,这从它的文件大小是0可以看出来。然而,System.map是存在于你的文件系统上的实际文件。

  当你编译一个新内核时,各个符号名的地址要发生变化,你的老的System.map具有的是错误的符号信息。每次内核编译时产生一个新的System.map,你应当用新的System.map来取代老的System.map。

  虽然内核本身并不真正使用System.map,但其它程序比如klogd,lsof和ps等软件需要一个正确的System.map。如果你使用错误的或没有System.map,klogd的输出将是不可靠的,这对于排除程序故障会带来困难。没有System.map,你可能会面临一些令人烦恼的提示信息。

  另外少数驱动需要System.map来解析符号,没有为你当前运行的特定内核创建的System.map它们就不能正常工作。

  Linux的内核日志守护进程klogd为了执行名称-地址解析,klogd需要使用System.map。System.map应当放在使用它的软件能够找到它的地方。执行:man klogd可知,如果没有将System.map作为一个变量的位置给klogd,那么它将按照下面的顺序,在三个地方查找System.map:

  /boot/System.map

  /System.map

  /usr/src/linux/System.map

  System.map也有版本信息,klogd能够智能地查找正确的映象(map)文件。

 

注:如果感兴趣,想进一步了解,可以看看下面这篇文章,讲Makefile…..等等。。。。

Linux 内核配置方式详解:

http://www.51testing.com/?uid-225738-action-viewspace-itemid-237838

Linux内核配置系统浅析:

https://www.ibm.com/developerworks/cn/linux/kernel/l-kerconf/

 

原创粉丝点击