CentOS5内核版本2.6.18升级至3.6.4

centos5.6 kernel版本:2.6.18-238.el5-i686
所编译的kernel版本:linux-3.6.4.tar.bz2

1.将新内核cp到/usr/src目录下,然后释放内核源代码:

#bzip2 -d linux-3.6.4.tar.bz2 -> linux-3.6.4.tar
#tar -xvf linux-3.6.4.tar

2.开始设置内核编译模块及参数

make menuconfig

设置编译成模块或是否编译进内核或不选,这里增加了新内核对于虚拟化的支持模块,其他保持不变,保存退出。

make mrproper or make clean

删除安装过程中产生的大量临时文件
注意:如果直接跳过下面步骤,在make bzImage过程中会报以下错误:

In file included from /usr/include/sys/time.h:31,
                 from /usr/include/linux/input.h:12,
                 from samples/hidraw/hid-example.c:14:
/usr/include/sys/select.h:78: 错误:与 ‘fd_set’ 类型冲突
/usr/include/linux/types.h:12: 错误:‘fd_set’ 的上一个声明在此
In file included from /usr/include/linux/input.h:14,
                 from samples/hidraw/hid-example.c:14:
/usr/include/sys/types.h:62: 错误:与 ‘dev_t’ 类型冲突
/usr/include/linux/types.h:13: 错误:‘dev_t’ 的上一个声明在此
/usr/include/sys/types.h:67: 错误:与 ‘gid_t’ 类型冲突
/usr/include/linux/types.h:27: 错误:‘gid_t’ 的上一个声明在此
/usr/include/sys/types.h:72: 错误:与 ‘mode_t’ 类型冲突
/usr/include/linux/types.h:15: 错误:‘mode_t’ 的上一个声明在此
/usr/include/sys/types.h:77: 错误:与 ‘nlink_t’ 类型冲突
/usr/include/linux/types.h:16: 错误:‘nlink_t’ 的上一个声明在此
/usr/include/sys/types.h:82: 错误:与 ‘uid_t’ 类型冲突
/usr/include/linux/types.h:26: 错误:‘uid_t’ 的上一个声明在此
In file included from /usr/include/sys/types.h:133,
                 from /usr/include/linux/input.h:14,
                 from samples/hidraw/hid-example.c:14:
/usr/include/time.h:105: 错误:与 ‘timer_t’ 类型冲突
/usr/include/linux/types.h:22: 错误:‘timer_t’ 的上一个声明在此
In file included from /usr/include/linux/input.h:14,
                 from samples/hidraw/hid-example.c:14:
/usr/include/sys/types.h:235: 错误:与 ‘blkcnt_t’ 类型冲突
/usr/include/linux/types.h:114: 错误:‘blkcnt_t’ 的上一个声明在此
samples/hidraw/hid-example.c:15:26: 错误:linux/hidraw.h:没有那个文件或目录
samples/hidraw/hid-example.c: In function ‘main’:
samples/hidraw/hid-example.c:48: 错误:‘rpt_desc’ 的存储大小未知
samples/hidraw/hid-example.c:49: 错误:‘info’ 的存储大小未知
samples/hidraw/hid-example.c:65: 错误:‘HIDIOCGRDESCSIZE’ 未声明 (在此函数内第一次使 用)
samples/hidraw/hid-example.c:65: 错误:(即使在一个函数内多次出现,每个未声明的标识符 在其
samples/hidraw/hid-example.c:65: 错误:所在的函数内只报告一次。)
samples/hidraw/hid-example.c:73: 错误:‘HIDIOCGRDESC’ 未声明 (在此函数内第一次使用)
samples/hidraw/hid-example.c:84: 警告:隐式声明函数 ‘HIDIOCGRAWNAME’
samples/hidraw/hid-example.c:91: 警告:隐式声明函数 ‘HIDIOCGRAWPHYS’
samples/hidraw/hid-example.c:98: 错误:‘HIDIOCGRAWINFO’ 未声明 (在此函数内第一次使用)
samples/hidraw/hid-example.c:49: 警告:未使用的变量 ‘info’
samples/hidraw/hid-example.c:48: 警告:未使用的变量 ‘rpt_desc’
samples/hidraw/hid-example.c: In function ‘bus_str’:
samples/hidraw/hid-example.c:171: 错误:‘BUS_VIRTUAL’ 未声明 (在此函数内第一次使用)
make[2]: *** [samples/hidraw/hid-example] 错误 1
make[1]: *** [samples/hidraw] 错误 2
make: *** [vmlinux] 错误 2

通过百度,找到如下解决方法,经实验证明可行。

vi samples/hidraw/hid-example.c

(参考:http://www.uplook.cn/index-Index-show-view157832.html
在Linux下编译程序有时会遇到这种问题,这貌似是一个Linux历史遗留问题: 把所有#include <sys/xxx.h>都提到最前面,把#include <linux/xxx.h>的包含放在其后,就可以编译通过了,之所以出现面的问题是存在循环引用所致。 )

将13-15行的如下3行移动到33行以后。 

     13 #include <linux/types.h>
     14 #include <linux/input.h>
     15 #include <linux/hidraw.h> 

     29 #include <sys/ioctl.h>
     30 #include <sys/types.h>
     31 #include <sys/stat.h>
     32 #include <fcntl.h>
     33 #include <unistd.h>
vi /usr/include/linux/input.h
line 647
#define BUS_PCI                 0x01
#define BUS_ISAPNP              0x02
#define BUS_USB                 0x03
#define BUS_HIL                 0x04
#define BUS_BLUETOOTH           0x05
/*以下一行为新增*/
#define BUS_VIRTUAL             0x06 

#define BUS_ISA                 0x10
#define BUS_I8042               0x11
#define BUS_XTKBD               0x12
#define BUS_RS232               0x13
#define BUS_GAMEPORT            0x14
#define BUS_PARPORT             0x15
#define BUS_AMIGA               0x16
#define BUS_ADB                 0x17
#define BUS_I2C                 0x18
#define BUS_HOST                0x19
#define BUS_GSC                 0x1A
/*以下两行为新增*/
#define BUS_ATARI               0x1B
#define BUS_SPI                 0x1C

完成以上修改后,开始编译内核。

make bzImage

建立内核,通常在/usr/src/arch/x86/boot目录下

make modules

编译内核模块;(可选)

make modules_install

安装新内核模块,即把内核模块存放到相应的位置

make install

安装内核

#设置使用新内核启动。

# sed -i 's#default=1#default=0#g' grub.conf
# vi /boot/grub/grub.conf

/boot/grub/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/sda3
#          initrd /initrd-version.img
#boot=/dev/sdadefault=0 timeout=5
splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenutitle CentOS (3.6.4)
        root (hd0,0)
        kernel /vmlinuz-3.6.4 ro root=LABEL=/ 
        initrd/initrd-3.6.4.img  
title CentOS (2.6.18-238.el5)
        root (hd0,0)
        kernel /vmlinuz-2.6.18-238.el5 ro root=LABEL=/
        initrd /initrd-2.6.18-238.el5.img

重启系统

# reboot

验证内核版本

# uname -a

到此为止,内核成功升级到3.6.4。

添加新评论 »