参考:

《鸟哥的Linux私房菜》第26章

http://hi.baidu.com/wg_wang/item/f9375c2f00ca75c0ee10f1db

http://www.linuxdiyf.com/bbs/thread-193762-1-1.html

环境:

Wind7主机+Debian6虚拟机,虚拟机软件是VirtualBox

第一步、下载Linux源码

首先需要看一下当前Linux使用的版本

pengdl@debian:~$ uname -r

2.6.32-5-686

可以看到,当前使用的Linux内核版本是:2.6.32.5

为了说明问题,我们也从网上下载linux-2.6.32.5(当然也可以下载最新的版本,但是有风险)。下载地址如下:

ftp://ftp.kernel.org/pub/linux/kernel/v2.6/

我下载的是:linux-2.6.32.5.tar.xz

第二步、解压Linux内核

将来把内核源码解压到/usr/src/kernels下

mkdir -p /usr/src/kernels

 

tar -xJf linux-2.6.32.5.tar.xz -C /usr/src/kernels/

第三步、编译Linux内核

清理垃圾:

cd /usr/src/kernels/linux-2.6.32.5

make mrproper

make clean

编译内核前需要配置,为了说明问题,直接将本机自带的配置config-2.6.32-5-686拷贝到刚才解压的目录下(如果下载了比较新的内核,就需对照着config-2.6.32-5-686自己配置了),并重命名为.config

cp     /boot/config-2.6.32-5-686     /usr/src/kernels/linux-2.6.32.5/.config

cd   /usr/src/kernels/linux-2.6.32.5

make menucongfig

修改General setup内的Local version为pengdl,目的是防止执行make install和make modules_install的时候跟旧的发生冲突。

make bzImage  -j4

make modules  -j4

make modules_install

make install

制作initrd镜像

mkinitramfs     2.6.32.5pengdl   -o    /boot/initrd.img-2.6.32.5pengdl

其中2.6.32.5pengdl 就是执行完make modules_install后,在/lib/modules下新生成的文件夹

此时/lib/modules和/boot下的内容如下(其中带有686的是系统原先就有的,带pengdl的是我们新生成的,

其中之所以有以.old结尾的文件,是因为执行了两次make install,实际上执行一次就行了。手动将*.old删除):

debian:/usr/src/kernels/linux-2.6.32.5# ls /lib/modules/

2.6.32-5-686  2.6.32.5pengdl

debian:/usr/src/kernels/linux-2.6.32.5# ls /boot/

config-2.6.32-5-686        System.map-2.6.32-5-686

config-2.6.32.5pengdl      System.map-2.6.32.5pengdl

config-2.6.32.5pengdl.old  System.map-2.6.32.5pengdl.old

grub                       vmlinuz-2.6.32-5-686

initrd.img-2.6.32-5-686    vmlinuz-2.6.32.5pengdl

initrd.img-2.6.32.5pengdl  vmlinuz-2.6.32.5pengdl.old

debian:/usr/src/kernels/linux-2.6.32.5# 

第四步、更新grub

grub-mkconfig >/boot/grub/grub.cfg

可以看看新生成的grub.cfg的内容:

#

# DO NOT EDIT THIS FILE

#

# It is automatically generated by 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="2"

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 load_video {

  insmod vbe

  insmod vga

  insmod video_bochs

  insmod video_cirrus

}

 

insmod part_msdos

insmod ext2

set root='(hd1,msdos5)'

search --no-floppy --fs-uuid --set 87115ddc-75d2-4f74-b8c4-e3796e6a244a

if loadfont /share/grub/unicode.pf2 ; then

  set gfxmode=640x480

  load_video

  insmod gfxterm

fi

terminal_output gfxterm

insmod part_msdos

insmod ext2

set root='(hd0,msdos1)'

search --no-floppy --fs-uuid --set 2c7658ba-7c5c-45f2-8117-d70fcadcdda6

set locale_dir=($root)/boot/grub/locale

set lang=en

insmod gettext

set timeout=5

### END /etc/grub.d/00_header ###

 

