华域联盟
登陆 / 注册 搜索

USERCENTER

SEARCHSITE

搜索

查看: 325|回复: 0

Fedora平台上怎样编译构建一个自定义内核

[复制链接]
发表于 2017-5-15 15:58:15 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册 新浪微博登陆

x

  版本: 1.0
  作者: Falko Timme ft [at]
  falkotimme [dot]
  com
  翻译: Ken Zhao  cn.zhaoke.com
  原文: http://www.howtoforge.com/kernel_compilation_Fedora
  中文: http://blog.zhaoke.com/5.html
  最后更新 11/10/2006
  中文最后更新 11/16/2006
  每一个Linux发行版都有自己特地的工具去构建自定义的内核. 本文主要引见在Fedora平台上编译内核, 如何从www.kernel.org(也叫vanilla kernel)取得最新且未改动的内核源代码来构建一个自定义的内核, 这样你能够运用自己的内核而不是发行版的内核, 另外也引见了如何给内核打补丁, 从而便当增加新的功用.
  下面的工作我都在Fedora Core 6上经过了测试.
  我想首先要说的是文章中构建自定义内核的方式不是独一的, 还有许多其它的方式, 这不过是我习气的方式. 我不能保证运用后不会呈现任何问题.
  1. 准备工作
  本文我将描画在Fedora平台上构建自定义内核的两种方式. 第一种是Fedora方式, 最后你将能取得一个内核rpm包, 从而能够便当地与他人分享. 第二种是传统方式, 适用于一切linux发行版, 不过最后你不会有一个rpm包.
  我引荐运用root用户做下面一切的步骤. 但是, 有时也需求运用非超级用户(比如用户tom)来运转一些命令, 所以你可能会运用visudo编辑器在/etc/sudoers文件中添加下面一行:
  tom ALL=(ALL) ALL
  往常无论什么时分你需求用root权限运转命令, 比如:
  yum install fedora-rpmdevtools unifdef
  你都能够用下面的命令来替代:
  sudo yum install fedora-rpmdevtools unifdef
  请记住: 假定以root用户身份运转一切命令, 你能够完好遗忘sudo. 采用什么方式, 看你自己的习气.

