Ubuntu10.10下编译Linux2.6.36内核

转自http://bbs.chinaunix.net/thread-1919836-1-1.html

因为是新手接触linux,还是想从基础一点一点做起,于是从编译linux内核开始。


0.准备工作
        编译内核时,所有的输出文件默认与原内核文件存放在一起,为了避免编译过程出错而引起不必要的启动错误,建议在编译时新建一个目录,与原始内核文件的目录分开。
系统原始内核文件目录:/usr/src/linux_2.6.N(N为系统的原始版本号)
建立新路经:/home/build/kernel(此为笔者建立的目录,读者可自行创建其他目录)
        到官网上下载新版本的内核源码,我下载的是 www.kernel.org官网下最新版本linux-2.6.36.tar.bz2内核。默认将其存放在/home/build/目录下

        建立路径        ~$  sudo  mkdir  /home/build
                          ~$  sudo  mkdir  /home/build/kernel
        复制源码 ~$  sudo  cp /.…/linux-2.6.36.tar.bz2   /home/build

        打开一个终端,获取root权限:  sudo su  (新手不建议使用,为防止一些误操作引起系统的故障。如若不做,一下每一步操作需要获取root权限时,在命令前加sudo。因为本文面向和我一样的新手,所以默认不进行此操作)。

1.源码解压缩
        进入到/home/build/目录下,对已下载源码解压缩:

        ~$  sudo  tar  xvjf  linux-2.6.36.tar.bz2

        解压缩完成后会在本目录下生成一个linux-2.6.36的文件夹。进入到该文件夹,以下的操作进本上都要在该目录下进行。

        ~$  cd  /linux-2.6.36/

2.清除可能残留的配置或对象文件
        对于第一次编译,这一步是不必要的。但如果此前曾在该目录下进行配置修改或编译,则这一步是必需的。无论如何,即使不必要时执行一次也是没有害处的。网上对于是否要紧行这一步众说纷纭,在内核自带的README文件的解释:“Make sure you have no stale .o files and dependencies lying around”。
       
        ~$  sudo  make  O=/home/build/kernel  mrproper

        选项”O=Output/dir”允许用户指定一个输出文件的存放路径,之前所做的准备工作派上了用场。对于该选项的应用应注意,一旦”O=Output/dir”选项被使用,那么在今后所有的make调用中都要指定该选项。O为大写。
       
3.内核配置
        这一步是极其重要的。在编译之前,要对内核进行配置和定制。你可已把自己需要的功能和驱动程序编译进内核。由于内核提供了数不胜数的功能,支持了难以计数的硬件,因而有许多东西需要配置。内核提供了多种不同的工具来简化内核的配置。
        make config                 基于文本的命令行工具
        make menuconfig        基于ncurse库的图形界面工具(要保证已经安装该库)
        make xconfig                基于X11的图形工具
        … …

        因为本文着重描述编译内核的步骤,关于内核的配置就不介绍了。本文使用:

        ~$  make  O=/home/build/kernel  localmodconfig

        该命令为你的电脑创建一个与当前系统配置相同的的配置。命令执行,会出现一些选项,这些选项会添加一些模块和驱动,根据需要添加。具体的用法自己上网上找一下,有很多介绍的。此命令执行完成后,/home/build/kernel/目录下不再为空,生成了makefile文件等一些配置文件项。

        有不少资料提到命令:make defconfig,说会创建一个默认的配置,但是我最初编译内核的时候总是出错,没办法引导,黑白屏显示错误信息:
        drm/i915 can't work without intel_agp module
        mount:mounting none on /dev         failed : no such device
        could not mount the platform /dev/sda1
        … ...

        网上找了许多有关错误的说明以及解决办法,但是相关的不是很多,能解决问题的几乎没有。于是自己仔细分析了下原因,根据错误信息,应该是缺少相关模块,没办法发现驱动和设备。于是仔细跟踪每一步编译过程,观察系统产生的变化,增加了哪些文件,修改了哪些文件信息。每次编译后,发现/lib/modules/2.6.36/kernel/driver目录下只有很少的几个驱动文件夹,而原系统的相关目录/lib/modules/2.6.35-generic/kernel/driver下有数十个文件夹。再进一步,发现实际是每次在编译模块的时候make modules 后终端只显示编译了3个module,也就是说编译的驱动模块太少了。最后,追根溯源,我觉得是内核配置出了问题,被选择添加进内核的功能模块太少了。但是又不想过于繁重地选择内核的各个模块,在网上搜了一下,找到了 make localmodconfig命令以及简单用法。
        也就是说我在用make defconfig 的时候出了问题,并没有选择足够的模块,但是README以及网上的说法都是说make defconfig是可以的,我也不太清楚究竟问题出在哪,又不想一个一个地选择各个模块,因为毕竟不太清楚那些模块的具体作用,所以采用了make localmodconfig的方法简单地定制模块。如果有哪位高手了解情况,请帮忙解答哈。

