[转]如何在ubuntu下编译内核

原文作者:Falko Timme

  每一个发行版本都带有一些特殊的工具,用来从源代码中创建一个自定义的内核,这篇文章就是关于如何在ubuntu系统中编译内核的。内容包括,如何利用最新的,未被修改过的,从 www.kernel.org网站上下载下来的源代码来构建自订制系统,这样,你就能独立于发行版所提供的内核。文章同样涉及了如果你需要一些现有内核不包含的特性,如何对内核源代码进行修补等问题。

  我在Ubuntu 6.10 Server ("Edgy Eft")和Ubuntu 6.06 Desktop ("Dapper Drake") 上都对文中所述步骤进行了测试。但还需要事先申明的是,这并不是唯一能够构建系统的办法,事实上,有很多办法能够达到相同的目的,正所谓条条大路通罗马, 只不过我走的是这一条道路而已。所以,我不保证这种办法能完全适用于你。

  顺便再提醒一句,我喜欢直接以root的身份来执行下面所有的步骤,因此,如果你还没有创建一个能够登陆的root帐号,请立即创建一个。

  sudo passwd root

  之后,以root身份登陆:

  su

  如果有朋友就是喜欢用普通用户身份进行操作的话,也没有关系,你只需要注意,把这篇文章所有命令的全面都自行加上sudo即可。举个例子,如果我运行的是

  apt-get update

  那么你就应该运行

  sudo apt-get update

  如此重复即可。

  好,接下来进入操作的具体步骤。

  1.1 修改ubuntu 6.10上的/bin/sh

  在ubuntu6.10上,/bin/sh默认是链接到/bin/dash的,当你从源代码编译软件的时候,dash可能会导致一些错误,至少我遇到过类似问题,因此,我把/bin/sh的连接改为了/bin/bash。(估计中国绝大部分使用者都是用的bash吧)

  如果你使用的就是6.10,那么应该这样做:

  rm -f /bin/sh

  ln -s /bin/bash /bin/sh



  1.2 安装内核编译所需的包

  首先,让我们来更新一下自己机器上的安装包数据库

  apt-get update

  之后,用这条命令来安装所有需要的包:

  apt-get install kernel-package libncurses5-dev fakeroot wget bzip2



  1.3 下载内核源代码

  接下来,我们将需要的内核下载到/usr/src中。2.6版本的所有内核都可以从 http://www.kernel.org/pub/linux/kernel/v2.6/得到。我是这样下载的:

  cd /usr/src

  wget  http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.18.1.tar.bz2

  你也可以根据自己的需要,用不同的下载方式下载不用的内核版本。

  完毕之后,将源代码解包,并创建一个指向源代码软件目录的连接linux:

  tar xjf linux-2.6.18.1.tar.bz2

  ln -s linux-2.6.18.1 linux

  cd /usr/src/linux



  1.4 给内核源代码打补丁

  有时候,你需要一些硬件驱动,但是新的内核默认却没有提供,或者,你可能要用到虚拟技术或其他一些前沿科技,而新的内核中却没有加入它们。在这些情况下,你不得不对你的内核打补丁(当然,前提是存在相应的补丁)。

  现在,我假设你已经下载到了相对应的补丁,在这里我们以patch.bz2代替。将其放到/usr/src目录下,然后用下来的命令来使其生效:

  bzip2 -dc /usr/src/patch.bz2 | patch -p1 --dry-run

  bzip2 -dc /usr/src/patch.bz2 | patch -p1



  注意!此时,你应该一直处于/usr/src/linux目录下。

  第一个命令仅仅是试验性质的,它并不会对你的源代码产生什么变动。如果没有产生什么错误信息,你才能用第二个命令来对源代码产生真正的修补动作,如果第一条指令就出错了,请别继续执行下去,看看错误出在哪里。

  同样,你也可以向你的内核提供预补丁,例如,一旦你发现有一个自己需要的特性在2.6.19 rc4中提供,但这个版本的内核并没有发行所有的完整源 代码,只有patch-2.6.19-rc4.bz2是可选的。于是,你就可以提供这个patch到2.6.18的内核中,但不是2.6.8.1,或者 2.6.8.2。