logo.gif



  2. 构建rpm内核包
  这一小节引见如何构建内核, 最终你能够得到一个rpm包, 这样能够便当装置或与他人分享.
  2.1 创建你的rpmbuild目录
  按下面创建你的rpmbuild目录:
  cd ~
  cp -a /usr/src/RedHat/ rpmbuild
  echo '%_topdir %(echo $HOME)/rpmbuild'  .rpmmacros
  然后装置构建rpm包需求的应用软件包
  yum install Fedora-rpmdevtools unifdef
  然后运转
  fedora-buildrpmtree
  2.2 下载和装置Fedora内核src.rpm包
  接下来为我们的Fedora版本下载最新的内核 src.rpm包. 针对Fedora Core 6, 你能够从接下来的网址取得src.rpm包: http://download.fedora.redhat.com/pub/fedora/linux/core/6/source/SRPMS/, 针对Fedora Core 5, 你能够从下面的网址取得src.rpm包: http://download.fedora.redhat.com/pub/fedora/linux/core/5/source/SRPMS/, 等等.
  最新的Fedora Core 6内核src.rpm包是kernel-2.6.18-1.2798.fc6.src.rpm, 所以我们往常下载和装置它:
  cd /usr/src
  wget http://download.fedora.redhat.com/pub/fedora/linux/core/6/source/SRPMS/kernel-2.6.18-1.2798.fc6.src.rpm
  rpm -ivh kernel-2.6.18-1.2798.fc6.src.rpm
  假定你看到这些正告:
  warning: user brewbuilder does not exist - using root
  warning: group brewbuilder does not exist - using root
  你能够疏忽它们.
  我们曾经胜利装置了最新的2.6.18.1内核源代码包. 假定我们继续构建内核源代码包的话, 我们的内核版本将是2.6.18.1.
  2.3 给内核打补丁
  我想装置新内核2.6.18.2来替代2.6.18.1. 系统曾经装置的src.rpm包是给2.6.18打过补丁的2.6.18.1. 而我们往常将运用打补丁的方式升级内核到2.6.18.2
  cd ~/rpmbuild/SOURCES/
  wget http://www.kernel.org/pub/linux/kernel/v2.6/patch-2.6.18.2.bz2
  假定你想内核的名字结尾为2.6.19-rc5, 你也能够运用prepatch包http://www.kernel.org/pub/linux/kernel/v2.6/testing/patch -2.6.19-rc5.bz2. 请留意这项工作仅对prepaches有效. 比如. 内核补丁仅对最终发行的内核版本有效, 比如2.6.19内核. 你能够给2.6.18内核源代码打补丁, 但不能是2.6.18.1或2.6.18.2, 等. 这个规则在接下来的网页中注明: http://kernel.org/patchtypes/pre.html
  prepatches同等于linux中的测试发行; 他们位于存档的测试目录中, 我们能够运用patch(1)工具对上一个完好发行版(版本号分三部分)打补丁(例如, 2.6.13-rc4 prepatch只能够给2.6.11内核源代码打补丁, 而不是2.6.11.10.)
  往常我们必需修正kernel-2.6.spec文件, 让它知道我们运用了新的内核补丁:
  cd ~/rpmbuild/SPECS/
  vi kernel-2.6.spec
  搜索下面行
  Patch1: patch-2.6.18.1.bz2
  交流为下面的内容:
  Patch1: patch-2.6.18.2.bz2
  (或者其它你已下载的版本)
  然后运转
  rpmbuild -bp kernel-2.6.spec
  (假定你想构建其它平台如i386, i586, i686或者x86_64的内核, 你能够经过运转下面的命令来完成:
  rpmbuild -bp --target=i686 kernel-2.6.spec
  我没有在上面例子中指定为i386, 你的系统可能是其它的平台类型, 请记得填写你的平台类型.)
  往常我们进入到关键的部分. src.rpm有很多fedora特地的补丁, 其中一些不能与我们的2.6.18.2补丁很好的工作, 所以假定你在rpmbuild输出看到下面状况:
  + echo 'Patch #300 (linux-2.6-ppc-dac960-ipr-clash.patch):'
  Patch #300 (linux-2.6-ppc-dac960-ipr-clash.patch):
  + patch -p1 -s
  Reversed (or previously applied) patch detected! Assume -R? [n]
  Apply anyway? [n]
  1 out of 1 hunk ignored -- saving rejects to file drivers/block/DAC960.c.rej
  error: Bad exit status from /var/tmp/rpm-tmp.46287 (%prep)
  RPM build errors:
  Bad exit status from /var/tmp/rpm-tmp.46287 (%prep)
  这时分你必需再次编辑kernel-2.6.spec文件, 注解掉patch #300一行:
  vi kernel-2.6.spec
  [...]
  #Patch300: linux-2.6-ppc-dac960-ipr-clash.patch
  [...]
  #%patch300 -p1
  [...]
  然后再运转rpmbuild命令, 比如:
  rpmbuild -bp kernel-2.6.spec
  留意: 你必需不时重复上面过程直到不呈现任何错误.

  2.4 指定内核辨认码
  往常我们将指定一个字符串便当以后区别内核版本. 因而我们需求做:
  cd ~/rpmbuild/BUILD/kernel-2.6.18/linux-2.6.18.i386
  vi Makefile
  在EXTRAVERSION一行, 你能够输入一个内核辨认码. 我想最好是在字符串后附上内核的版本号, 这样来操作:
  EXTRAVERSION = -custom-2.6.18.2
  2.5 配置内核
  往常我们运转
  make menuconfig
  然后我们看到内核的配置菜单. 移动绿色光标到 Load an Alternate Configuration File 行后选择.config文件做为配置文件:






  然后阅读内核配置菜单, 选择你需求的功用. 完成配置后, 选择Exit, 回答下面的问题(Do you wish to save your new kernel configuration? 你希望保管新的内核配置吗?), 选择Yes:



  2.6 构建内核
  往常我们简单运转下面命令来构建内核:
  make rpm
  然后你将在~/rpmbuild/SRPMS/目录发现一个新的src.rpm包, 比如. ~/rpmbuild/SRPMS/kernel-2.6.18custom2.6.18.2-1.src.rpm, 内核rpm包位于~/rpmbuild/RPMS/i386/ (或 ~/rpmbuild/RPMS/i586/, ~/rpmbuild/RPMS/i686/, 等. 看你的平台类型). 比如. ~/rpmbuild/RPMS/i386/kernel-2.6.18custom2.6.18.2-1.i386.rpm. 你看到内核辨认码已添加到软件包的名字中.

  2.7 装置新内核
  往常去新的rpm内核包存在的目录(基于你的平台类型, 比如. ~/rpmbuild/RPMS/i386/)装置rpm包:
  cd ~/rpmbuild/RPMS/i386
  rpm -ivh kernel-2.6.18custom2.6.18.2-1.i386.rpm
  (往常你致使能够拷贝到其它的Fedora系统, 经过上面的方式装置. 你将不再需求编译内核.)
  接下来我们为新内核创建一个ramdisk, 否则系统将不能引导新内核:
  mkinitrd /boot/initrd-2.6.18-custom-2.6.18.2.img 2.6.18-custom-2.6.18.2
  然后编辑/boot/grub/menu.lst文件, 看一下你系统上曾经存在(正在工作的)引导内核信息, 拷贝其中的一个实例, 交流为你新的内核和ramdisk:
  vi /boot/grub/menu.lst
  比如, 我的menu.lst, 在我添加新的内核信息前的状况:
  # grub.conf generated by anaconda
  #
  # Note that you do not have to rerun grub after making changes to this file
  # NOTICE: You have a /boot partition. This means that
  # all kernel and initrd paths are relative to /boot/, eg.
  # root (hd0,0)
  # kernel /vmlinuz-version ro root=/dev/VolGroup00/LogVol00
  # initrd /initrd-version.img
  #boot=/dev/sda
  default=0
  timeout=5
  splashimage=(hd0,0)/grub/splash.xpm.gz
  hiddenmenu
  title Fedora Core (2.6.18-1.2798.fc6)
  root (hd0,0)
  kernel /vmlinuz-2.6.18-1.2798.fc6 ro root=/dev/VolGroup00/LogVol00
  initrd /initrd-2.6.18-1.2798.fc6.img
  修正后的状况:
  # grub.conf generated by anaconda
  #
  # Note that you do not have to rerun grub after making changes to this file
  # NOTICE: You have a /boot partition. This means that
  # all kernel and initrd paths are relative to /boot/, eg.
  # root (hd0,0)
  # kernel /vmlinuz-version ro root=/dev/VolGroup00/LogVol00
  # initrd /initrd-version.img
  #boot=/dev/sda
  default=0
  timeout=5
  splashimage=(hd0,0)/grub/splash.xpm.gz
  hiddenmenu
  title Fedora Core (2.6.18-custom-2.6.18.2)
  root (hd0,0)
  kernel /vmlinuz-2.6.18-custom-2.6.18.2 ro root=/dev/VolGroup00/LogVol00
  initrd /initrd-2.6.18-custom-2.6.18.2.img
  title Fedora Core (2.6.18-1.2798.fc6)
  root (hd0,0)
  kernel /vmlinuz-2.6.18-1.2798.fc6 ro root=/dev/VolGroup00/LogVol00
  initrd /initrd-2.6.18-1.2798.fc6.img
  (你能够经过下面命令发现正确的vmlinuz和initrd文件:
  ls -l /boot
  )
  往常重启系统:
  shutdown -r now
  假定一切停顿顺利, 你的新内核正常工作. 你还能够经过运转下面命令来检查新内核能否运转:
  uname -r
  这将会显现如:
  2.6.18-custom-2.6.18.2
  假定系统没有起来, 重启一下, 你会看到:

  Linux公社简介 - 广告效劳 - 网站地图 - 辅佐信息 - 联络我们
  本站(LinuxIDC)所刊载文章不代表同意其说法或描画,仅为提供更多信息,也不构成任何倡议。
  Copyright  2006-2016Linux公社All rights reserved 沪ICP备15008072号-1号

  3. 构建内核的传统方式
  这个章节讲述另一种适用于一切linux发行版的内核编译方式. 跟Fedora编译方式不同的是, 结果不会有rpm内核包.
  3.1 下载内核源代码
  我们下载需求的内核到/usr/src目录(去www.kernel.org网站下载你需求的内核版本, 比如. linux-2.6.18.2.tar.bz2(你能够从这里下载一切的2.6内核: http://www.kernel.org/pub/linux/kernel/v2.6/). 然后下载到/usr/src目录:
  cd /usr/src
  wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.18.2.tar.bz2
  然后解压内核源代码, 创建一个指向内核源代码目录的linux字符链接:
  tar xjf linux-2.6.18.2.tar.bz2
  ln -s linux-2.6.18.2 linux
  cd /usr/src/linux
  3.2 给内核源代码打补丁(可选)
  有时你的缺省内核不支持新买的设备, 你需求装置新的驱动. 或者你需求运用虚拟技术或其它高级的技术, 而这些现有的内核都不支持. 这样状况下你需求给给内核源代码打补丁(当然补丁曾经发布..)
  往常我们假定你曾经下载需求的补丁(以下例子我叫它patch.bz2)到/usr/src. 运转下面的命令给内核源代码直接打上补丁(你的用户必需位于/usr/src/linux目录):
  bzip2 -dc /usr/src/patch.bz2 | patch -p1 --dry-run
  bzip2 -dc /usr/src/patch.bz2 | patch -p1
  第一个命令用于测试, 对内核没有任何影响. 假定没有显现错误, 你能够运转第二个命令给内核打补丁. 假定第一个命令有误, 请务继续的操作!
  你也能够经过内核的prepatches方式打补丁. 比如, 假定你需求一个功用, 而这个功用仅存在于2.6.19-rc5中, 正式完好的内核版本仍没有发布, 而patch-2.6.19-rc5.biz2曾经发布. 你能够把这个补丁打到2.6.18的内核源代码中, 但请不要抵达2.6.18.1或2.6.18.2, 等. 这个规则在接下来的网页中注明: http://kernel.org/patchtypes/pre.html
  prepatches同等于linux中的测试发行; 他们位于存档的测试目录中, 我们能够运用patch(1)工具对上一个完好发行版(版本号分三部分)打补丁(例如, 2.6.13-rc4 prepatch只能够给2.6.11内核源代码打补丁, 而不是2.6.11.10.)
  所以假定你想编译2.6.19-rc5内核, 你必需在步骤3.1下载2.6.18(http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.18.tar.bz2)替代2.6.18.2内核源代码!
  下面是如何给2.6.18打上2.6.19-rc5补丁:
  cd /usr/src
  wget http://www.kernel.org/pub/linux/kernel/v2.6/testing/patch-2.6.19-rc5.bz2
  cd /usr/src/linux
  bzip2 -dc /usr/src/patch-2.6.19-rc5.bz2 | patch -p1 --dry-run
  bzip2 -dc /usr/src/patch-2.6.19-rc5.bz2 | patch -p1
  3.3. 配置内核
  运用当前工作内核的配置文件做为新内核配置文件的基础是一个很好的主见. 因而我们拷贝已存的配置文件到/usr/src/linux:
  make mrproper
  cp /boot/config-`uname -r` ./.config
  然后运转
  make menuconfig
  然后我们看到内核的配置菜单. 移动绿色光标到 Load an Alternate Configuration File 行后选择.config文件做为配置文件:






  然后阅读内核配置菜单, 选择你需求的功用. 完成配置后, 选择Exit, 回答下面的问题(Do you wish to save your new kernel configuration? 你希望保管新的内核配置吗?), 选择Yes:




  3.4 构建和装置新的内核
  构建和装置新的内核, 执行下面的3个命令:
  make all
  make modules_install
  make install
  坚持耐烦, 内核编译需求一定时间, 主要看你的内核配置和处置器速度. 最后一个命令将自动创建一个ramdisk, 你将在/boot/grub/menu.lst用到.
  往常编辑/boot/grub/menu.lst. 把你的新的内核信息放到列表的顶端, 确认新的内核曾经替代老的内核, default值需求设为0.
  vi /boot/grub/menu.lst
  我的menu.lst是这样的:
  # grub.conf generated by anaconda
  #
  # Note that you do not have to rerun grub after making changes to this file
  # NOTICE: You have a /boot partition. This means that
  # all kernel and initrd paths are relative to /boot/, eg.
  # root (hd0,0)
  # kernel /vmlinuz-version ro root=/dev/VolGroup00/LogVol00
  # initrd /initrd-version.img
  #boot=/dev/sda
  default=0
  timeout=5
  splashimage=(hd0,0)/grub/splash.xpm.gz
  hiddenmenu
  title Fedora Core (2.6.18.2)
  root (hd0,0)
  kernel /vmlinuz-2.6.18.2 ro root=/dev/VolGroup00/LogVol00
  initrd /initrd-2.6.18.2.img
  title Fedora Core (2.6.18-1.2798.fc6)
  root (hd0,0)
  kernel /vmlinuz-2.6.18-1.2798.fc6 ro root=/dev/VolGroup00/LogVol00
  initrd /initrd-2.6.18-1.2798.fc6.img
  往常重新启动系统:
  shutdown -r now
  假定一切停顿顺利, 你的新内核正常工作. 你能够经过运转下面命令来检查你的新内核能否运转:
  uname -r
  这将会显现如:
  2.6.18.2
  假定系统没有起来, 重启一下, 你会看到:



  按恣意键进入GRUB菜单:



  选择你以前的内核启动系统, 往常你能再次尝试编译新的工作内核. 不要遗忘从/boot/grub/menu.1st文件中移去不需求的引导内核信息.
文章来源:华域联盟

 

                                                  

帖子的最近访客

回复 百度谷歌雅虎搜狗搜搜有道360奇虎 天涯海角搜一下: 百度 谷歌 360 搜狗 搜搜 有道 谷粉 雅虎 必应 即刻

使用道具 举报

GMT+8, 2017-9-25 06:50 , Processed in 0.203125 second(s), 37 queries .

© 2020 华域联盟 | 蒙公网安备 15062202000105号 版权删帖举报人口

备案号: 蒙ICP备17000689号-2                                                                                                                                                                    

快速回复 返回列表