实验环境:Ubuntu12.04LTS  内核版本  3.5.0   更新内核版本3.9.0   

首先是准备条件:

①、有一台装有ubuntu 12.04的机器

②、先移步到http://www.kernel.org/下载linux稳定版内核(注:可以从科大镜像下载,速度快 http://mirrors.ustc.edu.cn/linux-kernel/   )

③、拥有root权限  

④、并将下载好的内核解压到/usr/src下,使用命令如下:

        #tar jxvf   linux-3.3.4.tar.bz2

       这样你就可以得到一个名叫linux-3.3.4

好,现在一切都准备好了,接下来就开始配置,编译,安装新内核吧!

1, 进入刚才的文件夹 /usr/src/linux-3.3.4,输入命令:

     $ make mrproper

     该命令的功能在于清除当前目录下残留的.config和.o文件,这些文件一般是以前编译时未清理而残留的。而对于第一次编译的代码来说,不存在这些残留文件,所以可以略过此步,但是如果该源代码以前被编译过,那么强烈建议执行此命令,否则后面可能会出现未知的问题。

2, 配置编译选项

     作为操作系统的内核,其内容和功能必然非常繁杂,包括处理器调度,内存管理,文件系统管理,进程通讯以及设备管理等等,而对于不同的硬件,其配置选项也不相同,所以在编译源代码之前必须设置编译选项。其实我觉得这一步是升级内核整个过程中最有技术含量的,因为要根据自己的需要正确选择yes or no需要对计算机方方面面的知识都有所了解。但是这里的选项实在是太多了,大概有几百项之多,我以前曾尝试着一项一项的选,但是最后还是放弃了,因为有很多选项不是很明白。

     既然这样,难道没有什么简便的方法么? 当然有!那就是make menuconfig 或者make xconfig。我使用的是make menuconfig,但是前提条件是要装ncurses。

        ncurses 到http://ftp.gnu.org/pub/gnu/ncurses/下载,可以放到任何目录进行安装:

                        tar zxvf  ncurses<version>.tar.gz  #解压缩并且释放 文件包

cd ncurses<version>        #进入解压缩的目录(注意版本) ./configure                        #按照你的系统环境制作安装配置文件 make                                 #编译源代码并且编译NCURSES库 su root                              #切换到root用户环境 make install                     #安装编译好的NCURSES库

     另外,在make menuconfig过程中也会有一些选项需要你来设置*, y, n 或者m,选择*表示选项中的内容被直接编入内核中,选择m表示选项中的内容不编入内核,而只是编成独立的module,用到时才调用。

     ok, 在当前文件路径下,输入命令:

    make menuconfig(或者用 make xconfig,我没有启用成功)

(也可以直接复制现有的.config文件,我是这样做的!!!)(注:这是因为现在的内核设置针对了大多数的电脑配置,一般包含了基本上的配置,当然写到这里你也可以知道,很多配置对于我们一台机子来说有些多余的了,有了一定基础之后具体可以参照内核板块说明,自己设定。)

3,确定依赖性

    根据以往的经验,这一步是必须的,但是这次编译的时候,系统提醒我没必须要执行这个命令:

    make dep

    如果用现有的.config文件,这里会有很多内核新增加的驱动和功能让你确认是否编入内核中,这个你就自己看着输入y/n/m/?吧!(注:因为我是没有设置,所以没有这三个选项)

4,清除编译中间文件

    输入命令:make clean

(注:接下来的 5,6e -j4   命令,4是你内核数的两倍,比如我的机子是T2450 双核,所以2*2=4,当然你也可以设定另外的常数,但不要超过100,经一些网友实验得到,*2的效率会好点。如果你还是走5,6两步的话,速度会慢点咯)

5,生成新内核(这是我用的时间07:38-07:57,19分钟。这里时间的长短都取决于你机器的性能)

    就是把配置过程中,我们选中编入内核中的程序编译链接生产linux内核,输入命令:

    make bzImage

6,生成modules(这是我用的时间07:58-09:28)

    和上步差不多,就是把配置过程中,我们选中编成modules的程序编译链接成modules,输入命令:

    make modules