http://kernel.org/patchtypes/pre.html对此作出了解释:

  预补丁其实就等同于一个linux的alpha版本,它存在于仓库中的测试目录中。它们只能由针对上一个版本源代码的patch工具提交,这个上一个 完全发行的版本必须是三部分版本号所组成的,例如,2.6.12-rc4 prepatch能够提供给2.6.11内核源代码,但,2.6.11.10没 有任何用处。

  所以,如果你希望编译2.6.19rc4内核,你应该下载2.6.18的内核源代码( http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.18.tar.bz2)。下面就是如何进行的步骤:

  cd /usr/src

  wget  http://www.kernel.org/pub/linux/kernel/v2.6/testing/patch-2.6.19-rc4.bz2

  cd /usr/src/linux

  bzip2 -dc /usr/src/patch-2.6.19-rc4.bz2 | patch -p1 --dry-run

  bzip2 -dc /usr/src/patch-2.6.19-rc4.bz2 | patch -p1



  2.1 配置内核

  使用现有内核的配置文件作为新内核配置文件的基础,无疑是一个好主意。因此,我们先复制已经存在的配置文件到/usr/src/linux目录中

  cp /boot/config-`uname -r` ./.config

  然后运行

  make menuconfig

  这将显示出内核配置菜单。选择 "Load an Alternate Configuration File",再选择你刚才拷贝过来的. config文件作为配置文件。然后确定。当结束后,你选择退出时,会提示问你  "Do you wish to save your new kernel configuration?"选择yes即可。



  2.2 创建内核

  如果要创建内核,请执行下面两个命令:

  make-kpkg clean

  fakeroot make-kpkg --initrd --append-to-version=-custom kernel_image kernel_headers 



  在 " --append-to-version= "之后,你可以写任何有助于标志内核的字符串,但前提是必须以-符号作为开头,中间不能有空白字符。

  好了,现在,请耐心点,内核的编译可能会花上你几个小时的时间,这取决于你的内核配置情况以及机器的性能。



  2.3 安装新的内核

  在内核构建成功之后,你能在/usr/src目录下看见两个.deb文件。在我的测试系统中,它们被称为linux-image-2.6.18.1- custom_2.6.18.1-custom-10.00.Custom_i386.deb (包含真实内核) and linux-headers- 2.6.18.1-custom_2.6.18.1-custom-10.00.Custom_i386.deb (包含那些编译附加内核模块所需要的文 件).

  我用这种办法安装:

  dpkg -i linux-image-2.6.18.1-custom_2.6.18.1-custom-10.00.Custom_i386.deb

  dpkg -i linux-headers-2.6.18.1-custom_2.6.18.1-custom-10.00.Custom_i386.deb

  你甚至可以将这两个deb包转移到其他的ubuntu系统中,并用相同的办法安装它们。这意味着,你不再需要再一次编译它们了。

  好了,现在,你可以检查一下你的menu.lst文件,多了两个与新内核有关的部分:



title     Ubuntu, kernel 2.6.18.1-custom

root       (hd0,0)

kernel     /boot/vmlinuz-2.6.18.1-custom root=/dev/sda1 ro quiet splash

initrd     /boot/initrd.img-2.6.18.1-custom

savedefault

boot



title     Ubuntu, kernel 2.6.18.1-custom (recovery mode)

root       (hd0,0)

kernel     /boot/vmlinuz-2.6.18.1-custom root=/dev/sda1 ro single

initrd     /boot/initrd.img-2.6.18.1-custom

boot 


  现在,重新启动计算机,shutdown -r。如果一切顺利的话,重新启动之后,你使用的就是新的内核了。你可以通过 " uname -r"命令来看看目前的内核版本。它应该表示为: " 2.6.18.1-custom"

  3 一些问题

  如果restart的时候出了问题,当你看见屏幕上出现 "Press ESC to enter the menu...1"这行字的时候,按下 ESC,此时会进入grub的启动菜单,好,选择你的旧版内核,启动系统。现在,你不得不重新编译一次内核,使其能够正常使用。编译之前别忘了,从 menu.lst中去除之前的两个不能正常工作的内核区域。 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值