ubuntu内核升级

转载自http://blog.csdn.net/wyjkk/archive/2010/07/19/5747806.aspx

稍作修改

(1)虚拟机内安装ubuntu10.10

(2)终端下运行sudo su 用户名,该命令的作用是临时以root身份执行以下命令。

(3)下载linux 内核2.6.34.11源码,并解压到所需目录下,使用命令如下:

# cd /usr/src

# tar -jxvh linux-2.6.34.11.tar.bz2

这样你就可以得到一个名叫linux-2.6.34.11的文件夹了。

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

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

$ make mrproper

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

2, 配置编译选项

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

既然这样,难道没有什么简便的方法么? 当然有!那就是make menuconfig 或者make xconfig。我使用的是make menuconfig,但是前提条件是要装ncurse。至于什么是curses和ncurse,它们之间有什么样的关系,大家可以参见http://hi.baidu.com/liyangzhao/blog/item/d610c1016b44ef00728da50e.html,上面的介绍很详细。

具体的执行代码如下:

# apt-get install ncurses-dev

# make menuconfig

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

根据菜单提示,选择编译配置选项,并保存配置文件为.config

(由于在ubuntu中第一次实验,自己配置极为麻烦,故拷贝原内核的配置文件.config到当前目录下,再make menuconfig保存当前设置)(.config文件默认隐藏在linux内核文件夹下 需要#ls -a)

3,确定依赖性

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

# make dep

4,清除编译中间文件

# make clean

5,生成新内核

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

make bzImage

6,生成modules

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

make modules(时间极长 考虑优化方法)

7,安装modules

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

make modules_install

一切都自动做好了。

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

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

mkinitramfs -o /boot/initrd-linux2.6.34.11.img 2.6.34.11

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

9,安装内核

输入命令:make install

此时系统会把linux内核的镜像文件还有System.map考入到/boot下.

10, 配置grub引导程序

linux中的grub相当于win7中的BIOS。既然新的内核编译并安装好了,那么我们要配置系统的引导程序用新内核正确引导。这一步既可以是自动的,也可以是手动的。

对于自动的情况,只需执行下面这句命令就可以(这种方法我没有试过,不保证正确性)

# update-grub

我选择的是手动设置grub,对象是/boot/grub/grub.cfg,首先用chmod更改该文件的只读属性。然后参照里面的已有内容添加一个新启动项、

# chmod 777 /boot/grub/grub.cfg

# vim /boot/grub/grub.cfg

打开之后的grub.cfg如下:

#
# DO NOT EDIT THIS FILE
#
# It is automatically generated by /usr/sbin/grub-mkconfig using templates
# from /etc/grub.d and settings from /etc/default/grub
#

### BEGIN /etc/grub.d/00_header ###
if [ -s $prefix/grubenv ]; then
  load_env
fi
set default="0"
if [ ${prev_saved_entry} ]; then
  set saved_entry=${prev_saved_entry}
  save_env saved_entry
  set prev_saved_entry=
  save_env prev_saved_entry
  set boot_once=true
fi

function savedefault {
  if [ -z ${boot_once} ]; then
    saved_entry=${chosen}
    save_env saved_entry
  fi
}

function recordfail {
  set recordfail=1
  if [ -n ${have_grubenv} ]; then if [ -z ${boot_once} ]; then save_env recordfail; fi; fi
}
insmod ext2
set root=‘(hd0,1)‘
search --no-floppy --fs-uuid --set 2e78226c-16d3-4da2-a35a-77e2146d6427
if loadfont /usr/share/grub/unicode.pf2 ; then
  set gfxmode=640x480
  insmod gfxterm
  insmod vbe
  if terminal_output gfxterm ; then true ; else
    # For backward compatibility with versions of terminal.mod that don‘t
    # understand terminal_output
    terminal gfxterm
  fi
fi
insmod ext2
set root=‘(hd0,1)‘
search --no-floppy --fs-uuid --set 2e78226c-16d3-4da2-a35a-77e2146d6427
set locale_dir=($root)/boot/grub/locale
set lang=zh
insmod gettext
if [ ${recordfail} = 1 ]; then
  set timeout=-1
else
  set timeout=10
fi
### END /etc/grub.d/00_header ###

### BEGIN /etc/grub.d/05_debian_theme ###
set menu_color_normal=white/black
set menu_color_highlight=black/light-gray
### END /etc/grub.d/05_debian_theme ###

### BEGIN /etc/grub.d/10_linux ###
menuentry ‘Ubuntu, with Linux 2.6.32-21-generic‘ --class ubuntu --class gnu-linux --class gnu --class os {
 recordfail
 insmod ext2
 set root=‘(hd0,1)‘
 search --no-floppy --fs-uuid --set 2e78226c-16d3-4da2-a35a-77e2146d6427
 linux /boot/vmlinuz-2.6.32-21-generic root=UUID=2e78226c-16d3-4da2-a35a-77e2146d6427 ro   quiet splash
 initrd /boot/initrd.img-2.6.32-21-generic
}
menuentry ‘Ubuntu, with Linux 2.6.32-21-generic (recovery mode)‘ --class ubuntu --class gnu-linux --class gnu --class os {
 recordfail
 insmod ext2
 set root=‘(hd0,1)‘
 search --no-floppy --fs-uuid --set 2e78226c-16d3-4da2-a35a-77e2146d6427
 echo ‘Loading Linux 2.6.32-21-generic ...‘
 linux /boot/vmlinuz-2.6.32-21-generic root=UUID=2e78226c-16d3-4da2-a35a-77e2146d6427 ro single
 echo ‘Loading initial ramdisk ...‘
 initrd /boot/initrd.img-2.6.32-21-generic
}
### END /etc/grub.d/10_linux ###

### BEGIN /etc/grub.d/20_memtest86+ ###
menuentry "Memory test (memtest86+)" {
 insmod ext2
 set root=‘(hd0,1)‘
 search --no-floppy --fs-uuid --set 2e78226c-16d3-4da2-a35a-77e2146d6427
 linux16 /boot/memtest86+.bin
}
menuentry "Memory test (memtest86+, serial console 115200)" {
 insmod ext2
 set root=‘(hd0,1)‘
 search --no-floppy --fs-uuid --set 2e78226c-16d3-4da2-a35a-77e2146d6427
 linux16 /boot/memtest86+.bin console=ttyS0,115200n8
}
### END /etc/grub.d/20_memtest86+ ###

### BEGIN /etc/grub.d/30_os-prober ###
if [ ${timeout} != -1 ]; then
  if keystatus; then
    if keystatus --shift; then
      set timeout=-1
    else
      set timeout=0
    fi
  else
    if sleep --interruptible 3 ; then
      set timeout=0
    fi
  fi
fi
### END /etc/grub.d/30_os-prober ###

### BEGIN /etc/grub.d/40_custom ###
# This file provides an easy way to add custom menu entries.  Simply type the
# menu entries you want to add after this comment.  Be careful not to change
# the ‘exec tail‘ line above.
### END /etc/grub.d/40_custom ###

grub.cfg

修改两处:

修改1处,添加新的启动项,我的新启动项是:

menuentry ‘Ubuntu, with Linux 2.6.34.11-generic‘ --class ubuntu --class gnu-linux --class gnu --class os {
recordfail
insmod ext2
set root=‘(hd0,1)‘
search --no-floppy --fs-uuid --set 2e78226c-16d3-4da2-a35a-77e2146d6427
linux /boot/vmlinuz-2.6.34.11 root=UUID=2e78226c-16d3-4da2-a35a-77e2146d6427 ro quiet splash
initrd /boot/initrd-linux2.6.34.11.img
}

我将该启动项添加到了menuentry ‘Ubuntu, with Linux 2.6.32-21-generic‘ 启动项后面。注意,UUID,要和前面的已有菜单启动项保持一致。

上面粗体字,linux 后面指明了新内核映像文件的路径,initrd后面指明了ramdisk映像文件的路径。这些文件自己在/boot/下是可以找到的。

修改2处:将默认的启动菜单改为升级后的linux内核菜单。

从grub.cfg中的### BEGIN /etc/grub.d/10_linux ###这一行开始往下,第一个munuentry的菜单号是0,第二个menuentry的菜单号是1,依次往下类推,确定linux升级内核的菜单号。找到grub.cfg 中的set default="0"这一句。其中的default值设为自己的linux升级内核的菜单号。它表示系统默认的启动菜单。

ok,最后一句

# reboot

备注:由于此次试验要求在ubuntu启动时加入个人信息的显示 故在生成内核镜像文件前修改main.c文件

#sudo gedit /home/newkernel/内核文件夹/init/main.c

在其中合适位置加入以下代码

printk(KERN_EMERG"Welcome ChenHao");//KERN_EMERG表示其级别
时间: 2024-11-10 13:20:00

ubuntu内核升级的相关文章

将Ubuntu 10.04自带2.6.32内核升级成3.0内核图文教程

1.完成如下实践工作,并截屏说明实践步骤:1)下载安装虚拟机VMWare Workstation:2)在虚拟机中安装Linux2.x :3)通过自行编译,将Linux 2.x内核升级到Linux 3.x. 1)     安装VMware Workstation 11.1.0. 2)     在虚拟机中安装Ubuntu 10.04 LTS (ubuntu-10.04-desktop-i386.iso),其Linux内核版本为2.6.32. 3)     从kernel.org下载新版3.0.0内核