(注:经过5,6两步之后,你可以查看是否编译成功 以下的是x86结构下的内核位置


[cpp]  
   view plain 
   copy 
   
 
   
 
 
1. <span style="color:#FF0000;">root@thinking-N-A:/usr/src/linux-3.9# ls -l arch/x86/boot/bzImage   
2. -rw-r--r-- 1 root root 5380928 Jun  8 01:11 arch/x86/boot/bzImage  
3. </span>  
 
 
)

7,安装modules

    就是把刚才编译生产的modules拷到系统文件夹下,以供新内核调用。输入命令:

    make modules_install

(注:经这一步之后,输入如下命令,看是否成功


[cpp]  
   view plain 
   copy 
   
 
   
 
 
1. <span style="color:#FF0000;">root@thinking-N-A:/usr/src/linux-3.9# ls -l /lib/modules/  
2. total 8  
3. drwxr-xr-x 4 root root 4096 Feb 14 06:09 3.5.0-23-generic      //这个是我原来的内核  
4. drwxr-xr-x 3 root root 4096 Jun  8 09:40 3.9.0     
5. </span>  
 
)

    一切都自动做好了。

8,建立要载入ramdisk的映像文件

(注:如果你的机子是2005年入手的,基本上都是scsi磁盘,也可以查看自己机子的磁盘类型,切换到root权限下,输入命令 fdisk -l


[cpp]  
   view plain 
   copy 
   
 
   
 
 
1. root@thinking-N-A:/usr/src/linux-3.9# fdisk -l  
2.   
3. Disk /dev/sda: 156.3 GB, 156292685824 bytes  
4. 255 heads, 63 sectors/track, 19001 cylinders, total 305259152 sectors  
5. Units = sectors of 1 * 512 = 512 bytes  
6. Sector size (logical/physical): 512 bytes / 512 bytes  
7. I/O size (minimum/optimal): 512 bytes / 512 bytes  
8. Disk identifier: 0x8c3283fe  
9.   
10.    Device Boot      Start         End      Blocks   Id  System  
11. /dev/sda1   *        2048      206847      102400    7  HPFS/NTFS/exFAT  
12. /dev/sda2          206848    67690495    33741824    7  HPFS/NTFS/exFAT  
13. /dev/sda3        67690496    92266495    12288000    7  HPFS/NTFS/exFAT  
14. /dev/sda4        92268542   305258495   106494977    f  W95 Ext'd (LBA)  
15. /dev/sda5        92268544   215148543    61440000    7  HPFS/NTFS/exFAT  
16. /dev/sda6       215150592   265930751    25390080   83  Linux  
17. /dev/sda7       265932800   297445375    15756288   83  Linux  
18. /dev/sda8       297447424   305258495     3905536   82  Linux swap / Solaris

dev

/sda  都为scsi硬盘


且下面的步骤是针对所有机子的咯

下面的步骤缺少了一个步骤,即将.config 文件拷贝到 /boot 文件下,故首先要进行

[cpp]  
   view plain 
   copy 
   
 
   
 
 
1. <span style="color:#FF0000;"><strong>root@thinking-N-A:/# cp /usr/src/linux-3.9/.config /boot/config-3.9.0</strong></span>  
 
其中 config-3.9.0 的命名规则为  config-(版本号) 

如若没有这一步的话,会导致报一个 grep  文件不存在错误 

 
)

如果linux系统安装在scsi磁盘上,这步是必须的,否则可以跳过。我的linux是装在vmware上的,用的是虚拟的scsi磁盘,所以必须 要这一步。输入命令:

   mkinitramfs -o /boot/initrd-linux3.3.4.img  3.3.4

   如果你的linux不是ubuntu,而是其他的发行版本,那么使用的命令可能不是mkinitramfs,而是mkinitrd,但功能和用法类似。

9,按装内核

   输入命令:make install

   (注,这一步也会自动更新grup项)

   此时系统会把linux内核的镜像文件还有System.map考入到/boot下,然后会自动生成引导菜单。

