我使用的是64位的redhat 5.4 版本是2.6.18系统一 准备工作(下载内核升级工具及内核源码)1.下载linux-3.9.6源码。地址是:http://www./pub/linux/mips/kernel/v3.x/ 2.下载module-init-tools。(我使用的是module-init-tools-3.10.tar.bz2,下载地址:https://www./pub/linux/utils/kernel/module-init-tools/) 3.lvm2-2.02.46-8.el5.x86_64.rpm; mkinitrd-5.1.19.6-54.x86_64.rpm; device-mapper-1.02.32-1.el5.x86_64.rpm(这三个可以在你光盘的server文件下面找到) 二 配置工作1.将下载好的内核源代码和工具都放到/usr/src文件夹下。 2.拷贝完毕,开始解压新内核,具体操作请依次执行以下命令; # cd /usr/src(进入/usr/src目录,如果已经在/usr/src目录,可不执行该命令) # rm –rf linux(删除linux文件夹,如果内核以前从未编译过,则没有这个文件夹,可不执行该命令) # tar jvxf linux-3.9.6.tar.bz2(解压新内核) # ln -s linux-3.9.6linux(重新生成linux文件夹) 3.安装module-init-tools工具,在/usr/src目录下,依次执行下列命令; # tar jvxf module-init-tools-3.10.tar.bz2(解压module-init-tools) # cd module-init-tools-3.10(由/usr/src目录进入module-init-tools目录) #./configure--prefix=/ # make moveold # make allinstall #./generate-modprobe.conf/etc/modprobe.conf
4.安装另外三个升级工具,回到/usr/src目录下,依次执行下列命令; # rpm -ivh--nodeps mkinitrd-4.1.18-2.i386.rpm # rpm -ivh--nodeps lvm2-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 5. 配置内核选项 # cdlinux-2.6.18(进入/usr/src/linux-2.6.18目录) # makemrproper(确保源代码目录下没有不正确的.o文件) #make menuconfig(配置内核选项,这里我使用的是以前的配置文件,命令是 :
cp/boot/config-2.6.18-164.el5 ./.config,然后输入命令makemenuconfig选择load文件:.config) 此时会出现一个图形界面,列出了所有的内核配置选项,有的选项下还有子选项,可以用方向键选择,用Y键确定,大多数选项默认就行,以下几个选项必须选择(这里必须认真选择不然会出错。编译也就不能成功) (1) Loadable Module support中选上"Moduleunloading"和"Automatic kernel module loading" (2) Device Drivers--->Block Devices中选上"Loopbackdevice support"; DeviceDrivers--->Multi-device support(RAID and LVM)中选上"devicemapper support"; DeviceDrivers--->Graphics support中选上"Support for frame buffer devices"; Device Drivers--->USBsupport中选上"USB Mass Storage support"(先将该项依赖项设为y,如果是在实环境中,想要更多USB支持,就全选上); DeviceDrivers--->Network device support--->Ethernet(10 or 100Mbit)中选上"AMDPCnet32 PCI support"(这里在3.9.6的版本里面选项是 Ethernet driver support---> AMD PCnet32 PCI support) Device Drivers--> SCSI device support --> SCSCI low-level drivers --> [M] Serial ATA(SATA) support --> [M] Intel PIIX/ICH SATA support(这个没找到,没选)
如果你在vmware下编译内核,硬盘用的是scsi的,以下三个选项必选: DeviceDrivers---><*>SCSI device support DeviceDrivers---><*>SCSI device support---><*>SCSI disk support DeviceDrivers---><*>SCSI device support--->SCSI low-leveldrivers---><*>BusLogic SCSI support Device Drivers --->;Fusion MPT device support --->;;Fusion MPT (base + ScsiHost) drivers; Fusion MPT misc device (ioctl) driver(这个要不要,不确定)
(3)File system---> 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 JBD (ext3) debugging support File system--->DOS/FAT/NT Filesystems中选上"NTFSfile system support" 注意: ext2和ext3文件系统配置很重要,也是必需的,如果对Ext3、Ext2文件的支持直接编译进内核,在你reboot时机器就会当掉,出现如下错误信息: kernel panic no init found ,trypassing 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 rootfs 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 244kfreed Kernel panic – not syncing No initfound. Try passing init = option to kernel
三 编译工作zcat ../initrd-2.6.30.4.img |cpio -i 11537blocks
1.在/usr/src/linux-2.6.18目录下,执行以下命令: # make dep(建立编译时所需的从属文件,如果内核从未编译过,此步可跳过) # make clean(清除内核编译的目标文件,如果内核从未编译过,此步可跳过) # make bzImage(开始编译) 如果发生以下错误:
这里如果发生simples的错误遇到上面的错误直接更换头文件。参考地址是:http://ju./entry/6447 命令是: [root@wangguan linux-3.9.6]# makeheaders_install [root@wangguan linux-3.9.6]# cd /usr/include/ [root@wangguan include]# mv asm asm_orig [root@wangguan include]# mv linux linux_orig [root@wangguan include]# mv asm-genericasm-generic_orig [root@wangguan include]# cd/usr/src/linux-3.9.6 [root@wangguan linux-3.9.6]# cp -rusr/include/asm /usr/include/ [root@wangguan linux-3.9.6]# cp -r usr/include/asm-generic/ /usr/include/ [root@wangguan linux-3.9.6]# cp -rusr/include/linux /usr/include/
内核编译成功后,会在/usr/src/linux/arch/i386/boot目录中生成一个新内核的映像文件bzImage.如果用makezImage编译,内核很大的话,系统会提示你用make bzImage命令来编译make # make modules(编译可加载模块) 这里可能发生的错误是:
fs/gfs2/rgrp.c: In function ‘rg_mblk_search’: fs/gfs2/rgrp.c:1398: 编译器内部错误:段错误 请提交一份完整的错误报告, 如有可能请附上经预处理后的源文件。 具体步骤请参见<URL:http://bugzilla./bugzilla>。 Preprocessed source stored into /tmp/ccOsYE5A.out file, pleaseattach this to your bugreport. make[2]: *** [fs/gfs2/rgrp.o] 错误 1 make[1]: *** [fs/gfs2] 错误 2 make: *** [fs] 错误 2
原因是在rgrp.c类中对有些构造体方法的变量赋值,初始化的错误。修改为: ------------------------------------------------------------------- 1395 static void rg_mblk_search(struct gfs2_rgrpd *rgd, struct gfs2_inode *ip, 1396 unsigned requested) 1397 { 1398 //struct gfs2_rbm rbm = { .rgd = rgd, }; 1399 struct gfs2_rbm rbm; 1400 rbm.rgd = rgd; 1642 //struct gfs2_rbm rbm = { .rgd = rgd, .bi = rgd->rd_bits, .offset = 0 }; 1643 struct gfs2_rbm rbm; 1644 rbm.rgd = rgd; 1645 rbm.bi = rgd->rd_bits; 1646 rbm.offset = 0; 1943 static unsigned char gfs2_get_block_type(struct gfs2_rgrpd *rgd, u64 block) 1944 { 1945 //struct gfs2_rbm rbm = { .rgd = rgd, }; 1946 struct gfs2_rbm rbm; 1947 rbm.rgd = rgd 1967 static void gfs2_alloc_extent(const struct gfs2_rbm *rbm, bool dinode, 1968 unsigned int *n) 1969 { 1970 //struct gfs2_rbm pos = { .rgd = rbm->rgd, }; 1971 struct gfs2_rbm pos; 1972 pos.rgd = rbm->rgd; 2125 //struct gfs2_rbm rbm = { .rgd = ip->i_rgd, }; 2126 struct gfs2_rbm rbm; 2127 rbm.rgd = ip->i_rgd; ----------------------------------------------------------------------
双斜杠是注释掉原来的申明的方式,将赋值写出来。将涉及到struct gfs2_rbm rbm的申明赋值的方式都修改了(后面有好几个类似的错误)。(这个错误其实在更新完gcc版本后是不会出现的。由于太多人看帖子不发言我就不详细说明了。)
# make modules_install(安装可加载模块) 安装成功后,系统会在/lib/modules目录下生成一个2.6.18子目录,里面存放着新内核的所有可加载模块. # make install(安装新内核) 注意: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.18/drivers/scsi/BusLogic.o/lib/modules/2.6.18/kernel/drivers/scsi 复制过后再执行一下make install,这一步若卡住了,下面的都无法进行。 开机启动的时候如果发生以下错误:
insmod: error inserting '/lib/dm-region-hash.ko': -1 File exists 解决方法是:
Can’t open HIDP control……错误:
在配置的时候 make menuconfig 将蓝牙的设备加上: Bluetooth subsystem support--->
iptables错误 这个错我找了很多的网站,包括翻墙。总算被解决了。
iptables -restore 不能初始化 ip6tables -restore 不能初始化 (这里字太多不想打)
|
|