### BEGIN /etc/grub.d/05_debian_theme ###

insmod part_msdos

insmod ext2

set root='(hd1,msdos5)'

search --no-floppy --fs-uuid --set 87115ddc-75d2-4f74-b8c4-e3796e6a244a

insmod png

if background_image /share/images/desktop-base/spacefun-grub.png; then

  set color_normal=light-gray/black

  set color_highlight=white/black

else

  set menu_color_normal=cyan/blue

  set menu_color_highlight=white/blue

fi

### END /etc/grub.d/05_debian_theme ###

 

### BEGIN /etc/grub.d/10_linux ###

menuentry 'Debian GNU/Linux, with Linux 2.6.32.5pengdl' --class debian --class gnu-linux --class gnu --class os {

    insmod part_msdos

    insmod ext2

    set root='(hd0,msdos1)'

    search --no-floppy --fs-uuid --set 2c7658ba-7c5c-45f2-8117-d70fcadcdda6

    echo    'Loading Linux 2.6.32.5pengdl ...'

    linux    /boot/vmlinuz-2.6.32.5pengdl root=UUID=2c7658ba-7c5c-45f2-8117-d70fcadcdda6 ro  quiet

    echo    'Loading initial ramdisk ...'

    initrd    /boot/initrd.img-2.6.32.5pengdl

}

menuentry 'Debian GNU/Linux, with Linux 2.6.32.5pengdl (recovery mode)' --class debian --class gnu-linux --class gnu --class os {

    insmod part_msdos

    insmod ext2

    set root='(hd0,msdos1)'

    search --no-floppy --fs-uuid --set 2c7658ba-7c5c-45f2-8117-d70fcadcdda6

    echo    'Loading Linux 2.6.32.5pengdl ...'

    linux    /boot/vmlinuz-2.6.32.5pengdl root=UUID=2c7658ba-7c5c-45f2-8117-d70fcadcdda6 ro single 

    echo    'Loading initial ramdisk ...'

    initrd    /boot/initrd.img-2.6.32.5pengdl

}

menuentry 'Debian GNU/Linux, with Linux 2.6.32-5-686' --class debian --class gnu-linux --class gnu --class os {

    insmod part_msdos

    insmod ext2

    set root='(hd0,msdos1)'

    search --no-floppy --fs-uuid --set 2c7658ba-7c5c-45f2-8117-d70fcadcdda6

    echo    'Loading Linux 2.6.32-5-686 ...'

    linux    /boot/vmlinuz-2.6.32-5-686 root=UUID=2c7658ba-7c5c-45f2-8117-d70fcadcdda6 ro  quiet

    echo    'Loading initial ramdisk ...'

    initrd    /boot/initrd.img-2.6.32-5-686

}

menuentry 'Debian GNU/Linux, with Linux 2.6.32-5-686 (recovery mode)' --class debian --class gnu-linux --class gnu --class os {

    insmod part_msdos

    insmod ext2

    set root='(hd0,msdos1)'

    search --no-floppy --fs-uuid --set 2c7658ba-7c5c-45f2-8117-d70fcadcdda6

    echo    'Loading Linux 2.6.32-5-686 ...'

    linux    /boot/vmlinuz-2.6.32-5-686 root=UUID=2c7658ba-7c5c-45f2-8117-d70fcadcdda6 ro single 

    echo    'Loading initial ramdisk ...'

    initrd    /boot/initrd.img-2.6.32-5-686

}

### END /etc/grub.d/10_linux ###

 

### BEGIN /etc/grub.d/20_linux_xen ###

### END /etc/grub.d/20_linux_xen ###

 

### BEGIN /etc/grub.d/30_os-prober ###

### 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 ###

 

### BEGIN /etc/grub.d/41_custom ###

if [ -f  $prefix/custom.cfg ]; then

  source $prefix/custom.cfg;

fi

### END /etc/grub.d/41_custom ###

其中已经有了我们新添加的内核了:

### BEGIN /etc/grub.d/10_linux ###

Found linux image: /boot/vmlinuz-2.6.32.5pengdl

