精简LINUX内核配置及快速编译的方法汇总

如果经常编译新内核(不管是什么目的),或者需要修改内核的某些代码做测试,虽然make会选择的编译有必要重新编译的部分,但是如果修改了某个核心的头文件。可能需要重新编译很多内容,所以把不需要使用的模块不编译是能节省不少时间的。
编译内核大部分时间都在编译模块上,比如我的机器:
find /lib/modules/2.6.37-rc5+/ -name “*.ko”|wc -l
2374
我的目标就是删除这些不用的模块, 不是显示的删除不用的模块,而是提取出需要的模块
如果系统连续运行足够长的时间,现在被加载的就是需要的,否则就不需要, 把该运行的程序运行一下就能做到,比如nf_nat,kvm_intel等。

通过这种方式,新内核至少会包含相应的模块,如果发现有遗漏(比如iptables提示找不到某个别的模块),再运行一次就能做到了
1. 首先通过/proc/modules得到所有的模块名
2. vi 编辑
%s/\n/|/g
去掉最后的|
%s/[-_]/[-_]/g
再加点东西, 转化为如下格式的modules.list
#!/bin/sh
egrep ‘=.*\<(ipt[-_]MASQUERADE|iptable[-_]nat|nf[-_]nat|nf[-_]conntrack[-_]ipv4|nf[-_]conntrack|nf[-_]defrag[-_]ipv4|ip[-_]tables|x[-_]tables|binfmt[-_]misc|rfcomm|sco|bridge|ppdev|stp|bnep|l2cap|nouveau|ttm|drm[-_]kms[-_]helper|drm|i2c[-_]algo[-_]bit|kvm[-_]intel|kvm|nfsd|exportfs|nfs|lockd|nfs[-_]acl|auth[-_]rpcgss|nls[-_]iso8859[-_]1|nls[-_]cp437|vfat|fat|sunrpc|snd[-_]hda[-_]codec[-_]analog|arc4|iwl3945|iwlcore|snd[-_]hda[-_]intel|snd[-_]hda[-_]codec|snd[-_]hwdep|snd[-_]pcm[-_]oss|snd[-_]mixer[-_]oss|mac80211|snd[-_]pcm|snd[-_]seq[-_]dummy|snd[-_]seq[-_]oss|snd[-_]seq[-_]midi|pcmcia|cfg80211|snd[-_]rawmidi|snd[-_]seq[-_]midi[-_]event|joydev|snd[-_]seq|btusb|uvcvideo|snd[-_]timer|bluetooth|snd[-_]seq[-_]device|lp|video|yenta[-_]socket|pcmcia[-_]rsrc|psmouse|tpm[-_]tis|videodev|intel[-_]agp|tpm|usbhid|thinkpad[-_]acpi|pcmcia[-_]core|tpm[-_]bios|nvram|hid|intel[-_]gtt|parport|v4l1[-_]compat|serio[-_]raw|snd|sdhci[-_]pci|sdhci|output|soundcore|snd[-_]page[-_]alloc|e1000e)\.o\>’
3. chmod +x modules.list
4. cd /lib/modules/`uname -r`/source
5. find . -name Makefile|xargs  cat |./modules.list  |egrep -o ‘CONFIG_[A-Za-z_0-9]*’|sort -u |sed -e ‘s/.*/&=m/’ >modules_used
6. cp .config config_new
7. vi config_new, %s/^CONFIG_.*=m$//
8 . cat modules_used >> config_new
config_new 就得到新的配置文件了。

我实验了一下, 编译时间从49下降到11分钟(real time)
find /lib/modules/2.6.37-rc6+/ -name “*.ko”|wc -l
128
一次之后,就可以在该配置文件基础上配置内核了

================================================================

如果你经常编译大型的C/C++工程,不使用ccache你就out了。

cache is a compiler cache. It speeds up recompilation by caching previous compilations and detecting when the same compilation is being done again. Supported languages are C, C++, Objective-C and Objective-C++.

Usage
使用ccache

  • 编译指令前增加ccache. $ ccache gcc xxx
  • 创建软链接。 $ ln -s ccache /usr/local/bin/gcc

建议使用第一种方式,因为ccache偶尔也犯晕,当由于它出现错误的时候, 很难看出端倪。曾在某次编译某份代码时,ccache对某个编译选项的判断失误导致编译失败,死活查不出来为什么原因。所以当出现某些怪异的现象时,请用正常的方式编译试试。

Example

  • 编译软件包
  1. [/tmp/bash-4.1 0]$ uname -a
  2. Linux AP 2.6.37-gentoo #1 SMP PREEMPT Sun Jan 16 14:55:15 CST 2011 i686 Intel(R) Core(TM)2 Duo CPU T8100 @ 2.10GHz GenuineIntel GNU/Linux
  3. [/tmp/bash-4.1 0]$ CC=”ccache gcc” ./configure
  4. [/tmp/bash-4.1 0]$ time make
  5. real 0m47.343s
  6. user 0m39.572s
  7. sys 0m3.244s
  8. [/tmp/bash-4.1 0]$ make clean
  9. [/tmp/bash-4.1 0]$ time make
  10. real 0m10.131s
  11. user 0m5.597s
  12. sys 0m1.077s

由上可以看出,使用ccache后, 编译速度快了5倍(中间很长一段时间不是gcc在编译,否则更快)。Wonderful..

  • 编译内核
  1. [/tmp/linux-2.6.34 0]$ uname -a
  2. Linux boeye-AP 2.6.37-gentoo #1 SMP PREEMPT Wed Jan 12 20:06:14 CST 2011 x86_64 AMD Athlon(tm) II X4 630 Processor AuthenticAMD GNU/Linux
  3. [/tmp/linux-2.6.34 0]$ grep “make” build
  4. 28:make -j4 ARCH=arm CROSS_COMPILE=”ccache arm-linux-” O=$outdir $@
  5. [/tmp/linux-2.6.34 0]$ time ./build
  6. real 3m4.146s
  7. user 10m30.640s
  8. sys 0m37.138s
  9. [/tmp/linux-2.6.34 0]$ ./build clean
  10. [/tmp/linux-2.6.34 0]$ time ./build
  11. real 0m23.714s
  12. user 0m31.603s
  13. sys 0m12.777s

