编译Linux内核-阿里云开发者社区

开发者社区> zting科技> 正文

编译Linux内核

简介:
+关注继续查看

下面的实验以 debian7.5 64bit 为例.

获取源码

获取 debian7.5 本身的源码非常简单:

sudo apt-get install linux-source

https://www.kernel.org/ 的git上提供的源码分支非常多, 刚开始学习源码主要关注下面几个分支:

  1. linus分支: https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/
    linux创始人的分支, 不用说肯定最重要, 它是所有分支的根源. 处于 "mainline" 的地位.
    这个分支还有个好听的名字 – "vanilla(香草)" 内核.
  2. linux-next树: https://git.kernel.org/cgit/linux/kernel/git/next/linux-next.git/
    这个一个为发布将来的版本而积累新代码并进行测试的源码树.
    由 Stephen Rothwell 等人进行管理和维护
  3. stable树: https://git.kernel.org/cgit/linux/kernel/git/stable/linux-stable.git/
    这是一个主要针对过去发布的内核版本进行bug修改, 使其更加稳定的树.
    由 Greg Kroah-Hartman, Chris Wright 进行管理和维护.
    针对某个Linus树的稳定版维护一般持续6个月左右, 也有更持久的.

上面的列出的git树中都可以获取想要的源码.

编译内核

其实编译内核和编译普通软件也没多大区别, 只是内核编译的参数非常之多.
下面就来先看看如何设置内核编译参数

内核编译选项

  1. 编译选项个数
    内核的编译选项的个数非常多, v2.6.38的内核中就有 12 000 个左右的设置选项(这是包含所有arch的配置选项).
    内核编译选项不仅多, 有些编译选项之间还存在依赖关系, 所以手动设置编译选项几乎是不可能的.
    值得庆幸的是, 只要知道自己需要设置的那些选项, 就可以使用 make ***config 来进行设置, 它还会自动处理依赖关系.
  2. 配置编译选项:
    设置内核编译选项是通过 kconfig 这个工具来完成的.
    kconfig 的源码就是内核代码中 script/kconfig 目录下

    各个编译选项的选择有3种方式:

    1. =y :: 直接编译到内核中
    2. =m :: 以模块方式编译到内核中
    3. 不设置 :: 不编译

    编译方法:

    1. make menuconfig :: 源码根目录下生成 .config (没有会自动生成), .config中就是各个内核编译选项的选择状况.
    2. make defconfig :: 根据当前系统的架构默认 .config 生成内核源码目录下的 .config (每个架构的配置文件: ex. arch/x86/configs/x86_64_defconfig)
    3. make oldconfig :: 将已有的 .config 放到源码根目录下后执行, 目的是为了复用之前的内核编译选项的配置.
    4. make xconfig :: 图形化配置, 需要qt3, 个人觉得没有必要, 有 make menuconfig 就足够了.
    5. make localmodconfig :: 生成以正在使用的内核模块为对象的 .config

编译

编译很简单, 内核编译选项设置好之后, 只需简单的命令 make, 就可以编译了.
由于内核代码的庞大, 所以和一般应用程序相比, 编译时间会很长. 可以尝试以下方法来加快编译速度:

  1. 不用的驱动程序都不要设置, 这样就不会编译
  2. 利用make的 -j 选项来并发编译, ex. make -j N (N是并发数). 如果你的机器有2个CPU, 可以用 make -j 2 来提高编译速度
  3. 使用 make localmodconfig 来生成仅以正在使用的内核模块为对象的 .config (一般这样生成的.config中包含的内核模块最少, 所以编译速度快)

  4. 编译时间比较: 测试环境 - debian v7.5虚拟机(cpu: 单核, 内存: 512MB)

.config生成 make时间 生成的modules 备注
make menuconfig 1小时13分41秒 3052个.ko, 共1.2GB 默认配置, 什么也不选择
make localmodconfig 19分36秒 337 个.ko, 共176MB  

 modules 是通过 make modules_install 之后, 在 /lib/modules 中根据编译内核版本号来查看的
查看有多少个 .ko 文件的方法:

cd /lib/modules/3.2.60
find . -name '*.ko' | wc -l

分开编译

模块和内核不在一起的编译, 就是在现有的内核中追加一些内核模块时, 不需要将内核也重新编译.
模块分开编译的方法很简单, 参考之前的博客: 《Linux内核设计与实现》读书笔记(六)- 内核数据结构 这篇博客中的例子就是和内核分开编译的模块.