Found initrd image: /boot/initrd.img-2.6.32.5pengdl

menuentry 'Debian GNU/Linux, with Linux 2.6.32.5pengdl' --class debian --class gnu-linux --class gnu --class os {

    insmod part_msdos

    insmod ext2

    set root='(hd0,msdos1)'

    search --no-floppy --fs-uuid --set 2c7658ba-7c5c-45f2-8117-d70fcadcdda6

    echo    'Loading Linux 2.6.32.5pengdl ...'

    linux    /boot/vmlinuz-2.6.32.5pengdl root=UUID=2c7658ba-7c5c-45f2-8117-d70fcadcdda6 ro  quiet

    echo    'Loading initial ramdisk ...'

    initrd    /boot/initrd.img-2.6.32.5pengdl

}

menuentry 'Debian GNU/Linux, with Linux 2.6.32.5pengdl (recovery mode)' --class debian --class gnu-linux --class gnu --class os {

    insmod part_msdos

    insmod ext2

    set root='(hd0,msdos1)'

    search --no-floppy --fs-uuid --set 2c7658ba-7c5c-45f2-8117-d70fcadcdda6

    echo    'Loading Linux 2.6.32.5pengdl ...'

    linux    /boot/vmlinuz-2.6.32.5pengdl root=UUID=2c7658ba-7c5c-45f2-8117-d70fcadcdda6 ro single 

    echo    'Loading initial ramdisk ...'

    initrd    /boot/initrd.img-2.6.32.5pengdl

}

menuentry 'Debian GNU/Linux, with Linux 2.6.32-5-686' --class debian --class gnu-linux --class gnu --class os {

    insmod part_msdos

    insmod ext2

    set root='(hd0,msdos1)'

    search --no-floppy --fs-uuid --set 2c7658ba-7c5c-45f2-8117-d70fcadcdda6

    echo    'Loading Linux 2.6.32-5-686 ...'

    linux    /boot/vmlinuz-2.6.32-5-686 root=UUID=2c7658ba-7c5c-45f2-8117-d70fcadcdda6 ro  quiet

    echo    'Loading initial ramdisk ...'

    initrd    /boot/initrd.img-2.6.32-5-686

}

menuentry 'Debian GNU/Linux, with Linux 2.6.32-5-686 (recovery mode)' --class debian --class gnu-linux --class gnu --class os {

    insmod part_msdos

    insmod ext2

    set root='(hd0,msdos1)'

    search --no-floppy --fs-uuid --set 2c7658ba-7c5c-45f2-8117-d70fcadcdda6

    echo    'Loading Linux 2.6.32-5-686 ...'

    linux    /boot/vmlinuz-2.6.32-5-686 root=UUID=2c7658ba-7c5c-45f2-8117-d70fcadcdda6 ro single 

    echo    'Loading initial ramdisk ...'

    initrd    /boot/initrd.img-2.6.32-5-686

}

### END /etc/grub.d/10_linux ###

如果按照上面的配置,启动时,Linux 2.6.32.5pengdl 会放在第一个,如果不手动按上下键进行选择,那么启动的将是我们刚编译出来的内核,如何让系统默认启动旧的内核呢?这里有几种方法:

1、手动修改grub.conf,交换旧内核和新内核的位置:

### BEGIN /etc/grub.d/10_linux ###

menuentry 'Debian GNU/Linux, with Linux 2.6.32-5-686' --class debian --class gnu-linux --class gnu --class os {

    insmod part_msdos

    insmod ext2

    set root='(hd0,msdos1)'

    search --no-floppy --fs-uuid --set 2c7658ba-7c5c-45f2-8117-d70fcadcdda6

    echo    'Loading Linux 2.6.32-5-686 ...'

    linux    /boot/vmlinuz-2.6.32-5-686 root=UUID=2c7658ba-7c5c-45f2-8117-d70fcadcdda6 ro  quiet

    echo    'Loading initial ramdisk ...'

    initrd    /boot/initrd.img-2.6.32-5-686

}

