关于尚观
最新课程体系
企业服务
零起点咨询
开放课程
报名咨询
免费资源申请
授权加盟
学员专区&薪资
认证课程
  • 尚观首页
  • 尚观简介
  • 师资力量
  • 尚观文化
  • 尚观动态
  • 加入尚观
  • 联系我们
  • 珍贵瞬间
  • Linux系统与集群
  • 数据库集群架构师
  • 嵌入式内核驱动开发
  • 服务器开发架构师
  • 研发型测试架构师
  • RHCE/LPI认证体系
  • Oracle OCP认证
  • 企业高级技术培训
  • 批量人才供应及研发团队建设
  • 软件外包及研发项目合作
  • 人力外包及人力供应
  • 猎头服务
  • 开启职业生涯
  • 如何入门
  • Unix/Linux职业方向
  • 嵌入式职业方向
  • 集群(Cluster)Oracle(DBA)方向
  • 新手专栏
  • Unix/Linux新手专栏
  • Unix/Linux管理
  • 嵌入式及POSIX开发
  • Linux开源文化及市场
  • 最近网络课堂
  • P2P教学视频
  • 精彩Linux培训视频
  • 零起点数据库集群(长期)
  • 嵌入式驱动(长期)
  • Linux金牌三证(RHCE级)
  • Linux架构师(RHCA级)
  • 嵌入式/驱动加速课程
  • 其他咨询
  • Linux免费网络安全公开课
  • 免费Linux资料申请
  • 免费Linux安全&DDOS防御课程
  • 免费嵌入式Linux开发课程
  • 免费Linux网络安全机制
  • 授权加盟&报名点申请
  • 如何加盟
  • 我们的优势
  • 成功案例
  • 行业市场分析
  • 授权加盟中心
  • 学员毕业薪资(不断更新中)
  • 加入尚观猎头服务(仅限老学员)
  • 学员交流论坛
  • OCP认证
  • Intel认证
  • RHCE认证
  • RHCE+OCP
  • RHCE+LPI


    您现在的位置:尚观Linux培训 - 嵌入式Linux培训专家尚观Linux培训 » 嵌入式及POSIX开发 » 总结编译linux内核的步骤

总结编译linux内核的步骤

 
咨询热线
  • 免费咨询电话:
    400-700-0056
    800-810-0056

    教学就业监督电话:
    400-810-3016
  • QQ在线咨询:
    1473648322 在线咨询
    1337746932 在线咨询
    1244254603 在线咨询


  • MSN在线咨询:
    upadv01@hotmail.com
    upadv20@hotmail.com
免费资源
  • -4月24日
  • [沈阳]Linux嵌入式-4月24日
  • [上海]DDos攻防-4月24日
  • [上海]Linux嵌入式-4月24日
  • [深圳]DDos攻防-4月24日
  • [深圳]Linux嵌入式-4月24日
  • [北京]DDos攻防-4月24日
  • 就业课程
  • 免费课程
  • 五万年薪就业保证课程

  • ULP-S 尚观王者IT集群课程
  • UEA-嵌入式内核驱动开发者
  • UGA-4G游戏与应用开发架构师
  • ULA-Linux系统与集群架构师
  • UOA-Oracle数据库集群架构
  • 八万年薪就业保证课程

  • UOM- Oracle集群大师
  • UEM-嵌入式开发大师
  • OCM考试指南全国免费公开课—全面解析及经验分享 7月17日
  • Linux网络攻击威胁分析以及Linux安全技巧 7月27日
  • 零基础轻松快速掌握嵌入式开发技术 7月14日
  • Android游戏及应用开发免费基础课程 7月27日
  • iPhone游戏及应用开发高级课程 7月12日
Linux培训●最新开班
  • [大连]ULA课程6月班热招!
  • [沈阳]UEA课程6月班热招!
  • [沈阳]ULA课程6月班热招!
  • [北京]UEA课程6月班热报!
  • [北京]UOA/ULA课程6月班!
  • [上海]UEA课程5月班热招!
  • [上海]ULA/UOA课程6月班!
  • [深圳]UEA课程6月班热招!
 