交叉编译

交叉编译就是在当前平台上编译其他平台上的内核二进制映像, 比如在 x86_64 平台上编译 arm 的内核映像.
交叉编译需要目标平台的交叉编译器. 编译时主要是 ARCH 和 CROSS_COMPILE 2个变量的设置.

下面举个交叉编译 ARM 的例子: 公司用的制作 Cubieboard 板子上的image中的一段编译内核的代码

make -C ${CB_KSRC_DIR} O=${CB_KBUILD_DIR} ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- kernel_defconfig
make -C ${CB_KSRC_DIR} O=${CB_KBUILD_DIR} ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- -j4 INSTALL_MOD_PATH=${CB_TARGET_DIR} uImage modules

上述 第一行 是编译内核源码. 第二行 是创建 uImage 格式的内核映像以及创建内核模块
最终在 INSTALL_MOD_PATH 生成的内核模块可以直接拷贝到 arm机器上使用.

生成内核包

debian 系 linux下生成 内核源码包的方法

make deb-pkg

安装内核

make modules_install (安装内核模块到 /lib/modules 下)
make install (安装内核二进制映像, 生成并安装boot初始化文件系统映像文件)

卸载内核

  1. 删除/lib/modules/目录下不需要的内核库文件
  2. 删除/usr/src/kernel/目录下不需要的内核源码
  3. 删除/boot目录下启动的核心档案禾内核映像
  4. 更改grub的配置,删除不需要的内核启动列表

内核 Makefile 中一些有用的 target

  1. make help : 内核Makefile中的各种 target
  2. make cscope : 生成 cscope 文件
  3. make tags/TAGS : tags可用于vim, TAGS可用于emacs



本文转自wang_yb博客园博客,原文链接:http://www.cnblogs.com/wang_yb/p/3899439.html,如需转载请自行联系原作者

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
阿里云服务器端口号设置
阿里云服务器初级使用者可能面临的问题之一. 使用tomcat或者其他服务器软件设置端口号后,比如 一些不是默认的, mysql的 3306, mssql的1433,有时候打不开网页, 原因是没有在ecs安全组去设置这个端口号. 解决: 点击ecs下网络和安全下的安全组 在弹出的安全组中,如果没有就新建安全组,然后点击配置规则 最后如上图点击添加...或快速创建.   have fun!  将编程看作是一门艺术,而不单单是个技术。
10528 0
使用OpenApi弹性释放和设置云服务器ECS释放
云服务器ECS的一个重要特性就是按需创建资源。您可以在业务高峰期按需弹性的自定义规则进行资源创建,在完成业务计算的时候释放资源。本篇将提供几个Tips帮助您更加容易和自动化的完成云服务器的释放和弹性设置。
11955 0
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,阿里云优惠总结大概有三种登录方式: 登录到ECS云服务器控制台 在ECS云服务器控制台用户可以更改密码、更换系.
12350 0
阿里云服务器安全组设置内网互通的方法
虽然0.0.0.0/0使用非常方便,但是发现很多同学使用它来做内网互通,这是有安全风险的,实例有可能会在经典网络被内网IP访问到。下面介绍一下四种安全的内网互联设置方法。 购买前请先:领取阿里云幸运券,有很多优惠,可到下文中领取。
11778 0
腾讯云服务器 设置ngxin + fastdfs +tomcat 开机自启动
在tomcat中新建一个可以启动的 .sh 脚本文件 /usr/local/tomcat7/bin/ export JAVA_HOME=/usr/local/java/jdk7 export PATH=$JAVA_HOME/bin/:$PATH export CLASSPATH=.
4575 0
如何设置阿里云服务器安全组?阿里云安全组规则详细解说
阿里云安全组设置详细图文教程(收藏起来) 阿里云服务器安全组设置规则分享,阿里云服务器安全组如何放行端口设置教程。阿里云会要求客户设置安全组,如果不设置,阿里云会指定默认的安全组。那么,这个安全组是什么呢?顾名思义,就是为了服务器安全设置的。安全组其实就是一个虚拟的防火墙,可以让用户从端口、IP的维度来筛选对应服务器的访问者,从而形成一个云上的安全域。
7348 0
+关注
3550
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载