内核编译        
    编译前一定要注意把selinux关闭,和根分区要有足够的空间
     
    为什么重新编译内核
      新的内核修订了旧内核的bug,并增加了许多新的特性。如果用户想要使用这些新特性,或想根据自己的系统度身定制一个更高效,更稳定的内核,就需要重新编译内核。通常,更新的内核会支持更多的硬件,具备更好的进程管理能力,运行速度更快、 更稳定,并且一般会修复老版本中发现的许多漏洞等
    为了正确的合理地设置内核编译配置选项,从而只编译系统需要的功能的代码,一般主要有下面四个考虑:
        1、自己定制编译的内核运行更快(具有更少的代码)
      2、系统将拥有更多的内存(内核部分将不会被交换到虚拟内存中)
        3、不需要的功能编译进入内核可能会增加被系统攻击者利用的漏洞
      4、将某种功能编译为模块方式会比编译到内核内的方式速度要慢一些
     
    内核编译模式
      要增加对某部分功能的支持,比如网络之类,可以把相应部分编译到内核中(build-in),也可以把该部分编译成模块(module)动态调用。如果编译到内核中,在内核启动时就可以自动支持相应部分的功能,这样的优点是方便、速度快,机器一启动,你就可以使用这部分功能了;缺点是会使内核变得庞大起来,不管你是否需要这部分功能,它都会存在,这就是Windows惯用的招数,建议经常使用的部分直接编译到内核中,比如网卡。如果编译成模块,就会生成对应的.o文件,在使用的时候可以动态加载,优点是不会使内核过分庞大,缺点是你得自己来调用这些模块
     
     
    软件准备
     
    red hat更新源下载下面相应的rpm 新光盘中的包就行
    mkinitrd-*.i386.rpm
    lvm2-*.el5.i386.rpm
    device-mapper-*.el5.i386.rpm
     
     
    安装必要软件
    安装rpm
    rpm -ivh --nodeps mkinitrd-*.i386.rpm
    rpm -ivh --nodeps lvm2-*.el5.i386.rpm
    rpm -ivh --nodeps device-mapper-*.el5.i386.rpm
    --nodeps
    不检查包的依赖关系
    --force
    如果不能安装在加上强制安装选项
     
    安装module-init-tools工具
    [root@zzh module-init-tools-3.11.1]# ./configure --prefix=/
    make moveold
    make all install
    ./generate-modprobe.conf /etc/modprobe.conf
    make moveold将把系统原来的modutils工具程序改名为*.old这步非常重要, 这将使得以继续使用原有的系统, 因为新的module-init- tools工具包实际上是倚赖原来*.old程序来加载内核模块.
     
    安装hotplug(可选对USB支持)
    [root@zzh hotplug-2004_09_23]# make install
     
     
    安装内核
    kernel解压到/usr/src/目录
    [root@zzh /]# yum install ncurses*
    如果没有这个文件不能开启图像界面
    [root@zzh /]# rm -rf /usr/src/linux/
    删除linux目录,如果之前内核没有升级过这个目录是没有的
    [root@zzh /]# ln -s /usr/src/linux-2.6.31.1/ /usr/src/linux
    做个软连接
     
    默认情况下x86 CPU系列下面这一步可以省略
    # rm -rf /usr/include/asm /usr/include/linux /usr/include/scsi
    # ln -s /usr/src/linux/include/asm-i386 /usr/include/asm
    # ln -s /usr/src/linux/include/linux /usr/include/linux
    # ln -s /usr/src/linux/include/scsi /usr/include/scsi
     
    可根据需要修改内核源代码可省去日后再修改了(可选) 
    [root@zzh /]# vim /usr/src/linux/include/linux/posix_types.h
    设置fd_set支持的最大数量 
    define __FD_SETSIZE    65535
         
    [root@zzh /]# vim /usr/src/linux/include/linux/fs.h
    设置最大打开文件数量(TCP连接数量)
    define INR_OPEN 65535
    define NR_FILE 65535
    define NR_RESERVED_FILES 128
     
     
    配置选项
    [root@zzh linux]# make mrproper
    确保源代码目录下没有不正确的.o文件以及文件的互相依赖
    [root@zzh linux]# make menuconfig
    进入/usr/src/linux/目录配置内核选项
    进入菜单界面来配置内核
     Y-将该功能编译进内核
     N-不将该功能编译进内核
     M-将该功能编译成可以在需要时动态插入到内核中的模块
    模块支持
    Enable loadable module support  --->
    [*]   Module unloading
     
    虚拟接口支持
    Device Drivers  --->
    Block devices  --->
    <*>   Loopback device support
     
    磁盘支持
    Device Drivers  --->
    Multiple devices driver support (RAID and LVM)  --->
    <*>   Device mapper support
     
    对应网卡支持
    Device Drivers  --->
    Network device support  --->
    Ethernet (10 or 100Mbit)  --->
    <*>   nForce Ethernet support
     
    文件系统
    File systems  --->
    <*> Ext3 journalling file system support
    [*] Ext3 extended attributes
    [*] Ext3 POSIX Access Control Lists
    [*] Ext3 Security Labels
    [*] JBD (ext3) debugging support
     
    NTFD支持
    File systems  --->
    DOS/FAT/NT Filesystems  --->
    <*> NTFS file system support
     
    more /usr/src/linux/.config
    可以查看指定的模块是否已被选中
     
    编译
    make dep
    建立编译时所需的从属文件,注意:内核从未编译过此步可跳过
    make clean
    清除内核编译的目标文件,注意:如果内核从未编译过此步可跳过
    make -jn
    数字n是多进程编译,加快编译速度,注意: 此命令已完成make bzImage及make modules的工作
    make modules
    编译可加载模块
    make modules_install
    安装可加载模块
    make install
    安装新内核
     
    启用新内核
    [root@zzh /]# cp /usr/src/linux/arch/i386/boot/bzImage /boot/vmlinuz-2.6.31.1
    [root@zzh /]# cp /usr/src/linux/System.map /boot/System.map-2.6.31.1
     
    [root@zzh /]# rm -rf /boot/System.map /boot/vmlinuz
    删除之前编译用的连接
     
    [root@zzh /]# ln –s /boot/vmlinuz-2.6.31.1 /boot/vmlinuz
    [root@zzh /]# ln –s /boot/System.map-2.6.31.1 /boot/System.map
     
     
    修改Grub启动管理器
    # new-kernel-pkg --mkinitrd --depmod --install 2.6.31.1
    在/boot目录下执行以下命令
    这时候你的/boot下会生成一个initrd-2.6.31.1.img并且你的grub.conf文件也作了相应更改
     
    [root@zzh /]# df
    查看根分区对应的实际的分区
    /dev/hda3      /
     
    [root@zzh /]# vim /etc/grub.conf
    将kernel行的LABEL=/换成根目录所在的实际分区
    default=0
    timeout=5
    splashp_w_picpath=(hd0,0)/grub/splash.xpm.gz
    hiddenmenu
    title CentOS (2.6.31.1)
    root (hd0,0)
    kernel /vmlinuz-2.6.31.1 ro root=/dev/hda3 rhgb quiet
    initrd /initrd-2.6.31.1.img