文章内容
  • 很多朋友一听到说编译内核,就觉得很高深莫测,非常头大。其实,通常其它操作系统的内核编译是比较繁琐的。然而,由于Debian强大的dpkg软件包管理系统,使得内核的升级、编译也变得容易很多。如果下面的步骤都注意并执行了,编译内核不是很复杂的事情,我在基于debian的ubuntu系统上第一次编译就成功了。编译过程如下,与各位分享:

        修改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

        安装相关的软件,包括
        a、Ubuntu Dapper Drake 6.06 LTS 首选“软件”,自己想办法安装吧
        b、build-essential,里面有gcc,make等东西要用到。
        c. kernel-package,里面有make-kpkg要用。
        d. qt库,主要是为了用make xconfig图形界面配置,你要安装libqt3-headers,libqt3-mt-dev等
        e. libncurses5-dev,主要是用make menuconfig,我就用这个。
        f. gtk库,用于make gconfig。安装gtk2.0,相关lib。

        下载源码
        到www.kernel.org下载当前最新版的源代码。下载的分类有p,f等区别,要下f类型的连接,不要下补丁。下好的源代码应该有40多M。然后解压缩源代码。

        tar xjvf linux-2.6.20.tar.bz2 -C /usr/src/linux-2.6.20

        cd /usr/src/linux-2.6.20

        补丁
        如果需要给内核源代码打补丁,首先下载相对应的补丁,在这里我们以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.20目录下。

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

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

        创建链接
        创建一个指向新内核代码的符号

        sudo ln -s /usr/src/linux-2.6.16ck12 linux

        然后进入这个目录:

        cd /usr/src/linux

    清理
        运行命令 make mrproper 来清一下包。

        配置
        可以用现有的配置文件作为新内核配置文件的基础,先复制已经存在的配置文件到/usr/src/linux目录中

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

        然后运行

        sudo make menuconfig或者sudo make xconfig

        如果希望自己配置,那么就在这里面详细选。对选项如何选择不熟悉的,请参考这篇文章。看不懂中文?参考这里。

        下面补充一些内容,只说几个这篇文章中没有提到的。

        Bus options (PCI, PCMCIA, EISA, MCA, ISA)
        PCI support
        PCI Express support 老式机器没有PCI-E设备的可以选N
        ISA support 较新的新机器没有ISA设备,可以选N
        MCA support 一般选N
        NatSemi SCx200 support 一般选N
        PCI Hotplug Support
        Support for PCI Hotplug (EXPERIMENTAL) 如果没有PCI热插拔设备,选N
        这里的选项都要全部编译进内核,而不是以模块形式存在。

        Device Drivers
        Block devices
        Packet writing on CD/DVD media
        Enable write caching (EXPERIMENTAL) 如果你有刻录机,想启用写缓存功能,选Y

        ATA/ATAPI/MFM/RLL support
        Include IDE/ATA-2 DISK support 如果你的/boot是放在IDE硬盘上,那么这里一定要选Y,选M都不行。否则启动时会出现“waiting for root file system”的提示而停滞不前。
        SCSI device support 如果有SATA硬盘,就选Y
        SCSI disk support 如果你的/boot放在SATA硬盘上,一定要选Y。
        Character devices
        I2C support 一般可以选Y或者M
        Graphics support 不建议把显卡驱动编译进内核。,选M,编译成模块方便日后升级驱动。

        File systems
        CD-ROM/DVD Filesystems
        ISO 9660 CDROM file system support 一般选Y
        DOS/FAT/NT Filesystems
        VFAT (Windows-95) fs support 有FAT32分区就选Y吧
        NTFS file system support 有NTFS分区就选Y吧
        NTFS write support 如果想对 NTFS分区进行写操作,选Y
        Native Language Support
        Simplified Chinese charset (CP936, GB2312) 选Y或者M使读取FAT分区不会遇到中文乱码现象
        必须将启动盘的文件系统编译进内核,默认是编译成模块,这样无法启动系统。最好是把硬盘上所有用到的分区文件系统全部编译进内核。

        然后再谈几个常见的问题解决方法:

        1、编译内核失败,不能进入系统,提示如下:
        audit(1129243020.326:0):initialized
        kernel panic – not syncing: VFS:Unable to mount root fs on unknown-block(0,0)
        或是:
        VFS:Cannot open root device “hdxy” or unknow-block(0,0)
        Please append a correct “root=” boot option
        kernel panic-not syncing: VFS:Unable to mount root fs on unknow-block(0,0)

        解决方法:把
        08.05.11、<*> RAM disk support
        09.27.07、<*> Compressed ROM file system support (cramfs) 这两项都要选上!!!!!!否则,呵呵!

        2、不能挂载ISO文件。

        解决方法:把
        08.05.06、<*> Loopback device support
        08.05.07、<*> Cryptoloop Support 这两项都要选上便可!

        3、用SATA硬盘,原来内核中硬盘的设备号是/dev/sda,编译新内核后的硬盘设备号由/dev/sda变成/dev/hde,硬盘声音很吵。

        解决方法:把
        08.07、SCSI device support —>
        08.07.01、<*> SCSI device support
        # 08.07.02、 legacy /proc/scsi/ support
        08.07.03、<*> SCSI disk support 这些选项都选上便可!

        4、用上新版本内核后,无法安装显示卡的NVIDIA-Linux-x86-1.0-7676-pkg1.run驱动,系统提示如下:
        Unable to load the kernel modules “nvidia.ko ”, This is most likely because the kernel modules was built using the wrong kernel source files. Please make sure you have installed the kernel source files for your kernel; on Red Hat Linux system, for example, be sure you have the kernel source “rpm” installed. If you know the correct kernel source files are installed, you may specify the kernel source path with the “–kernel-source-path” commandline option.

        解决方法:
        重新配置内核,将内核中
        08.21、Graphics support —> 这个选项里面与Nvidia相关的选项全部去掉后,竟然能够正确安装显卡驱动!具体情况如系统提示,不能引导内核模块,或是模块冲突,导致这种故障。

        设置完,保存即可。

    构建内核
        接下来,就开始构建内核了。首先清理一下东西:

        sudo make-kpkg clean

        然后

        sudo make-kpkg -initrd –revision=lk_517 kernel_image kernel_headers modules_image

        lk_517是可以自己换得,表示镜像的名字,必须要以数字结尾。最后是生成镜像包和头文件包。你也可以用binary代替,它融合了image.headers.doc.source,是最完整的包。

        make-kpkg是一个可以自动替换”make dep;make clean;make bzImage;make modules”命令序列的脚本。而最其最常用的两个参数就是–append-to-version与–revision。
        – append-to-version这个选项可以让我们来指定一个额外的内核版本,这个可以成为内核名的一问分。我们可以使用数字,”+”,”,”, 但是不要使用下划线。要避免设置–append-to-version为如”-686″,”-K7″,”-sparc”等值,因为这些值常为 Debian的预编译内核所使用。

        内核模块位于/lib/modules子目录下。每一个内核有他自己的子目录。每次当我们以一个新的名字来安装一个新的内核时,这个包安装程序就会在/lib/modules目录下创建一个新的子目录来保存他自己的模块。这就意味着每一次我们使用– append-to-version的一个新的值来编译一个内核时,我们就可以保证这个内核有一个新的名字,而他的模块也不会与其他的内核模块相冲突。

        注意:如果我们使用相同的名字来安装一个内核时,安装程序就会覆盖掉已安装的内核及其模块。–revision只会影响Debian软件包本身的名字而不是内核的名字。与–append-to-version相似,我们只可以使用数,”+ “,”.”,不要使用下划线”_”。如果我们并没有为–revision指定一个值,make-kpkg就会使用”10.00.Custom”.使用不同的–revision的值就可以避免相同名字的内核之间的冲突。

        在内核构建成功之后,你能在/usr/src目录下看见三个.deb文件。其中包括linux-image-2.6.20- custom_2.6.20-custom-10.00.Custom_i386.deb (包含真实内核) and linux-headers-2.6.20-custom_2.6.20-custom-10.00.Custom_i386.deb (包含那些编译附加内核模块所需要的文件)。

        kernel-image文件的名字格式如下:

        kernel-image-(kernel-version)(–append-to-version)_(–revision)_(architecture).deb

        我用这种办法安装:

        sudo dpkg -i xxx.deb

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

        完成
        好了,现在,你可以检查一下你的menu.lst文件,多了两个与新内核有关的部分。现在,重新启动计算机,shutdown -r。如果一切顺利的话,重新启动之后,你使用的就是新的内核了。你可以通过 ” uname -r”命令来看看目前的内核版本。

        这下就算彻底完成了。重新启动计算机,在GRUB中选择新内核启动。如果启动失败,当你看见屏幕上出现 “Press ESC to enter the menu…1″这行字的时候,按下ESC,此时会进入grub的启动菜单,好,选择你的旧版内核,启动系统。现在,你不得不重新编译一次内核,使其能够正常使用。编译之前别忘了,从menu.lst中去除之前的两个不能正常工作的内核区域。




    精彩Linux视频,免费先学!

    查看:尚观Linux培训学员最新就业薪资待遇统计报告!

    查看:UTA-高级研发型测试架构师大纲
    查看:UDA-Linux服务器开发架构师大纲
    查看:UEA-嵌入式内核驱动开发者大纲
    查看:UOA-Oracle数据库集群架构大纲
    查看:ULA-Linux系统与集群架构师大纲

    填表获取 Linux、嵌入式、Oracle 技术资料

  • 姓    名:
  • 固    话:
  • 手    机:
  • E-Mail :
  • 所在地:
  •         

