make localmodconfig 快速编译内核以及编译内核的几个基本步骤

make localmodconfig 快速编译内核

这个是前日编译内核时无意中看到的别人的帖子 试了下还可以 贴出来大家共享
***********************************************************************************
Linux 2.6.32 开始引入了一个 make localmodconfig 用于简化 kernel 的配置。

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.38.2/ 
   2  找一个现成的 .config 文件作为模版:
      可以从自己的 Linux 发行版中拷贝一个出来,拷贝到为/usr/src/linux-2.6.38.2/ 中
   3  折腾一下系统,让它将合适的 module 都加载上。
   4  执行 make localmodconfig 精减不需要的模块。
   5  执行 make menuconfig ,检查一下是否有自己需要的模块没有选上。
   6  执行 make 进行编译
   7  执行 make modules_install 安装模块
   8 depmod -a 设置模块的连接
   9  cp System.map /boot/System.map-xxxx  (xxxx为版本号)
  10  cp arch/i386/boot/bzImage /boot/vmlinuxz   (X64的在arch/x86_64/boot )
  11 cd /boot/
new-kernel-pkg --mkinitrd --depmod --install 2.6.38.2 必须与/lib/modules/目录下相应的文件夹同名
ubuntu:       mkinitramfs -k -o /boot/initrd-2.6.38.2.img 2.6.38.2 
  12 执行 make install 安装内核 (在/usr/src/新内核文件夹 原make目录中执行安装)
  13  编辑 /boot/grub/grub.conf 或者 /boot/grub/menu.lst 添加新的引导菜单。(最简单的把原引导项修改版本号即可)
  14 重启并以新的内核启动。

没有评论: