Date: 4-Mar-2011
1. 编译平台 Vmware_6.0,RedHat-Enterprise-4-i386-AS(linux-2.6.9-5)
2.几个重要的内核文件 ls –l /boot
1) vmlinuz是vmlinux可引导、压缩的内核。‘vm’表‘Virtual Memory’。Vmlinuz建立的方式有两种:make zImage或make bzImage然后将生成的zImage复制成 /boot/vmlinuz。bzImage中的b是“big”意思。 zImage和bzImage都用gzip压缩的。它们不仅是一个压缩文件,而且在这两个文件的开头部分内嵌有gzip解压缩代码。所以不能用gunzip 或 gzip –dc解包vmlinuz。内核文件中包含一个微型的gzip用于解压缩内核并引导它。两者的不同之处在于,老的zImage解压缩内核到低端内存(第一个640K),bzImage解压缩内核到高端内存(1M以上)。如果内核比较小,那么可以采用zImage 或bzImage之一,两种方式引导的系统运行时是相同的。大的内核采用bzImage,不能采用zImage;
2) initrd-x.x.x.imginitrd是“initial ramdisk”的简写。initrd一般被用来临时的引导硬件到实际内核vmlinuz能够接管并继续引导的状态。比如,使用scsi硬盘时内核vmlinuz中并没有这个scsi硬件的驱动,那么在装入scsi模块之前,内核不能加载根文件系统,但scsi模块存储在根文件系统的/lib/modules下。为了解决这个问题,可以引导一个能够读实际内核的initrd内核并用initrd修正scsi引导问题;
3) System.map是一个特定内核的内核符号表。在进行程序设计时,会命名一些变量名或函数名之类的符号。Linux内核是一个很复杂的代码块,有许许多多的全局符号。 Linux内核不使用符号名,而是通过变量或函数的地址来识别变量或函数名。比如不是使用size_t BytesRead这样的符号,而是像c0343f20这样引用这个变量。 对于使用计算机的人来说,更喜欢使用那些像size_t BytesRead这样的名字,而不喜欢像c0343f20这样的名字。内核主要是用c写的,所以编译器/连接器允许我们编码时使用符号名,当内核运行时使用地址。 然而,在有的情况下,我们需要知道符号的地址,或者需要知道地址对应的符号。这由符号表来完成,符号表是所有符号连同它们的地址的列表。
3. 获取新版本内核
cd /usr/src
wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.28.tar.gz
gzip –dc linux-2.6.28.tar.gz | tar xvf –
cd linux-2.6.28
4.保存当前系统相关文件
cp –af /lib/modules /lib/modules.bak
cp –af /boot /boot.bak
cp –af /etc/grub.conf /etc/grub.conf.bak
5.make mrproper //清除*.o及*.config等文件
6.配置内核选项 make menuconfig
具体设置须详细了解每一选项。
7.编译内核
make clean //清除*.o文件
make bzImage //编译内核及built-in模块
make modules //编译可加载模块
make modules_install
depmod –a //建立模块之间的依赖关系
make install
注:将Fusion MPT device support选项选上,就不会出现No module mptbase found for 错误了。
8.reboot
注:将kernel /vmlinuz-2.6.28 ro root=LABEL=/ 改为 kernel /vmlinuz-2.6.28 ro root=/dev/sda3就不会产生mkrootdev: label /not found错误。
9. 再次reboot
10. 查询相关资料,其中有一种说法是Linux版本(这里用的是Redhat Enterprise Linux 4)启动的某种机制导致了这个错误。
11.编译新内核失败。