menuentry 'Debian GNU/Linux, with Linux 2.6.32-5-686 (recovery mode)' --class debian --class gnu-linux --class gnu --class os {

    insmod part_msdos

    insmod ext2

    set root='(hd0,msdos1)'

    search --no-floppy --fs-uuid --set 2c7658ba-7c5c-45f2-8117-d70fcadcdda6

    echo    'Loading Linux 2.6.32-5-686 ...'

    linux    /boot/vmlinuz-2.6.32-5-686 root=UUID=2c7658ba-7c5c-45f2-8117-d70fcadcdda6 ro single 

    echo    'Loading initial ramdisk ...'

    initrd    /boot/initrd.img-2.6.32-5-686

}

 

menuentry 'Debian GNU/Linux, with Linux 2.6.32.5pengdl' --class debian --class gnu-linux --class gnu --class os {

    insmod part_msdos

    insmod ext2

    set root='(hd0,msdos1)'

    search --no-floppy --fs-uuid --set 2c7658ba-7c5c-45f2-8117-d70fcadcdda6

    echo    'Loading Linux 2.6.32.5pengdl ...'

    linux    /boot/vmlinuz-2.6.32.5pengdl root=UUID=2c7658ba-7c5c-45f2-8117-d70fcadcdda6 ro  quiet

    echo    'Loading initial ramdisk ...'

    initrd    /boot/initrd.img-2.6.32.5pengdl

}

menuentry 'Debian GNU/Linux, with Linux 2.6.32.5pengdl (recovery mode)' --class debian --class gnu-linux --class gnu --class os {

    insmod part_msdos

    insmod ext2

    set root='(hd0,msdos1)'

    search --no-floppy --fs-uuid --set 2c7658ba-7c5c-45f2-8117-d70fcadcdda6

    echo    'Loading Linux 2.6.32.5pengdl ...'

    linux    /boot/vmlinuz-2.6.32.5pengdl root=UUID=2c7658ba-7c5c-45f2-8117-d70fcadcdda6 ro single 

    echo    'Loading initial ramdisk ...'

    initrd    /boot/initrd.img-2.6.32.5pengdl

}

### END /etc/grub.d/10_linux ###

2、或者,修改 set default="0"  ,将0改为2。直接在这里改,如果再更新grub.conf,default的值又变为了0,其中在grub.conf的最上面给出了方法:

#

# DO NOT EDIT THIS FILE

#

# It is automatically generated by grub-mkconfig using templates

# from /etc/grub.d and settings from /etc/default/grub

#

我们应该修改/etc/default/grub这个文件,将GRUB_DEFAULT=0 改为GRUB_DEFAULT=2,然后重新执行

grub-mkconfig >/boot/grub/grub.cfg

下面是启动测试:(可以用上下箭头选择有启动的内核)

注意:

因为我是用的是VirtualBox虚拟机,更新完内核后,需要重新安装VirtualBox增强工具,增强工具的安装方法参见:

http://www.cnblogs.com/pengdonglin137/p/3366765.html#a8

安装增强工具的时候,会把上次安装的增强工具给删掉。

完!!

