zoukankan      html  css  js  c++  java
  • Linux 2.6.39.1 内核编译总结

    闲来无事,又开始学习linux设备驱动程序,以前本来就有一颗内核树,但是是2.6.31的,我下载了最新的2.6.39.1内核,进行了编译,建立了内核树,同时将默认启动的内核改成了最新的内核,通过uname -r命令可以查看,如下图所示:

    clip_image001

    现在把主要的过程记录如下,

    1、首先到www.kernel.org 下载最新版的内核,将内核解压到/usr/src目录下,使用命令tar jvxf linux-2.6.39.1.tar.bz2,如下图所示:

    clip_image002

    2、切换到linux-2.6.39.1目录中,执行sudo make menuconfig,对内核进行配置:

    如果没有menuconfig,执行下面的命令,下载相应的软件包:

    sudo apt-get install build-essential kernel-package libncurses5-dev

    clip_image003

    clip_image004

    clip_image005

    clip_image006

    注意,上图中的Linux-2.6.39.1是附加在2.6.39.1后面的,这样看起来就很难看,所以在文章开始的时候,用uname -r得到的是如下所示的结果:

    clip_image001[1]

    3、完成内核的配置后,在/usr/src/linux-2.6.39.1目录下执行,sudo make命令进行编译,经过漫长的等待

    编译完成。(如果在多核的机器上,可以使用make的多线程选项加快编译); 加速编译过程.

    (1) 可以使用 $ make -j<n> . 其中n = 2 * cpu的个数. 对于一般的单CPU系统, 通常用 $ make -j2 . 为编译过程分配2个人物, 这样在进行磁盘I/O时候, CPU就不会空闲了. 一般这个选项可以将速度提高10%左右.

    (2) 还可以使用ccache来提高编译速度. Debian/Ubuntu系统中默认没有安装, 首先安装它: $ sudo apt-get install ccache . 然后更改内核根目录的Makefile, 将CC和HOSTCC变量定义前添加ccache:

    CC               = $(CROSS_COMPILE)gcc

    HOSTCC     = gcc

    更改为:

    CC               = ccache $(CROSS_COMPILE)gcc

    HOSTCC     = ccache gcc

    http://hi.baidu.com/study_all_the_life/blog/item/a6bd6b0e863c66ed37d1223a.html

    4、安装编译模块:make modules_install (这一步要往根文件系统copy模块文件,如果要区分同一版本的内核的不同修改,应该在编译前配置内核General Setup中的LOCALVERSION 指定不同的名称,这样不同版本就会拷贝模块文件到不同的子目录下)。

    5、在当前系统中安装内核:make install (会把内核代码树中生成的内核镜像拷贝到系统/boot路径中,同时生成内核启动所需文件 ,但还没有更新grub引导文件)

    6、针对新内核生成initrd.img(什么是initrd.img?),使用命令: mkinitramfs -o /boot/initrd.img.XXX /lib/modules/2.6.16XXX   (-o后面的参数指定生成的文件,后面一个参数是模块安装的目录)。

    7、使用命令:sudo update-grub,这个工具会根据/boot目录中镜像的信息自带生成grub.cfg,路径为/boot/grub/grub.cfg,但是,这个工具生成的文件有bug,如下图所示:

    clip_image007

    默认生成的grub.cfg没有54、行和63行,需要手动添加。

    8、重新启动系统,发现成功的将新编译好的内核安装到了现有的系统当中。

    clip_image001[2]

  • 相关阅读:
    es组合多个条件进行查询
    Sidecar模式:下一代微服务架构的关键
    排查python内存泄露中几个工具的使用
    Consul的反熵
    我的Linux操作系统的发行版是什么?版本号是什么?
    如何确定一台linux主机是Linux (i386/i686)还是Linux (x86_64)
    如何确定Isilon cluster的网卡类型是40GbE的还是10GbE的
    如何确定Isilon里的磁盘是多大的?
    用SSH登录远程的机器,在远程机器上执行本地机器上的脚本
    关于EOF的使用的好文章
  • 原文地址:https://www.cnblogs.com/justinzhang/p/2109643.html
Copyright © 2011-2022 走看看