北京(Beijing)

电子地图
电话:(010)62113016/17 68949060
地址:北京海淀区中关村南大街 甲10号 银海大厦南区410-418

上海(Shanghai)

电子地图
电话:(021)64859996 64859889
地址:上海徐汇区钦江路333号漕河泾开发区38号楼申能科技3楼

深圳(Shenzhen)

电子地图
电话:(0755)82995128 82995168
地址:深圳福田区 彩田路 中深花园B2005室

沈阳(Shenyang)

电子地图
电话:(024)31500816 31500817
地址:沈阳和平区三好街54号物产科贸大厦2号楼201室

大连(Dalian)

电子地图
电话:(0411)84336822 84326822
地址:大连沙河口区西安路86号行政大厦(罗斯福广场对面)17楼1705室

成都(Chengdu)

电子地图
电话:(028)66677820 66677828 66677829
地址:成都青羊区上西顺城街252号顺吉大厦8楼A3

2005-2009高新技术企业

LPI授权培训考试中心

CSDN战略伙伴

51Job战略伙伴

Oracle WDP授权培训与考试中心

Intel软件服务培训供应商

Redhat授权培训与考试中心

国家高新技术企业认证
 

友情链接(联系QQ:87865954):   LPI  RedHat  CSDN  ChinaUnix  ITPub  Eygle.Com  PHP中国  网易教育  Linux培训  嵌入式培训 
Linux联盟  21CN教育  Unix爱好者家园  ZOL服务器  广告联盟  Linux  嵌入式技术网  股票入门  大功率LED网   搜电网   网页制作
杭州写字楼网  时尚论坛  医药营销联盟  Linux技术中心  泉州人才网  广州招聘网  天天健康  上海商铺  北京赶集网  畅享网  SVN中文技术网 
网罗天下  工具软件下载  Oracle培训  北京法律咨询  天津赶集网  嵌入式资讯网  天极导航  Fedora中文爱好者  oklinux  沸点100网  Linux公社 
深圳本地宝  IT英才网  教培英才网  北京招聘前程无忧  中国二手车城  连锁加盟  天极网南京站

COPYRIGHT © 2000-2009 北京尚观科技有限公司 - Linux培训及嵌入式培训专家 ALL RIGHTS RESERVED

咨询热线:400-700-0056    800-810-0056
京ICP备05058027号 | Linux就业信息 | 免责声明 |