在交叉编译内核时,编译速度也快了近9倍。

  • 编译Android

Android中,使用ccache,只需要添加环境变量’$ export USE_CCACHE=1′, 不同的是,默认它不用HOST的ccache程式,而使用自带的ccache. 编译android需要较大的缓冲区:

  1. $ ccache -M 3G    // 将缓冲区设置为3G

Conclude

看过以上三个例子,如果你仍没有使用ccache的欲望,欢迎告诉我理由:)

================================================================

Linux 内核编译 —— make localmodconfig 简化内核配置流程

简介:
前些天才知道, Linux 2.6.32 开始引入了一个 make localmodconfig 用于简化 kernel 的配置。
刚刚找了一下这个方面的资料,分享一下。

 

Most people uses the kernel shipped by distros – and that’s good. But some people like to compile their own kernels from kernel.org, or maybe they like following the Linux development and want to try it. Configuring your own kernel, however, has become a very difficult and tedious task – there’re too many options, and some times userspace software will stop working if you don’t enable some key option. You can use a standard distro .config file, but it takes too much time to compile all the options it enables.

 

To make the process of configuration easier, a new build target has been added: make localmodconfig. It runs “lsmod” to find all the modules loaded on the current running system. It will read all the Makefiles to map which CONFIG enables a module. It will read the Kconfig files to find the dependencies and selects that may be needed to support a CONFIG. Finally, it reads the .config file and removes any module “=m” that is not needed to enable the currently loaded modules. With this tool, you can strip a distro .config of all the unuseful drivers that are not needed in our machine, and it will take much less time to build the kernel. There’s an additional “make localyesconfig” target, in case you don’t want to use modules and/or initrds.

以上内容摘自:Kernel Newbies
大概意思是说, make localmodconfig 会执行 lsmod 命令查看当前系统中加载了哪些模块 (Modules), 并最后将原来的 .config 中不需要的模块去掉,仅保留前面 lsmod 出来的这些模块,从而简化了内核的配置过程。

这样做确实方便了很多,但是也有个缺点:该方法仅能使编译出的内核支持当前内核已经加载的模块。因为该方法使用的是 lsmod 的结果,如果有的模块当前没有加载,那么就不会编到新的内核中。
例 如,我有的时候需要制作 squashfs , 因此在当前的内核中,将 squashfs 编译成了模块。 当使用 make localmodconfig 来配置 Kernel 的时候,如果当前系统中没有加载这个模块, 那么新编出来的内核中就不会将 squashfs 编译成模块,在新的内核中就没办法使用这个模块了。

所以建议在使用 make localmodconfig 之前,首先折腾一下系统,插个优盘,开开摄像头之类, 以便让内核加载上平时使用时候所需要的模块;执行 make localmodconfig 之后,再执行一下 make menuconfig 来手动检查一下, 是否还有其他模块需要手动选择。

这样,内核的编译可以分成如下几个步骤来进行:

  1. 下载解压内核源码:
    http://www.kernel.org, 不必多言。 下载之后解压到自己的目录,例如 /usr/src/linux-2.6.35/ , 后文中将以 $SRC 代表这个目录。
  2. 找一个现成的 kconfig 文件作为模版:
    可以从自己的 Linux 发行版中拷贝一个出来,拷贝到为 $SRC/中, 并重命名为.config 。
  3. 折腾一下系统,让它将合适的 module 都加载上。
  4. 执行 make localmodconfig 精减不需要的模块。
  5. 执行 make menuconfig ,检查一下是否有自己需要的模块没有选上。
  6. 执行 make 进行编译
  7. 执行 make modules_install 安装模块
  8. 执行 make install 安装内核
  9. 编辑 /boot/grub/grub.conf 或者 /boot/grub/menu.lst 添加新的引导菜单。
  10. 重启并以新的内核启动。

OK, that’s all.

================================================================

今天仔细看了看文档 居然发现这个好东西 建议大家试试.
介绍 http://kernelnewbies.org/Linux_2_6_32#head-11f54cdac41ad6150ef817fd68597554d9d05a5f

1.8. Easy local kernel configuration

 

Most people uses the kernel shipped by distros – and that’s good. But some people like to compile their own kernels from kernel.org, or maybe they like following the Linux development and want to try it. Configuring your own kernel, however, has become a very difficult and tedious task – there’re too many options, and some times userspace software will stop working if you don’t enable some key option. You can use a standard distro .config file, but it takes too much time to compile all the options it enables.

 

To make the process of configuration easier, a new build target has been added: make localmodconfig. It runs “lsmod” to find all the modules loaded on the current running system. It will read all the Makefiles to map which CONFIG enables a module. It will read the Kconfig files to find the dependencies and selects that may be needed to support a CONFIG. Finally, it reads the .config file and removes any module “=m” that is not needed to enable the currently loaded modules. With this tool, you can strip a distro .config of all the unuseful drivers that are not needed in our machine, and it will take much less time to build the kernel. There’s an additional “make localyesconfig” target, in case you don’t want to use modules and/or initrds.

使用lsmod分析当前的系统加载了哪些模块,把没有加载的模块都去掉。

from http://www.cnmaizi.com/tech/elebuild/simplify-linux-kernel-config-rapid-compile-method-collect/

发表评论?

0 条评论。

发表评论