4.清除不必要的文件
        清除一些不必要的文件,这些文件可能会导致某些编译错误。该步骤是可选的,一般不执行也不会有什么问题。

        ~$  make  O=/home/build/kernel  clean

5.正式编译内核
        执行如下命令:

        ~$  make  O=/home/build/kernel

        该命令执行的是编译的过程,会用掉一定时间,随不同的内核配置以及不同的PC机配置时间会不同,我的大概在20分钟左右。命令执行结束后,在本文件夹下即:/home/build/kernel/下生成压缩了内核映像:arch/i386/boot/bzImage。

6.编译安装模块
        ~$  make  O=/home/build/kernel  modules
        ~$  make  O=/home/build/kernel  modules_install

       
       命令执行时,终端显示编译以及安装的模块数。命令执行结束后,在/lib/modules/目录下生成了一个已内核版本号为名的文件夹,因为我编译的是2.6.36,所以生成了2.6.36文件夹。观察了/lib/modules/2.6.36/kernel/driver目录下,已经有很多文件夹,说明安装了配置时定制的模块。

7.安装内核
    ~$  make O=/home/build/kernel install

    命令执行结束后,在系统/boot目录下生成三个文件,config-2.6.36,vmlinuz-2.6.36,System.map-2.6.36。有关各文件的作用,参见 http://chinaestone.javaeye.com/blog/285243,该篇文章浅显明了地讲述了几个比较重要的文件的作用。

8.创建系统启动映像
    ~$  cd /boot
    ~$  mkinitramfs -o initrd.img-2.6.36 2.6.36


    命令执行结束后,在/boot目录下生成一个initrd.img-2.6.36的文件

9.修改grub.cfg文件:
        剩下的工作就是在系统启动界面添加启动选项。

        ~$  sudo gedit /boot/grub/grub.cfg

        打开文件,需要添加的信息只有如下部分,以下为我的系统文件内容,首先复制原有的代码部分。
        引号内部的部分为启动界面的显示文字,可以随意起名,但尽量要显示出版本信息,以免之后忘记了。将boot/下启动文件名称改为你创建的vmlinuz名称,映像改为你创建的映像名称,其余的不需要修改。recovery mode选项建议也要创建,便于恢复。将我修改前后的进行对比放在下面:

menuentry " Ubuntu, Linux 2.6.35-22-generic" {

        insmod part_msdos

        insmod ntfs

        set root='(hd0,msdos1)'

        search --no-floppy --fs-uuid --set 74a06b5ea06b2638

        loopback loop0 /ubuntu/disks/root.disk

        set root=(loop0)

        linux /boot/vmlinuz-2.6.35-22-generic root=/dev/sda1 loop=/ubuntu/disks/root.disk ro   quiet splash

        initrd /boot/initrd.img-2.6.35-22-generic

}


menuentry " Ubuntu, Linux 2.6.36 Steven.G Test" {

        insmod part_msdos

        insmod ntfs

        set root='(hd0,msdos1)'

        search --no-floppy --fs-uuid --set 74a06b5ea06b2638

        loopback loop0 /ubuntu/disks/root.disk

        set root=(loop0)

        linux /boot/vmlinuz-2.6.36 root=/dev/sda1 loop=/ubuntu/disks/root.disk ro   quiet splash

        initrd /boot/initrd.img-2.6.36
}


10.重启系统
        做到以上各步之后,可以宣告你已经成功编译并安装了新内核,重启系统吧,之后你会发现你所添加的启动项出现在启动菜单了。

        由于系统环境以及硬件各不相同,在编译过程中可能会出现不同的问题,不过在编译的过程中千万不要气馁,发现问题是好事,我们要抱着百折不挠精神,仔细分析出现的问题,多在网上查找相关资料,但是千万不要不加思考直接照搬,毕竟网络上的东西没有正确性级别的确认,还要考虑到自己的实际情况。
        由于是新手,这篇东西是我弄了整整三天终于尝试成功的结晶,希望对大家有所帮助。当然避免不了有各种错误和特殊性,但总体的流程是没有问题的,错误与疏漏望大家批评指出,我好即使修改,避免让更多的人犯错走弯路。
        最后说一下我的系统是32位x86PC机,在win7下采用wubi装的ubuntu10.10双系统,初始内核版本为2.6.35。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值