linux 内核升级2 转

linux内核升级 一.Linux内核概览 Linux是一个一体化内核(monolithic kernel)系统. 设备驱动程序可以完全访问硬件. Linux内的设备驱动程序可以方便地以模块化(modularize)的形式设置,并在系统运行期间可直接装载或卸载. 1. linux内核 linux操作系统是一个用来和硬件打交道并为用户程序提供一个有限服务集的低级支撑软件. 一个计算机系统是一个硬件和软件的共生体,它们互相依赖,不可分割. 计算机的硬件,含有外围设备.处理器.内存.硬盘和其他的电子设

内核升级2.6.11-3.0.2

-------------------------------------------------------- http://blog.chinaunix.net/uid-26000296-id-4208526.html linux内核升级图文攻略 2014-04-14 12:05:44 一.Linux内核概览Linux是一个一体化内核(monolithic kernel)系统.设备驱动程序可以完全访问硬件.Linux内的设备驱动程序可以方便地以模块化(modularize)的形式设置,并在系

Ubuntu下升级VisualBox后无法启动 Kernel driver not installed (rc=-1908)

Ubuntu下升级VisualBox后无法启动 Kernel driver not installed (rc=-1908) VisualBox之所以在Linux上比传统的VMware快得多,关键一点就是它和Linux内核的结合比较紧密,这也是开源的优点. 不过Linux内核更新很频繁,每次更新内核后启动VirtualBox都会提示: VirtualBox kernel driver not installed. The vboxdrv kernel module was either not

