liwuxcn 发表于 2012-5-20 09:07

ubuntu12.04 升级内核实战

      ubuntu 12.04内核是linux 3.2.0-24,其实升级到最新版本3.3.4也没什么很大意义,主要是集成了一些新的驱动和一些普通用户用不到的功能,所以基本上本文纯属折腾,但不要随便升级当班设备啊!好了,不废话了,我们开始...........首先是准备条件:①、有一台装有ubuntu 12.04的机器②、先移步到http://www.kernel.org/下载linux稳定版内核③、拥有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 zxvfncurses<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(也可以直接复制现有的.config文件,我是这样做的!!!)3,确定依赖性     根据以往的经验,这一步是必须的,但是这次编译的时候,系统提醒我没必须要执行这个命令:    make dep    如果用现有的.config文件,这里会有很多内核新增加的驱动和功能让你确认是否编入内核中,这个你就自己看着输入y/n/m/?吧!4,清除编译中间文件    输入命令:make clean5,生成新内核(这是我用的时间07:38-07:57,19分钟。这里时间的长短都取决于你机器的性能)    就是把配置过程中,我们选中编入内核中的程序编译链接生产linux内核,输入命令:    make bzImage6,生成modules(这是我用的时间07:58-09:28)    和上步差不多,就是把配置过程中,我们选中编成modules的程序编译链接成modules,输入命令:    make modules7,安装modules    就是把刚才编译生产的modules拷到系统文件夹下,以供新内核调用。输入命令:    make modules_install    一切都自动做好了。8,建立要载入ramdisk的映像文件    如果linux系统安装在scsi磁盘上,这步是必须的,否则可以跳过。我的linux是装在vmware上的,用的是虚拟的scsi磁盘,所以必须 要这一步。输入命令:   mkinitramfs -o /boot/initrd-linux3.3.4.img3.3.4   如果你的linux不是ubuntu,而是其他的发行版本,那么使用的命令可能不是mkinitramfs,而是mkinitrd,但功能和用法类似。9,按装内核   输入命令:make install   此时系统会把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'\)
这样就成功删除了,重启一下看看是不是没有那些没用的内核启动项了。

完工!

390517426 发表于 2012-5-20 11:54


Archlinux无压力……

187194661 发表于 2012-5-20 11:58

呢你。。。。。。。。

ysh_0212 发表于 2012-5-20 19:07

不错的文章,以后我可以在这里学习了

dxjinf 发表于 2012-5-21 11:39

搞这么麻烦,哎,看来真的普及啦,奉献本人不用编译的适合ubuntu及其衍生版(所有用deb包的linux系统)

看例子中的内核版本,哥用这个真的很久啦,现在内核都3.3.6啦,3.4的还在测试中


每次linux的最新内核发布都需要自己编译,现在不用了,因为有爱好者已经做好了deb格式的安装包(不懂deb格式的下面就不要看了),适用于一切基于ubuntu开发的各种版本,包括最流行的linuxmint。
进入以下网址
http://kernel.ubuntu.com/~kernel-ppa/mainline/
拖到最后即可
按照你的ubuntu版本下载所需的文件,下面以i386为例说一下安装顺序(amd和i386的均只需要下载3各文件)

其中linux-headers-(发布日期)_all.deb   32位和64位用户都需要下载,剩下的4个选项,标有i386的两个选项需要32位用户下载,标有amd64的两个需要64位用户下载。

安装顺序(2.6.38 32位为例):
linux-headers-2.6.38-020638-generic_2.6.38-020638.201103151303_i386.deb
linux-headers-2.6.38-020638_2.6.38-020638.201103151303_all.deb
linux-image-2.6.38-020638-generic_2.6.38-020638.201103151303_i386.deb
直接双击就可以安装。

alpha81 发表于 2012-5-21 13:39

390517426 发表于 2012-5-20 11:54 static/image/common/back.gif
Archlinux无压力……

同是Archer的来留个脚印,我都没有开testing的。

set2012 发表于 2012-5-21 16:39

绝对的强悍,绝对的精华

dcbakkk 发表于 2012-5-21 21:28

我升级的内核,很多都没有删,现在还在10.04版本中。

梨花香 发表于 2012-5-22 08:14

呃 看着好难啊   对于我这新手来说还是先欣赏下吧!

rwzsycwan 发表于 2012-5-22 19:48

很好的文章只是你说 .config 可以拷贝从哪儿拷贝??{:8_543:}

谢孔叶 发表于 2012-5-22 21:51

等是老手了再折腾吧

liwuxcn 发表于 2012-5-23 10:04

rwzsycwan 发表于 2012-5-22 19:48 static/image/common/back.gif
很好的文章只是你说 .config 可以拷贝从哪儿拷贝??

.config 文件在/usr/src/linux*(* 就看你是什么版本了)里面呢,这是现有内核配置文件。

liwuxcn 发表于 2012-5-23 10:11

dxjinf 发表于 2012-5-21 11:39 static/image/common/back.gif
搞这么麻烦,哎,看来真的普及啦,奉献本人不用编译的适合ubuntu及其衍生版(所有用deb包的linux系统)

...

这里只是为了让大家了解这个过程,现成的东西有很多,很多人都不知道是怎么来的。

rwzsycwan 发表于 2012-5-23 10:13

liwuxcn 发表于 2012-5-23 10:04 static/image/common/back.gif
.config 文件在/usr/src/linux*(* 就看你是什么版本了)里面呢,这是现有内核配置文件。

嗯 试着编译一下{:8_537:}

摆渡 发表于 2012-6-12 10:22

我只是过来看看的,发现正式版的最新内核已经到了stable:3.4.2真快啊,Linux用到现在对内核的编译已经麻木了。

cxbii 发表于 2012-6-12 11:48

我想说,编译新内核并没这么没意义,你可以给它打补丁,新内核一般比旧内核性能更好!
还有的是,编译在任何目录都可以进行!不需要root权限!

BCBX 发表于 2012-9-28 18:23

说起来惭愧,用了二年的Linux了,没有编译过一个内核{:5_291:}

liwuxcn 发表于 2012-9-30 10:46

BCBX 发表于 2012-9-28 18:23 static/image/common/back.gif
说起来惭愧,用了二年的Linux了,没有编译过一个内核

这位兄弟,没有什么好惭愧的,编译内核很简单不说,其实我们自己用Linux都没有那个必要,因为很多发行版都是几个月或者半年都会发布新版本。如果是上线服务器,更没有那个人去干随便就升级内核的,除非是必须必须的...

darkduke 发表于 2012-9-30 10:54

Gentoo路过,内核一向自己编译。

飞天虾仁 发表于 2013-10-20 19:49

dxjinf 发表于 2012-5-21 11:39 static/image/common/back.gif
搞这么麻烦,哎,看来真的普及啦,奉献本人不用编译的适合ubuntu及其衍生版(所有用deb包的linux系统)

...

大哥,提示依赖关系不满足是怎么回事?
页: [1]
查看完整版本: ubuntu12.04 升级内核实战