10, 配置grub引导程序

     (下面的这步我没做哈,因为我还比较喜欢自己在开机的时候选择内核版本)

       既然新的内核编译并安装好了,那么我们要配置系统的引导程序用新内核正确引导,这一步我的是自动添加的,如果没有自动添加进去就自动动手修改添加吧。对象是/boot/grub/grub.cfg,首先用chmod更改该文件的只读属性。然后参照里面的已有内容添加一个新启动项,我的新启动项是:


menuentry 'Ubuntu,Linux 3.3.4' --class ubuntu --class gnu-linux --class gnu --class os {
        recordfail
        gfxmode $linux_gfx_mode
        insmod gzio
        insmod part_msdos
        insmod ext2
        set root='(hd0,msdos1)'
        search --no-floppy --fs-uuid --set=root ee7c3a4d-5305-46b1-807e-fa9f39a5d13e
        linux        /boot/vmlinuz-3.3.4 root=UUID=ee7c3a4d-5305-46b1-807e-fa9f39a5d13e ro   quiet splash $vt_handoff
        initrd        /boot/initrd.img-3.3.4
}
menuentry 'Ubuntu,Linux 3.3.4 (恢复模式)' --class ubuntu --class gnu-linux --class gnu --class os {
        recordfail
        insmod gzio
        insmod part_msdos
        insmod ext2
        set root='(hd0,msdos1)'
        search --no-floppy --fs-uuid --set=root ee7c3a4d-5305-46b1-807e-fa9f39a5d13e
        echo        '载入 Linux 3.3.4 ...'
        linux        /boot/vmlinuz-3.3.4 root=UUID=ee7c3a4d-5305-46b1-807e-fa9f39a5d13e ro recovery nomodeset
        echo        '载入初始化内存盘...'
        initrd        /boot/initrd.img-3.3.4
}
submenu "Previous Linux versions" {
menuentry 'Ubuntu,Linux 3.2.0-24-generic-pae' --class ubuntu --class gnu-linux --class gnu --class os {
        recordfail
        gfxmode $linux_gfx_mode
        insmod gzio
        insmod part_msdos
        insmod ext2
        set root='(hd0,msdos1)'
        search --no-floppy --fs-uuid --set=root ee7c3a4d-5305-46b1-807e-fa9f39a5d13e
        linux        /boot/vmlinuz-3.2.0-24-generic-pae root=UUID=ee7c3a4d-5305-46b1-807e-fa9f39a5d13e ro   quiet splash $vt_handoff
        initrd        /boot/initrd.img-3.2.0-24-generic-pae
}
menuentry 'Ubuntu,Linux 3.2.0-24-generic-pae (恢复模式)' --class ubuntu --class gnu-linux --class gnu --class os {
        recordfail
        insmod gzio
        insmod part_msdos
        insmod ext2
        set root='(hd0,msdos1)'
        search --no-floppy --fs-uuid --set=root ee7c3a4d-5305-46b1-807e-fa9f39a5d13e
        echo        '载入 Linux 3.2.0-24-generic-pae ...'
        linux        /boot/vmlinuz-3.2.0-24-generic-pae root=UUID=ee7c3a4d-5305-46b1-807e-fa9f39a5d13e ro recovery nomodeset
        echo        '载入初始化内存盘...'
        initrd        /boot/initrd.img-3.2.0-24-generic-pae
}
    默认是从新内核镜像启动系统。
    万事ok,敲下reboot,系统启动后,从grub菜单中选中新内核引导linux,怎么样,系统启动的鼓声响了吧!
    进入后用uname -a看看是否新内核。
11、删除旧内核文件
 

1,查看一下当前内核版本:uname -a 

2.查看一下当前系统内的所有内核文件:dpkg --get-selections|grep linux 

3.删除内核文件: 

sudo apt-get remove linux-image- 
3.2.0-24* 
sudo apt-get remove linux- 
headers 
- 
3.2.0-24* 
或( 
删除当前版本之外的所有内核 
) 
sudo apt-get purge ~ilinux-image-.*\(\!`uname -r`\)



4.另外一条命令:

 


sudo aptitude purge ~ilinux-image-*\(\!'uname -r'\)


这样就成功删除了,重启一下看看是不是没有那些没用的内核启动项了。