编译Debian内核源码的更多相关文章

  1. Android系统篇之—-编写简单的驱动程序并且将其编译到内核源码中【转】

    本文转载自:大神 通过之前的一篇文章,我们了解了 Android中的Binder机制和远程服务调用 在这篇文章中主要介绍了Android中的应用在调用一些系统服务的时候的原理,那么接下来就继续来介绍一 ...

  2. 如何单独编译Linux内核源码中的驱动为可加载模块?

    答: 分为两步: 1. 配置某个驱动为模块(如: CONFIG_RTC_XXX=m) 2. 指定路径并编译, 如编译drivers/rtc中的驱动 make SUBDIRS=drivers/rtc m ...

  3. 【转】编译Android系统源码和内核源码

    原文网址:http://blog.csdn.net/jiangwei0910410003/article/details/37988637 好长时间没有写blog了,之所以没有写,主要还是工作上的事, ...

  4. FW 编译Android系统源码和内核源码

    编译Android系统源码和内核源码 分类: Android2014-07-21 20:58 7287人阅读 评论(28) 收藏 举报 好长时间没有写blog了,之所以没有写,主要还是工作上的事,发现 ...

  5. Android源码和内核源码的下载,编译和执行

    笔者依据罗升阳老师的<Android 系统源码情景分析>一书,尝试下载,编译和执行Android源码和内核源码.但可能是软件源"被墙"或版本号更新的原因.期间遇到诸多问 ...

  6. 编译Android系统源码和内核源码

    [日期:2016-01-11] 来源:Linux社区  作者:jiangwei [字体:大 中 小]     把我之前编译Android系统源码和内核源码的过程记录一下,因为这个过程真的是受益匪浅,看 ...

  7. 转载 :Linux有问必答:如何在Debian或Ubuntu上安装完整的内核源码

    http://linux.cn/article-5015-1.html 问题:我需要为我的Debian或Ubuntu下载并安装完整树结构的内核源码以供编译一个定制的内核.那么在Debian或Ubunt ...

  8. 【转】如何下载并编译Android4.0内核源码goldfish(图文)

    原文网址:http://blog.csdn.net/flydream0/article/details/7070392 关于如何下载Android4.0源码,请查看我的博客内另一篇文章(同样是图文教程 ...

  9. Linux内核分析(一)---linux体系简介|内核源码简介|内核配置编译安装

    原文:Linux内核分析(一)---linux体系简介|内核源码简介|内核配置编译安装 Linux内核分析(一) 从本篇博文开始我将对linux内核进行学习和分析,整个过程必将十分艰辛,但我会坚持到底 ...

随机推荐

  1. cocos2d-html5在cocos2d-x里面打包编译

    main.cpp打开USE_WIN32_CONSOLE输出 #include "main.h" #include "AppDelegate.h" #includ ...

  2. systemd详解

    CentOS 7 使用systemd替换了SysV.Systemd目的是要取代Unix时代以来一直在使用的init系统,兼容SysV和LSB的启动脚本,而且够在进程启动过程中更有效地引导加载服务. s ...

  3. Linux下的paste合并命令详解

    paste单词意思是粘贴.该命令主要用来将多个文件的内容合并,与cut命令完成的功能刚好相反. 粘贴两个不同来源的数据时,首先需将其分类,并确保两个文件行数相同.paste将按行将不同文件行信息放在一 ...

  4. Ubuntu 14.04 LTS中怎样解决系统设置残缺的问题

    iBus卸载之后,系统设置会缺失,是Ubuntu 14.04和iBus之间的关系引起的,但是如果直接安装 sudo apt-get install ubuntu-desktop 这个会把amazon广 ...

  5. python sleep

    Python Sleep休眠函数 Python 编程中使用 time 模块可以让程序休眠,具体方法是time.sleep(秒数),其中"秒数"以秒为单位,可以是小数,0.1秒则代表 ...

  6. 用DependanceProperty做Dynamic换Icon

    1:做Icon用Canvas还是DrawingBrush? Canvas的例子:

  7. 为什么要尽量少使用iframe

    Iframes 阻塞页面加载 及时触发 window 的 onload 事件是非常重要的.onload 事件触发使浏览器的 “忙” 指示器停止,告诉用户当前网页已经加载完毕.当 onload 事件加载 ...

  8. 解决Unable to connect to a repository at URL 禁止访问 (forbidden)

    连接SVN报如下错误. Unable to connect to a repository at URL 禁止访问 (forbidden) 1.         右键点击本地副本,TortoiseSV ...

  9. System.Data.SQLite数据库简介

    SQLite介绍 在介绍System.Data.SQLite之前需要介绍一下SQLite,SQLite是一个类似于Access的单机版数据库管理系统,它将所有数据库的定义(包括定义.表.索引和数据本身 ...

  10. JDBC-ODBC桥乱码问题解决方案

    按照网上提供的ODBC连接数据库的相关资料编写代码,成功编译后运行发现,非中文字段显示正确,而中文字段却是每个汉字以?显示.关于这方面的错误baidu或google下可以找到很多解答方案,我也尝试过其 ...