《Linux内核精髓:精通Linux内核必会的75个绝技》一HACK #6 使用localmodconfig缩短编译时间
HACK #6 使用localmodconfig缩短编译时间
本节介绍使用make localmodconfig生成精简的.config文件,缩短内核编译时间的方法。
为了能够应对各种各样的环境,发布版的内核包含很多内核模块。但是在某个特定机器,例如,大家自己平时使用的PC上实际用到的模块只是其中的极小一部分。重新构建内核时,对不使用的模块进行编译就会浪费时间。编译后的模块存放在磁盘里,因此也会造成磁盘空间的浪费。
将localmodconfig作为make的目标,就可以生成仅以正在使用的内核模块为对象的.config文件,可以在Linux内核2.6.32以后的版本中使用它。使用这条命令,可以生成仅启用必要模块的.config文件,从而缩短内核的编译时间。
localmodconfig的使用方法
将运行中的内核源代码解压缩,并在源码树的根下执行下列命令。
# make localmodconfig
如果是一般的发布版,只需进行这一操作就可以生成.config文件,将要编译的内核模块缩减到最少。此后只需执行下列命令,照常进行内核的编译、安装。
# make
# make modules_install
# make install
localmodconfig的效果
使用两种.config文件对上游内核(Linux 2.6.34)进行了编译,并记录分别花费的时间。
第一次是使用Fedora13的默认内核.config文件对Linux 2.6.34进行了编译,将其记为“2.6.34-fc13”。第二次使用的是在2.6.34-fc13的.config文件的基础上使用localmodconfig生成的.config文件,编译后的文件记为“2.6.34-localmod”。两次花费的编译时间如下所示。
2.6.34-fc13:26分13秒
2.6.34-localmod:8分20秒
通过使用localmodconfig生成的.config文件,将编译时间缩短到了1/3以内。
另外,还对内核模块的数量以及它们所在目录的总容量进行了比较。
# du -sh /lib/modules/2.6.34-fc13/kernel/
75M /lib/modules/2.6.34-fc13/kernel
# find /lib/modules/2.6.34-fc13/kernel -name '*.ko' | wc -l
2046
# du -sh /lib/modules/2.6.34-localmod/kernel/
9.2M /lib/modules/2.6.34-localmod/kernel/
# find /lib/modules/2.6.34-fc13-localmod1/kernel -name '*.ko' | wc -l
138
localmodconfig使内核模块的数量减少到约1/15,占用的磁盘空间也减少到约1/8。
localmodconfig的结构
localmodconfig是通过内核源码树的下列脚本执行的。
scripts/kconfig/streamline_config.pl
localmodconfig首先会尝试提取一套配置选项作为模型。使用的模型为源码树的.config文件或者/boot下正在运行的内核的.config文件(/boot/config-<内核版本>)。当这些不存在时,将从正在运行的内核映像(/boot/vmlinuz-<内核版本>)、保存了设置信息的内核模块(configs.ko)等提取信息。
另外,要从内核映像或configs.ko提取出配置选项的信息,内核必须是在指定CONFIG_IKCONFIG选项的情况下编译的。当无法提取用做模型的配置选项时,即,找不到.config文件,且正在运行的内核是在未指定CONFIG_IKCONFIG选项的情况下编译的,就会导致localmodconfig失败。
然后,localmodconfig通过lsmod获取当前安装到内核中的内核模块列表,找出对它们进行编译所需的配置选项并记录下来。
最后,localmodconfig将模型的配置选项中指定要作为内核模块进行编译的部分(CONFIG_*=m)进行如下修改,并输出为.config文件。
当前安装到内核的内核模块所需要的选项:不修改
此外:改为禁用
模型中指定要静态安装到内核的选项(CONFIG_=y)、设置为禁用的选项(# CONFIG_ is not set)不进行修改,直接输出。
小贴士:通过把作为模型的配置选项指定到模块中,却未安装到内核的内核模块中,导致其配置选项失效,无法编译。因此,在执行localmodconfig命令之前,可以将需要编译的内核模块手动安装到内核中。例如,可以使用下列命令,将用来虚拟化的模块kvm.ko安装到内核中。
# modprobe kvm
当然,localmodconfig生成了.config文件后,也可以使用make menuconfig等手动对.config文件进行修改。
localyesconfig
localyesconfig是与localmodconfig相似的make目标。使用这条命令,通过localmodconfig设置为内核模块的配置选项,将设置为在无提示的情况下安装到内核中。
在编写不使用initramfs启动的内核时localyesconfig非常方便。
小结
对于不是很清楚的配置选项,应当先启用,以避免出现内核无法启动的情况。相信凡是自己构建(make)过内核的人对这一点都深有体会。如果使用localmodconfig就不再需要担心这个问题。localmodconfig既能够节约详细检查config选项的时间,又能缩短编译所花费的时间,为我们提供了强有力的支持。
—Munehiro IKEDA
《Linux内核精髓:精通Linux内核必会的75个绝技》一HACK #6 使用localmodconfig缩短编译时间的更多相关文章
- 《Linux内核精髓:精通Linux内核必会的75个绝技》目录
1章 内核入门HACK #1 如何获取Linux内核HACK #2 如何编译Linux内核HACK #3 如何编写内核模块HACK #4 如何使用GitHACK #5 使用checkpatch.pl检 ...
- 《Linux内核精髓:精通Linux内核必会的75个绝技》一HACK #2 如何编译Linux内核
HACK #2 如何编译Linux内核 本节介绍编译Linux内核的方法.当发现bug而修改源代码或者添加新功能时,就需要对内核进行重新编译,生成二进制映像文件.另外,如果想要使用发布版内核中无效的功 ...
- 《Linux内核精髓:精通Linux内核必会的75个绝技》一HACK #1 如何获取Linux内核
HACK #1 如何获取Linux内核 本节介绍获取Linux内核源代码的各种方法.“获取内核”这个说法看似简单,其实Linux内核有很多种衍生版本.要找出自己想要的源代码到底是哪一个,必须首先理解各 ...
- 《Linux内核精髓:精通Linux内核必会的75个绝技》一HACK #15 ramzswap
HACK #15 ramzswap 本节介绍将一部分内存作为交换设备使用的ramzswap.ramzswap是将一部分内存空间作为交换设备使用的基于RAM的块设备.对要换出(swapout)的页面进行 ...
- 《Linux内核精髓:精通Linux内核必会的75个绝技》一HACK #11cpuset
HACK #11cpuset 本节介绍控制物理CPU分配的cpuset.cpuset是Linux控制组(Cgroup)之一,其功能是指定特定进程或线程所使用的CPU组.另外,除CPU以外,同样还能指定 ...
- 《Linux内核精髓:精通Linux内核必会的75个绝技》一HACK #3 如何编写内核模块
HACK #3 如何编写内核模块 本节将介绍向Linux内核中动态添加功能的结构—内核模块的编写方法.内核模块Linux内核是单内核(monolithic kernel),也就是所有的内核功能都集成在 ...
- 《Linux内核精髓:精通Linux内核必会的75个绝技》一HACK #21FUSE
HACK #21FUSE 本节将介绍使用用户进程的文件系统框架—FUSE.FUSE概要FUSE(Filesystem in Userspace,用户空间文件系统),是用来生成用户空间的一般进程的框架. ...
- 《Linux内核精髓:精通Linux内核必会的75个绝技》一HACK #20 使用fio进行I/O的基准测试
HACK #20 使用fio进行I/O的基准测试 本节介绍使用fio进行模拟各种情况的I/O基准测试的操作方法.I/O的基准测试中有无数需要考虑的因素.是I/O依次访问还是随机访问?是通过read/w ...
- 《Linux内核精髓:精通Linux内核必会的75个绝技》一HACK #17 如何使用ext4
HACK #17 如何使用ext4 本节介绍ext4的编写和挂载方法.开发版ext4的使用方法.ext4是ext3的后续文件系统,从Linux 2.6.19开始使用.现在主要的发布版中多数都是采用ex ...
随机推荐
- [osgearth]Earth文件详解
<!—type 属性可以是geocentric和projected两种模式,分别对应地心坐标系和平面投影坐标系,默认是地心坐标模式.Version是osgEarth的主版本号,必须有版本号--& ...
- RabbitMQ入门_02_HelloWorld
A. AMQP基础 RabbitMQ 并不是基于 Java 开发人员熟悉的 JMS 规范设计开发的,而是基于一个比 JMS 更新更合理的 AMQP (Advanced Message Queuing ...
- Android之第三方平台实现QQ登录和QQ分享
目前大多数APP都包含了第三方平台的登录,特别是QQ和微信,这篇博客主要讲的是如何实现QQ第三方平台实现QQ登录和分享功能,功能包含: 登录授权登录获取用户信息(昵称,头像,地址等) QQ分享给好友 ...
- How to have matlab tic toc in C++?
Reprinted form: https://stackoverflow.com/questions/13485266/how-to-have-matlab-tic-toc-in-c/1348558 ...
- 牛客网——A找一找
链接:https://www.nowcoder.net/acm/contest/71/A来源:牛客网 题目描述 给定n个正整数,请找出其中有多少个数x满足:在这n个数中存在数y=kx,其中k为大于1的 ...
- Asp.Net使用org.in2bits.MyXls.dll操作excel的应用
首先下载org.in2bits.MyXls.dll(自己的在~\About ASP.Net\Asp.Net操作excel) 添加命名空间: using org.in2bits.MyXls;using ...
- Class.getResource()方法的使用
我们之前使用路径总是有点不知道怎么用,发现别人使用Class.getResource()方法,好像挺不错的样子.于是看看博客,简单学习下. 参考链接:http://blog.csdn.net/lcj8 ...
- Internet Explorer 11.0.9600.16428 For Windows 7
官方消息http://blogs.msdn.com/b/ie/archive/2013/11/07/ie11-for-windows-7-globally-available-for-consumer ...
- L187 DKK2
Why can millions of hairs grow from our heads, and yet our palms手掌 and the soles of our feet are as ...
- yaf路由配置规则
使用框架的默认路由来访问的时候,会遇到一些困扰,这部分无法查看源代码,只能通过猜测来分析. 如果项目有多个模块,显然使用yaf的默认的静态路由是无法满足需求的. yaf默认的配置是着这样的: appl ...