docker (linux 内核升级)

docker 目前一般是部署在linux7以上系统.其要求linux系统内核在3.8或更高的版本.查看版本命令:uname -a 当一般linux系统是7以下,其内核版本都是2点几. uname -r 2.6.32-358.11.1.el6.x86_64 内核升级: 1.导入public key rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org 1.2下载源码包 去 http://www.kernel.org 首页,下载源码包

Linux:centos内核升级

centos内核升级 centos升级2.6内核到3.10 在yum的ELRepo源中,有 m ain l ine(3.13.1). l ong- t erm(3.10.28)这2个内核版本,long-time为长期支持. 查看看当前内核版本 uname -r 安装elrepo(http://elrepo.org/tiki/tiki-index.php) 导入public key rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org

Centos5.5内核升级

当前版本linux-2.6.18-194.el5PAE目标版本linux-2.6.35.9内核升级步骤: 1.查看当前内核版本 uname –a¥ Linux localhost.localdomain 2.6.18-194.el5PAE $1 SMP Fri Apr 2 15:37:44 EDT 2010 i686 i686 i386 GNU/Linux当前内核版本为2.6.18-194.el5PAE2.确认内核版本为非目标版本,下载新内核源码.下载地址:http://www.kernel.o

从Linux内核升级的必要性说开去

Linux内核更新超级频繁,但是有必要时刻升级吗?个人感觉没有必要,但是你要时刻关注新特性列表,然后把自己的内核升级到离最新版本差一两个月发布的版本而不是最新版本,以保证稳定性,因为一两个月的时间足够多的慧眼会发现足够多的问题,既然自己不是Alan Cox那个梯队的大牛,最好不要在自己的生产版本上使用最新内核,当然,做试验或者Just play例外.       为什么要升级内核?是的,很多人并不同意这种观点,可能他们认为使用内核提供的最持久最稳定的接口就已经足够,多数的定制特性需要自己在用户空

linux 内核升级 转

inux 内核升级 2011-03-25 23:13:28 分类: LINUX 因要测试一些软件,需要2.6.30以上的内核,安装好CentOS 5.5,内核是2.6.18-194.el5.这次的升级还算比较顺利,具体的过程如下: [[email protected] ~]# uname -r 2.6.18-194.el5 1.下载linux-2.6.30内核包到/usr/src目录 cd /usr/src wget ftp://ftp.kernel.org/pub/linux/kernel/v