• 2.6.32内核 模块 编译。。


    环境:Fedora 12
    内核linux-2.6.32.2

    (为什么选择Fedora 12,因为12是偶数看起来舒服,且是最新版;同理选择了linux-2.6.32.2,虽然有最新版2.6.33,但不是偶数,不爽!)

    STEP 1:http://www.cnblogs.com/ai616818/admin/ftp://ftp.kernel.org/pub/linux/kernel/v2.6/ ,下载[url=/pub/linux/kernel/v2.6/linux-2.6.32.2.tar.gz]linux- 2.6.32.2.tar.gz[/url]
       
    STEP 2: 把[url=/pub/linux/kernel/v2.6/linux-2.6.32.2.tar.gz]linux-2.6.32.2.tar.gz[/url]复制到 /usr/src/kernels/ (当然其他任何目录都可以的)
          

           cp linux-2.6.32.2.tar.gz /usr/src/kernels/


    STEP 3: 解压

           tar -xzf linux-2.6.32.2.tar.gz


    STEP 4: 进入linux-2.6.32.2

           cd linux-2.6.32.2


    STEP 5: 配置。如果以前编译过,那么用make mrproper删除以前垃圾文件。用make menuconfig启动配置的图形界面。因为配置选项很多,短时间根本搞不懂哪些选项是必须的,哪些是可以不要的,所以,最佳的办法是在一个已经存在的配置文件上面修改。很显然,Fedora 12 就有现成的一个。把 /boot目录里面 config-2.6.31.5-127.fc12.i686.PAE复制到/usr/src/kernels/linux-2.6.32.2里面并命名为.config。当执行make menuconfig时,首先寻找.config,如果找到就读取。否则进入arch目录里面寻找相应体系结构默认的配置文件。

          cp /boot/config-2.6.31.5-127.fc12.i686.PAE /usr/src/kernels/linux-2.6.32.2/.config

          make menuconfig


    STEP 6: 编译。2.6.32已经是非常高的版本了,所以执行make all,就相当于:make dep建立相依的属性关系),make clean(将旧的资料去除掉),make bzImage开始编译核心),make modules开始编译模块)

          make all


    STEP 7:安装模块。安装模块到/lib/modules/,以后程序运行时从这个目录加载模块。

          make modules_install


    STEP 8: 安装内核。把make all 生成的vmlinuzSystem.map复制到/boot目录下同时修改grub /boot/grub/menu.lst. 修改menu.lst是自动完成的哦!!不用手动修改。

          make install


    STEP 9: 重启Fedora。选择linux-2.6.32.2启动。当白色的进度条显示满了后,多等会。


    附一:我遇到的问题

    1. 在make install时报错,提示我没有 mkinitrd这个命令。我到/sbin/里面找确实没有啊。然后我到网上下了一个mkinitrd的软件包安装,安装时又出错,提示与系统的什么包相冲突。我在网上问了哈高手,然后通过Fedora 的包管理机制,添加了mkinitrd.总算是成功了。弄了很久。

    2. 编译了内核启动时,白色的显示条显示满了后,要等一段时间。刚开始,我试了很多次,改了很多东西,每次白色条显示满了,我等了几秒,没反应,就错误地以为我编译的内核不成功。当我弄烦了后,干脆不理它,我搞点其他的,等回到虚拟机时,居然启动了。一阵狂喜啊!


    附二感谢
    感谢网上的高手给我提示,以后只要我知道我也会毫不吝惜地帮助别人;
    感谢chinaunix里面牛人写的博客,(在参考博客里面),写得非常之好,仰慕,学习。



    参考博客
    http://linux.chinaunix.net/ebook/doc/2009/12/07/1147818.shtml
    Fedora下内核编译 [第十五期]

    http://linux.chinaunix.net/techdoc/develop/2008/12/22/1054372.shtml

    编译内核步骤详解

    http://linux.chinaunix.net/techdoc/system/2008/11/08/1044037.shtml

     

     

     编译 Linux2.6 内核总结

     基础知识
    在介绍如何编译内核之前, 需要对内核相关概念有一定的了解. 关于Linux kernel的介绍浩如烟海, 这里只介绍系统中相关的目录, 文件及命令.
    /boot
    /boot/vmlinuz-        : 用于启动的压缩内核镜像, 它也就是/arch//boot中的压缩镜像.
    /boot/system.map-  : 存储内核符号地址.
    /boot/initrd.img-     : 初始化RAM硬盘时, 用来存储挂载根文件系统所需的模块.
    /boot/grub/menu.lst                : grub的配置文件. (不同的发行版中它可能位于不同位置.
    /lib/modules
    该目录包含了内核模块及其他文件. 注意, modules中一般会有多个目录: 系统自带的内核模块在这里, 你编译自己的内核模块后, 它们也会被安装到这里. 不同的目录由内核版本号来区分. 即modules里目录的名称是内核版本号. (使用$ uname -r 可知当前系统内核所用的模块位于哪个目录).
    /lib/modules//build
    储存为该版本的内核编译新模块所需的文件. 包括Makefile, .config, module.symVers(模块符号信息), 内核头文件(位于include/, include/asm/中)
    /lib/modules//kernel
    储存内核目标文件(以.ko为后缀). 它的目录组织和内核源代码中kernel的目录组织相同.
    /lib/modules//中:
    modules.alias       : 模块别名定义. 模块加载工具使用它来加载相应的模块.
    modules.dep        : 定义了模块间的依赖关系.
    modules.symbols : 指定符号属于哪个模块.
    这些文件都是文本文件, 可以查看它们.
    $ uname -r
    uname(1)被用来查看系统信息, 这里对我们有用的是它的"-r"选项, 它显示内核版本信息.
    下载内核, 验证签名, 解压缩

    http://www.kernel.org/pub/linux/kernel/
    下载最新版本的2.6内核. 速度还比较快. 这里以linux-2.6.17.13为例:
    1, 下载内核压缩包
    bzip2格式比gzip压缩效率更高, 一般就下载bz2的压缩包. 下载了内核压缩包之后, 还可下载对应的sign文件. 它被用来验证内核压缩文档的openPGP签名. 详细信息可参考
    这里
    .
    $ wget -c http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.17.13.tar.bz2
    $ wget -c http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.17.13.tar.bz2.sign
    2, 验证签名
    首先从pgp的服务器获取签名公匙, linux内核包的公匙编号是0x517D0F0E. 再利用sign文件来验证.bz2压缩包的签名.  如果输出中有类似gpg: Good signature from "Linux
    Kernel Archives Verification Key " 的内容,
    说明该包是有效的. 后面给出的警告信息可以忽略.
    $ gpg --keyserver wwwkeys.pgp.net --recv-keys 0x517D0F0E
    $ gpg --verify linux-2.6.17.13.tar.bz2.sign linux-2.6.17.13.tar.bz2
    GPG签名只是保证镜像网站提供的压缩包和kernel.org所提供的是相同的, 如果你在kernel.org下载, 不需要验证签名.
    3, 解压缩
    解压缩之前, 有个问题值得思考: 要将压缩包解压到何处? 即要在哪个目录进行Linux内核源代码的编译?
    内核源码树的
    README
    中有这样一段话:
    Do NOT use the /usr/src/linux area! This area has a
    (usually incomplete) set of kernel headers that are used by the library
    header files.  They should match the library, and not get messed
    up by whatever the kernel-du-jour happens to be.

    际上, 在我的Ubuntu系统中, /usr/src/ 目录中最初是没有linux目录的. 你可以在/usr/src中新建一个目录,
    用内核版本命名, 比如/usr/src/linux-2.6.17.13. 这样, 即便之前在/usr/src中安装了linux的头文件,
    也不会对它们造成影响.
    我采用的方法是: 在/usr/local/src/kernel目录中进行.
    编译内核时候, 若在make 后添加 "O="将会使生成的目标文件(包括.config)被放置到指定的目录. 否则, 生成的目标文件默认地被放到内核源码目录. 我们就采用默认的方法. 这是安全的.
    4, 打补丁
    对于kernel.org中的内核, 我个人认为没必要下载patch, 再打补丁. 费那事干嘛, 直接下载bz2包不就行了. 特定的补丁只能针对紧随其前的一个版本. 比如你想从2.6.17.1升级到2.6.17.13. 你得打12次补丁, 忒麻烦了.

    是, 有时候需要对"官方内核"添加补丁, 以支持特定的系统. 比如ARMLinux, 它往往不是发布完整的内核,
    而是发布针对特定版本的补丁包. 这种情况下就要知道如何打补丁了. 方法很简单: 把补丁下载, 解压.
    得到patch-. 将它放到解压后的内核目录树的父目录中(也就是补丁和内核目录在同一目录). 然后cd到内核目录树中运行:
    $ patch -p1
    配置内核
    1, 前提: 构建编译环境
    显然, 需要make, gcc等工具, 在Ubuntu中, 只需一条简单命令就可安装所有的源代码编译工具:
    # apt-get install build-essential
    当然, 如果你的内核是要安装到不同体系结构的目标系统中, 还需要构建cross编译环境.
    2, 内核配置工具介绍
    Linux提供了多种内核配置工具, 最基础的是 make config, 它列出每个编译选项, 而且是基于文本的, 一般不用它.
    menuconfig (make menuconfig)
    menuconfig是比较主流的配置工具, 它需要curse库的支持, 在Ubuntu中默认是没有的, 先安装它:
    # apt-get install libncurses5-dev
    xconfig (make xconfig)
    xconfig基于X11, 使用qt库, 在Ubuntu中先安装qt库:
    # apt-get install libqt3-headers libqt3-mt-dev
    3, 内核配置相关
    .config配置文件
    在内核树的根目录中,有一个.config文件,它记录了内核的配置选项,可直接对它进行修改,再运行(若.config不存在,对内核进行配置后会生成它,这种情况下当然不能开始就运行oldconfig). 实际上, 如果你手头有合适的 .config 文件, 可以运行 make oldconfig  直接按 .config 的内容来配置
    $ sudo make oldconfig
    对内核的配置都是围绕 .config 来展开的.  即便开始 .config 文件不存在, 进行配置后会创造它.
    其实可以直接在menuconfig中加载已有的配置文件, 不要将它改名为.config. 否则完成配置, 退出menuconfig时会提示你运行 make mrproper. 上面提到的方法只是比较适合于oldconfig!
    make相关命令
    $ make oldconfig    : 基于已有的.config进行配置, 若有新的符号, 它将询问用户.
    $ make defconfig    : 按默认选项对内核进行配置(386的默认配置是Linus做的).$ make allnoconfig : 除必须的选项外, 其它选项一律不选. (常用于嵌入式系统).
    $ make clean        : 删除生成的目标文件, 往往用它来实现对驱动的重新编译.
    $ make mrproper : 删除包括.config在内的生成的目标文件.
    可以查看内核源码树中的README和Makefile了解上述配置方法.
    4, 开始配置
    1, 修改Makefile (可选)
    在Makefile中, 有这样的内容:
    VERSION = 2PATCHLEVEL = 6SUBLEVEL = 16EXTRAVERSION = .20NAME=Sliding Snow Leopard
    我们在编译内核之前, 可以先修改Makefile中的版本信息(一般是修改EXTRAVERSION, 比如EXTRAVERSION =-zp). 这样就能将自己编译的内核同别人编译的相同版本内核区分开来. 修改, 编译之后, 可使用 $ uname -r 查看内核版本信息.
    但实际上, 从2.6.8的版本起可在内核版本号后面添加个性化字符串. 所以也就没有必要修改Makefile了: ()  Local version - append to kernel release
    如果你即修改了Makefile中的EXTRAVERSION, 又在配置时定义了local version. 那么local version所定义的字符串将位于末尾, 紧跟在EXTRAVERSION的值之后.
    另外, 如果要用到ccache, 也需要修改Makefile. 参考后面的内容!
    2, 准备一个.config文件.
    内核配置选项众多, 一个个去配置相当麻烦. 建议使用手头已有的配置文件. 如果你手头没有,  有多种方法获得它:
    (1) 使用make defconfig将在源码树的根目录得到.config.
    (2) 使用当前系统内核的配置文件, 一般位于/boot目录中. 它的名称并不是.config.
    (3) 使用别的发行版提供的配置文件(网上去下载).
    slackware的.config是个不错的起点. 在它的配置文件基础上作出适合自己系统的修改, 比较方便.  也可以拷贝发行版提供商的.config文件.
    3, 建议配置步骤:
    (1) 将配置文件(不要将它命名为.config!)拷贝到内核源码树根目录.
    (2) make menuconfig, 然后将上述的配置文件加载进去.
    (3) 配置完成后, 将生成的配置文件备份(.config, 也可以在menuconfig中指定生成的配置文件名).
    配置选项是最头疼的问题: 配置时候注意驱动的问题,
    尤其是网络驱动. 使用 pppoe 的话, 要选上 ppp 相关的选项. 网卡驱动也要注意, 我刚开始配置的时候, 只加上了 lspci |
    grep Ethernet 对应的网卡, 但是重启后找不到eth0, 一怒之下, 把所有的1000M 网卡驱动都选为模块. 总算成功.
    以后有空仔细看看. 再就是声卡驱动也要注意.可参考我blog里另一篇文章:
    配置2.6内核选项注解
    也可以到
    Linux Kernel Configuration Archive
    看一看, 虽然它里面的内容与图形化配置工具中的help大同小异.
    编译内核
    配置完成后,就要进行编译了。编译2.6的内核很简单,Makefile自动检测依赖性,产生编译文件(bzImage),你也不用另外编译modules!. 只需运行:
    $ make

    使用make编译内核的技巧      
    1, 可以略去编译信息(但仍能看到warning, error)
    $sudo make > /dev/null
    $sudo make -j2 > /dev/null
    2, 加速编译过程.
    (1)
    可以使用 $ make -j . 其中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)gccHOSTCC      = gcc
    更改为:
    CC               = ccache $(CROSS_COMPILE)gcc
    HOSTCC      = ccache gcc
    编译生成的文件介绍
    vmlinux   :  未经压缩的原始linux内核镜像.
    /arch//boot/zImage(bzImage):  使用zlib压缩后的内核镜像.
    注意, 不同的体系结构对压缩后内核镜像的默认命名不同, 比如arm的是zImage, 而i386的是bzImage. (z表示zlib, bz表示"big zlib", 而非bzip2!)
    安装内核
    编译完成后, 在 arch/i386/boot目录中会有bzImage映象文件.
    安装内核步骤如下:
    (1)在/boot目录下新建mynewkernel目录,并将bzImage拷贝到/boot/mynewkernel目录下:
    $ sudo cp arch/i386/boot/bzImage /boot/mynewkernel
    (2)更改/boot/mynewkernel中bzImage的名字
    $ sudo mv bzImage vmlinuz-2.6.17.13
    (3)备份、修改grub配置文件
    $sudo cp /boot/grub/menu.lst menu.lst.origin
    修改menu.list,加入以下内容(从既有的menu.list中相关的内容拷贝):
    title        zp, make defconfig, 2.6.17.13
    root        (hd0,2)
    kernel        /boot/mynewkernel/vmlinuz-2.6.17.13 root=/dev/sda3 ro quiet splash
    savedefault
    boot
    (4)安装模块:
    $sudo make modules_install
    reboot, 在grub启动菜单中选择新内核启动...

    Fedora下内核编译 [第十五期]

    第一步:去官方下载最新的内核源码包
    官方网址:www.kernel.org
    当前最新版本:2.6.31,下载网址:http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.31.tar.bz2
    您可以使用 wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.31.tar.bz2下载
    第二步:解压源码包(这里有些人说要将源码解压到/usr/src目录下,其实是不正确的,你可以解
    压到任何目录)
    cd ~
    wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.31.tar.bz2
    tar -jxvf linux-2.6.31.tar.bz2

    第三步:配置选项
    cd linux-2.6.31
    cp /boot/config-`uname -r` .config
    make mrproper (
    删除上次编译产生的垃圾,初次编译不需要)
    make menuconfig (
    启动内核选项配置界面)
    说明一下,make menuconfig会寻找linux-2.6.31目录下的.config配置文件,如果找不到,则使用与
    CPU
    相关的config文件作为默认的配置。当然,我们也可以拷贝当前系统的配置作为对照,如
    cp /boot/config-`uname -r` .config (.config
    是隐藏文件 ls -a查看)
    注意:如果是同版本的内核编译,还需要备份下当前模块
    cd /lib/modules
    mv 2.6.31 2.6.31_old

    指定内核识别码
    vim Makefile
    EXTRAVERSION = .custom-1 (
    4)
    第四步(1)传统方式编译
    make all (2.6
    以前版本需要手工运行如下命令)
    (
    # make dep
          <==建立相依的属性关系!
    # make clean
           <==将旧的资料去除掉!
    # make bzImage
          <==开始编译核心!这个核心是经过压缩的 (30分钟左右)
    # make modules
          <==开始编译模块!这个动作视您刚刚编译的模块数量!(1小时左右)
    )
    make modules_install (
    安装模块到/lib/modules/2.6.31)
    make install (
    系统将会把vmlinuzSystem.map复制到/boot目录下同时修改grub /boot/grub/menu.lst2.6以前版本需要手动拷贝vmlinuzSystem.map)
    第四步(2)RPM方式编译,会产生RPM包,方便提供给别人使用
    make rpm
    编译完成之后,在~/rpmbuild /SRPMS/目录发现一个新的src.rpm, 比如. SRPMS/kernel-2.6.31.custom-1.src.rpm, 内核rpm包位于~/rpmbuild/RPMS/i386/ (RPMS/i586/, RPMS/i686/, . 看你的平台类型). 比如. RPMS/i386/kernel-2.6.31.custom-1.i386.rpm. 可以看到内核识别码已添加到软件包的名字中.
    安装新内核
    现在去新的rpm内核包存在的目录(基于你的平台类型, 比如. ~/rpmbuild/RPMS/i386/)安装rpm
    cd ~/rpmbuild/RPMS/i386
    rpm -ivh kernel-2.6.31.custom-1.i386.rpm

    (现在你甚至能够拷贝到其它的Fedora系统, 通过上面的方式安装. 你将不再需要编译内核.)
    接下来我们为新内核创建一个ramdisk, 否则系统将不能引导新内核:
    mkinitrd /boot/initrd-2.6.31.custom-1.img 2.6.31.custom-1

    然后编辑/boot/grub/menu.lst文件, 看一下你系统上已经存在(正在工作的)引导内核信息, 拷贝其中的一个实例, 替换为你新的内核和ramdisk:
    vim /boot/grub/menu.lst

    比如, 我的menu.lst, 在我添加新的内核信息前的情况:
    # grub.conf generated by anaconda
    #
    # Note that you do not have to rerun grub after making changes to this file
    # NOTICE: You have a /boot partition. This means that
    # all kernel and initrd paths are relative to /boot/, eg.
    # root (hd0,0)
    # kernel /vmlinuz-version ro root=/dev/VolGroup00/LogVol00
    # initrd /initrd-version.img
    #boot=/dev/sda
    default=0
    timeout=5
    splashimage=(hd0,0)/grub/splash.xpm.gz
    hiddenmenu

    title Fedora Core (2.6.18-1.2798.fc6)
    root (hd0,0)
    kernel /vmlinuz-2.6.18-1.2798.fc6 ro root=/dev/VolGroup00/LogVol00
    initrd /initrd-2.6.18-1.2798.fc6.img

    修改后的情况:
    # grub.conf generated by anaconda
    #
    # Note that you do not have to rerun grub after making changes to this file
    # NOTICE: You have a /boot partition. This means that
    # all kernel and initrd paths are relative to /boot/, eg.
    # root (hd0,0)
    # kernel /vmlinuz-version ro root=/dev/VolGroup00/LogVol00
    # initrd /initrd-version.img
    #boot=/dev/sda
    default=0
    timeout=5
    splashimage=(hd0,0)/grub/splash.xpm.gz
    hiddenmenu

    title Fedora Core (2.6.18-custom-2.6.18.2)
    root (hd0,0)
    kernel /vmlinuz-2.6.18-custom-2.6.18.2 ro root=/dev/VolGroup00/LogVol00
    initrd /initrd-2.6.18-custom-2.6.18.2.img

    title Fedora Core (2.6.31.custom-1)
    root (hd0,0)
    kernel /vmlinuz-2.6.31.custom-1 ro root=/dev/VolGroup00/LogVol00
    initrd /initrd-2.6.31.custom-1.img

    (你可以通过下面命令发现正确的vmlinuzinitrd文件:
    ls -l /boot
    )

    第五步:重启系统,在Grub引导菜单中,选择linux-2.6.31.custom-1
    Reboot
    ,重启之后,大功告成,你的新内核已经安装好了


     

  • 相关阅读:
    【转】Android 6.0 Marsmallow BLE : Connection Parameters
    过滤掉字符串中重复的字符
    从第一个汉字开始分割字符串
    根据年月生成日历函数
    计算两个日期之间的工作日
    根据日期返回星座
    检查给定串是否存在于由区间及点集的结合内
    将整型数字转换为大写汉字
    向左填充指定字符串
    人民币小写金额转大写
  • 原文地址:https://www.cnblogs.com/ai616818/p/2151634.html
Copyright © 2020-2023  润新知