【转】如何编译一个内核 - Ubuntu方式
每一个Linux发行版都有自己专门的工具去构建自定义的内核. 本文主要介绍在Ubuntu平台上编译内核, 如何从www.kernel.org(也叫vanilla kernel)获得最新且未改动的内核源代码来构建一个自定义的内核, 这样你可以使用自己的内核而不是发行版的内核, 另外也介绍了如何给内核打补丁, 从而方便增加新的功能. 下面的工作我都在Ubuntu 6.10 Server ("Edgy Eft")和Ubuntu 6.06 Desktop ("Dapper Drake")上经过了测试. 我想首先要说的是文章中构建自定义内核的方式不是唯一的, 还有许多其它的方式, 这不过是我习惯的方式. 我不能保证使用后不会出现任何问题. 1. 预备工作 然后, 以root身份登陆: 如果你想使用一般用户来替代root用户, 记住在本文所有命令前输入sudo, 比如当我运行 你需要运行下面的命令来替代, 等. 1.1 Ubuntu 6.10上的/bin/sh ("Edgy Eft") 如果你使用Ubuntu 6.10, 现在你可以运行: 2 安装必需的软件包 (为内核编译做准备) 然后我们安装所有需要的软件包: 3 下载内核源代码 然后解压内核源代码, 创建一个指向内核源代码目录的linux字符链接: 4 给内核源代码打补丁(可选) 现在我们假设你已经下载需要的补丁(以下例子我叫它patch.bz2)到/usr/src. 运行下面的命令给内核源代码直接打上补丁(你的用户必须位于/usr/src/linux目录): 第一个命令用于测试, 对内核没有任何影响. 如果没有显示错误, 你可以运行第二个命令给内核打补丁. 如果第一个命令有误, 请务继续的操作! 你也能够通过内核的prepatches方式打补丁. 比如, 如果你需要一个功能, 而这个功能仅存在于2.6.19-rc4中, 正式完整的内核版本仍没有发布, 而patch-2.6.19-rc4.biz2已经发布. 你可以把这个补丁打到2.6.18的内核源代码中, 但请不要达到2.6.18.1或2.6.18.2, 等. 这个规则在接下来的网页中注明: http://kernel.org/patchtypes/pre.html prepatches等同于linux中的测试发行; 他们位于存档的测试目录中, 我们可以使用patch(1)工具对上一个完整发行版(版本号分三部分)打补丁(例如, 2.6.12-rc4 prepatch只可以给2.6.11内核源代码打补丁, 而不是2.6.11.10.) 所以如果你想编译2.6.19-rc4内核, 你必须在步骤3.1下载2.6.18(http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.18.tar.bz2)替代2.6.18.1内核源代码! 下面是如何给2.6.18打上2.6.19-rc4补丁: 5. 配置内核 然后运行 然后我们看到内核的配置菜单. 移动绿色光标到 Load an Alternate Configuration File 行后选择.config文件(包含了当前工作内核的配置)做为配置文件: 然后浏览内核配置菜单, 选择你需要的功能. 完成配置后, 选择Exit, 回答下面的问题(Do you wish to save your new kernel configuration? 你希望保存新的内核配置吗?), 选择Yes: 6 构建内核 如果要进行交叉编译,可以进行确定架构机器上的编译。 在--append-to-version= 后面你可以写上任何字符串来区别内核版本, 但是必须以" - "符号开始而且后面不包括任何空格. 保持耐心, 内核编译需要一定时间, 主要看你的内核配置和处理器速度. 7 安装新内核 在我的测试系统上, 他们分别名为 linux-image-2.6.18.1-custom_2.6.18.1-custom-10.00.Custom_i386.deb (包含了实际的内核) 和 linux-headers-2.6.18.1-custom_2.6.18.1-custom-10.00.Custom_i386.deb (包含了需要的文件, 用于以后需要编译额外的内核模块). 我是这样安装的: (现在你甚至能够拷贝这两个.deb文件到其它的Ubuntu系统, 通过上面的方式安装. 你将不再需要编译内核.) 然后检查 /boot/grub/menu.lst文件, 现在你将能发现新内核使用的两个引导配置块: 在我测试系统上已经添加好的引导配置块是这样的: title Ubuntu, kernel 2.6.18.1-custom (recovery mode) 现在重启系统: 如果一切进展顺利, 你的新内核正常工作. 你还可以通过运行下面命令来检查新内核是否运行: 这将会显示如: 如果系统没有起来, 重启一下, 你会看到: 按ESC进入GRUB菜单: 选择你以前的内核启动系统, 现在你能再次尝试编译新的工作内核. 不要忘记从/boot/grub/menu.1st文件中移去不需要的引导内核信息. ======================================================================================================= ======================================================================================================= ======================================================另一篇===================================================== ======================================================================================================= 编译 Linux2.6 内核总结 在X86, Ubuntu 上编译Linux2.6内核,总结如下: 基础知识 在介绍如何编译内核之前, 需要对内核相关概念有一定的了解. 关于Linux kernel的介绍浩如烟海, 这里只介绍系统中相关的目录, 文件及命令. /boot /boot/vmlinuz-<version> : 用于启动的压缩内核镜像, 它也就是/arch/<arch>/boot中的压缩镜像. /lib/modules 该目录包含了内核模块及其他文件. 注意, modules中一般会有多个目录: 系统自带的内核模块在这里, 你编译自己的内核模块后, 它们也会被安装到这里. 不同的目录由内核版本号来区分. 即modules里目录的名称是内核版本号. (使用$ uname -r 可知当前系统内核所用的模块位于哪个目录). /lib/modules/<kernel-version>/build /lib/modules/<kernel-version>/kernel /lib/modules/<kernel-version>/中: 这些文件都是文本文件, 可以查看它们. $ uname -r uname(1)被用来查看系统信息, 这里对我们有用的是它的"-r"选项, 它显示内核版本信息. 下载内核, 验证签名, 解压缩 1, 下载内核压缩包 bzip2格式比gzip压缩效率更高, 一般就下载bz2的压缩包. 下载了内核压缩包之后, 还可下载对应的sign文件. 它被用来验证内核压缩文档的openPGP签名. 详细信息可参考这里. $ wget -c http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.17.13.tar.bz2 2, 验证签名 首先从pgp的服务器获取签名公匙, linux内核包的公匙编号是0x517D0F0E. 再利用sign文件来验证.bz2压缩包的签名. 如果输出中有类似gpg: Good signature from "Linux Kernel Archives Verification Key <ftpadmin@kernel.org>" 的内容, 说明该包是有效的. 后面给出的警告信息可以忽略. $ gpg --keyserver wwwkeys.pgp.net --recv-keys 0x517D0F0E
3, 解压缩 解压缩之前, 有个问题值得思考: 要将压缩包解压到何处? 即要在哪个目录进行Linux内核源代码的编译? 内核源码树的README中有这样一段话:
实 际上, 在我的Ubuntu系统中, /usr/src/ 目录中最初是没有linux目录的. 你可以在/usr/src中新建一个目录, 用内核版本命名, 比如/usr/src/linux-2.6.17.13. 这样, 即便之前在/usr/src中安装了linux的头文件, 也不会对它们造成影响. 我采用的方法是: 在/usr/local/src/kernel目录中进行. 编译内核时候, 若在make 后添加 "O=<complete_dir>"将会使生成的目标文件(包括.config)被放置到指定的目录. 否则, 生成的目标文件默认地被放到内核源码目录. 我们就采用默认的方法. 这是安全的. 4, 打补丁 对于kernel.org中的内核, 我个人认为没必要下载patch, 再打补丁. 费那事干嘛, 直接下载bz2包不就行了. 特定的补丁只能针对紧随其前的一个版本. 比如你想从2.6.17.1升级到2.6.17.13. 你得打12次补丁, 忒麻烦了. 但 是, 有时候需要对"官方内核"添加补丁, 以支持特定的系统. 比如ARMLinux, 它往往不是发布完整的内核, 而是发布针对特定版本的补丁包. 这种情况下就要知道如何打补丁了. 方法很简单: 把补丁下载, 解压. 得到patch-<version>. 将它放到解压后的内核目录树的父目录中(也就是补丁和内核目录在同一目录). 然后cd到内核目录树中运行: $ patch -p1 <../patch-<version> 配置内核 显然, 需要make, gcc等工具, 在Ubuntu中, 只需一条简单命令就可安装所有的源代码编译工具: 当然, 如果你的内核是要安装到不同体系结构的目标系统中, 还需要构建cross编译环境. 2, 内核配置工具介绍 Linux提供了多种内核配置工具, 最基础的是 make config, 它列出每个编译选项, 而且是基于文本的, 一般不用它. menuconfig (make menuconfig) xconfig (make xconfig) 3, 内核配置相关 .config配置文件
其实可以直接在menuconfig中加载已有的配置文件, 不要将它改名为.config. 否则完成配置, 退出menuconfig时会提示你运行 make mrproper. 上面提到的方法只是比较适合于oldconfig! make相关命令 $ make clean : 删除生成的目标文件, 往往用它来实现对驱动的重新编译. 可以查看内核源码树中的README和Makefile了解上述配置方法. 4, 开始配置 1, 修改Makefile (可选) VERSION = 2 我们在编译内核之前, 可以先修改Makefile中的版本信息(一般是修改EXTRAVERSION, 比如EXTRAVERSION =-zp). 这样就能将自己编译的内核同别人编译的相同版本内核区分开来. 修改, 编译之后, 可使用 $ uname -r 查看内核版本信息. 但实际上, 从2.6.8的版本起可在内核版本号后面添加个性化字符串. 所以也就没有必要修改Makefile了: () Local version - append to kernel release 如果你即修改了Makefile中的EXTRAVERSION, 又在配置时定义了local version. 那么local version所定义的字符串将位于末尾, 紧跟在EXTRAVERSION的值之后. 另外, 如果要用到ccache, 也需要修改Makefile. 参考后面的内容! 2, 准备一个.config文件. (1) 使用make defconfig将在源码树的根目录得到.config.
3, 建议配置步骤: 配置选项是最头疼的问题: 配置时候注意驱动的问题, 尤其是网络驱动. 使用 pppoe 的话, 要选上 ppp 相关的选项. 网卡驱动也要注意, 我刚开始配置的时候, 只加上了 lspci | grep Ethernet 对应的网卡, 但是重启后找不到eth0, 一怒之下, 把所有的1000M 网卡驱动都选为模块. 总算成功. 以后有空仔细看看. 再就是声卡驱动也要注意.可参考我blog里另一篇文章:配置2.6内核选项注解
编译内核 使用make编译内核的技巧 1, 可以略去编译信息(但仍能看到warning, error) 2, 加速编译过程. 编译生成的文件介绍 vmlinux : 未经压缩的原始linux内核镜像. 安装内核 安装内核步骤如下: (2)更改/boot/mynewkernel中bzImage的名字 (3)备份、修改grub配置文件 修改menu.list,加入以下内容(从既有的menu.list中相关的内容拷贝): (4)安装模块: reboot, 在grub启动菜单中选择新内核启动... 参考资料 ------------------------------------------------------------------------------------- 参考:http://forum.ubuntu.org.cn/viewtopic.php?t=46958&highlight=%E7%BC%96%E8%AF%91%E5%86%85%E6%A0%B8 ------------------------------------------------------------------------------------- Linux(Ubuntu)学习札记 /liaxiz 发表于2007-06-11, 20:26 编译步骤如下: 为了这一个问题,被“残酷”地折磨了将近30个小时,但心情还是蛮愉快的。linux让我们能在痛苦中体会自由带来的乐趣,也可谓之奇。希望每一个编译过内核的朋友都能享受这一过程。 原文地址http://liaxiz.bloghome.cn/posts/97402.html |
转载于:https://www.cnblogs.com/jack204/archive/2012/02/21/2361661.html
【转】如何编译一个内核 - Ubuntu方式相关推荐
- 编译一个内核及分区格式化
编译一个内核 首先,配置好编译环境:用yum装几个软件包yum groupinstall "Development Libraise" "Development Tool ...
- 编译linux内核成vmlinuz,编译一个内核 - no bzImage/vmlinuz生成
我通过询问qemu模拟与arm926ej-s不同的CPU来得到您描述的结果.但用默认的cpu工作引导versatilepb.我交叉编译了我的内核,并且我编译了所有的驱动程序(所以我不使用initrd) ...
- Linux内核编译很简单,6步编译一个自己的内核
考虑离开在前面文章中我们反复提到过Linux内核,知道Linux内核才是Linux操作系统最为核心的内容.内核实现了对硬件的管理,为应用软件提供了使用硬件的接口. 对于Linux开发人员而言,内核的学 ...
- 操原作业(一)Ubuntu系统编译一个新的内核
操作系统原理这门课布置了一项作业,要求在Ubuntu系统中编译一个新的内核.下面介绍怎么在Ubuntu系统中编译一个新的内核. 安装Ubuntu系统 如何安装win10+Ubuntu双系统,我已经在上 ...
- 编译linux内核分区,Ubuntu编译内核及grub的一些笔记
最近心态不稳定,不怎么想发表文章,但看了看之前写了的笔记,想想还是整理出来吧,其实我写文章,也有一部分原因是为了心里的慰藉--当年游戏打不过别人,关注点便转向其它方面.这里整理的是以前编译内核.引导启 ...
- 64位ubuntu 12.04编译linux内核提示mkimage command not found
今天心血来潮,想编译以下linux内核来玩玩.一开始编译x86的版本,遇到了openssl/opensslv.h文件缺失的问题,经过一番折腾,顺利解决(解决过程请参见我的另外一篇博客"lin ...
- Ubuntu 8.04 Linux系统下面编译更新内核版本
在 VirtualBox 虚拟机上面测试的,ubuntu 8.04系统. 1. 下载内核源代码 http://www.kernel.org/ 下载The latest stable version o ...
- Ubuntu中编译linux内核后使用make menuconfig报错的解决办法
第一次在Ubuntu中编译完内核使用make menuconfig时出现如下错误 topeet@ubuntu:~/iMX6UL/linux-2.6-imx-rel_imx_4.1.15_1.2.0_g ...
- 操原作业(一)之Ubuntu编译新内核
要求: 1. 准备工作 查看内核版本: 安装相关依赖: sudo apt-get install build-essential kernel-package libncurses5-dev libq ...
最新文章
- 算法导论 c语言,算法导论 之 堆排序[C语言]
- Python 骚操作,微信远程控制电脑
- 使用rx-java的异步抽象
- 从十四五规划看 物联网(NB-IoT、Cat.1、5G)将何去何从?
- springboot+hbase 集成
- linux 设置ssh并发度,在linux如何使用ControlPersist加快SSH连接速度的问题
- 不定长内存池之apr_pool
- TensorFlow 教程 --教程--2.6卷积神经网络
- 工具使用-----Jmeter教程 简单的压力测试
- ICPC程序设计题解书籍系列之一:刘汝佳:《算法竞赛入门经典》(第2版)
- hdu2825(AC 自动机)
- PHP 工具 格式化
- 透视变换原理、相机成像、灭点
- 中文计算机期刊影响因子排名,最新计算机类中文核心期刊影响因子排名
- 为什么学python?怎么学?怎样算学会?
- 【贝壳】(算法工程师)采木【Python】
- c语言中char类型转int类型
- 论文写作三线表制作方法
- 怎么给pdf加水印,pdf加水印步骤
- JS遍历数组的方法【详解】
热门文章
- macos降级_macOS Big Sur如何降级
- python open方法下file模块_python-linecache模块读取文件用法
- 左室短轴切面_4声窗7切面搞定急诊超声心动图:由浅入深学TTE急诊“心”事
- Nginx缓存设置教程
- STM8单片机串口驱动的深度解析
- html网页文件的主体标记,HTML的填空题:1.HTML文件中网页文件的主体标记是_________,标记页面标题的标记是_____________。如题 谢...
- 练习2-13 求N分之一序列前N项和 (15 分)
- 树形dp ---- gym101667 A(贪心 + 树形dp + 两个dp方程组维护)
- forms身份验证 不跳转_“东湖24小时”玩不够?收好这份指南,365天不重样
- 【数学专题】约数个数与欧拉函数