Linux下编译内核

                       Linux下编译内核

内核编译

编译内核就是把内核的相关文件重新生成。

 

内核编译前期准备:

Linux kernel下载网址:https://www.kernel.org/下载需要编译的内核版本。

在虚拟机中安装开发工具包组:Development Tools,可以使用yum grouplist 查找。

[root@centos7 cd]# yum -y groupinstall –disablerepo=mage "Development Tools"

在虚拟机中安装ncurses包。

[root@centos7 cd]# yum -y install –disablerepo=mage ncurses*

编译内核虚拟机环境:centos 7

编译之前确认本机硬件信息 (普通编译、交叉编译)。

 

Linux内核设计体系:

     Linux内核采用单内核体系设计、但充分借鉴了微内核设计体系的优点,为内核引入模块化机制。

 

 Linux内核组成部分:

      kernel:内核的核心文件,通常放置在/boot目录下,名称为vmlinuz-VERSION-RELEASE

      示例:

        [root@centos6 ~]# ls /boot

        config-2.6.32-642.el6.x86_64  grub  lost+found  System.map-2.6.32-642.el6.x86_64

        efi  initramfs-2.6.32-642.el6.x86_64.img symvers-2.6.32-642.el6.x86_64.gz

        vmlinuz-2.6.32-642.el6.x86_64

        [root@centos6 ~]#

  

       kernel object:内核对象,一般放置在/lib/modules/version-release/目录下,大部分为以.ko结尾的驱动模块文件。

 

查看内核版本:

       uname命令:

            uname – print system information

            uname [OPTION]…

                  -n:显示主机名称;

                  -r:显示版本信息;

                  -a:显示所有信息;

示例:

 [root@centos6 Desktop]# uname -r

 2.6.32-642.el6.x86_64

 [root@centos6 Desktop]#

 

内核模块命令:

     lsmod命令:

       显示由核心已经装载的内核模块;显示的内容来自于/proc/modules文件。

   示例:

    [root@centos6 Desktop]# lsmod | grep "ext4"

    ext4                  379655  3

    jbd2                   93252  1 ext4

    mbcache                 8193  1 ext4

    [root@centos6 Desktop]#

 

modinfo命令:

     显示模块的详细描述信息;

     modinfo [ -0 ]  [ -F field ]  [ -k kernel ]  [ modulename|filename… ]

            -n:显示模块文件路径;

            -p:显示模块参数;

            -a:显示作者信息;

            -d:显示驱动文件描述信息;

            -l:查看许可证;

     示例:

      [root@centos6 Desktop]# modinfo -n e1000

      /lib/modules/2.6.32-642.el6.x86_64/kernel/drivers/net/e1000/e1000.ko

      [root@centos6 Desktop]#

 

内核模块管理:

   modprobe命令:

        装载或卸载内核模块;

          选项:

              -l:列出所有装载的内核模块;

              -r:下载内核模块;  或 rmmod命令

   示例:

      [root@centos6 Desktop]# modprobe -r e1000

      [root@centos6 Desktop]# lsmod | grep e1000

      [root@centos6 Desktop]# modprobe  e1000

      [root@centos6 Desktop]# lsmod | grep e1000

      e1000                 134863  0

      [root@centos6 Desktop]#

 

depmod命令:

   内核模块依赖关系文件及系统信息映射文件的生成工具,不要随便执行。

 

insmod命令:指定模块文件,不自动解决依赖模块,需手动解决依赖关系。

  insmod `modinfo  -n  exportfs`

  insmod `modinfo  -n  xfs`

 

rmmod命令:

   rmmod  [modulename]

   示例:卸载xfs模块驱动

   rmmod  xfs

 

/proc目录:

     内核把自己内部状态信息及统计信息,以及可配置参数通过proc伪文件系统加以输出。

   参数:只读:输出信息

         可写:可接受用户指定的新值来实现对内核某功能或特性的配置。

   sysctl命令:用于查看或修改修改/proc/sys目录中的诸多参数。修改的参数临时生效。

         选项:

             -a:查看所有参数;

             -w:临时设置某一参数;

             -p:重新读取/etc/stsctl.conf配置文件,使其参数更改生效。

 

     内核中的路由转发:

           /proc/sys/net/ipv4/ip_forward

    

     常用的几个参数:

         net.ipv4.ip_forward  开启/禁用路由转发

         net.ipv4.icmp_echo_ignore_all  开启/禁用ping命令

         vm.drop_caches=3  清理内存cache

         kernel.shmall   默认16G,有时需要调大,充分发挥机器硬件性能。

 

     示例:设置临时开启路由转发功能。等同于 echo命令设置。

    1[root@centos6 Desktop]# sysctl -w net.ipv4.ip_forward=1

       net.ipv4.ip_forward = 1

       [root@centos6 Desktop]#

    2echo命令:设置临时关闭路由转发功能。

       [root@centos6 Desktop]# echo "0" > /proc/sys/net/ipv4/ip_forward

       [root@centos6 Desktop]# cat /proc/sys/net/ipv4/ip_forward

       0

       [root@centos6 Desktop]#

 

/sys目录:

    sysfs:为用户使用的伪文件系统,输出内核识别出的各硬件设备的相关属性信息,也有内核对硬件特性的设定信息,有些参数是可以修改的,用于调整硬件工作特性。

    udev通过此路径下输出的信息动态为各设备创建所需要设备文件,udev是运行用户空间程序。

        专用工具:udevadmin  hotplug

        udev为设备创建设备文件时,会读取其事先定义好的规则文件,一般在/etc/udev/rules.d/usr/lib/udev/rules.d目录。

 

   ramdisk管理:

       mkinitrd命令:

         为当前正在使用的内核重新制作ramdisk文件;需在急救模式下操作。

         mkinitrd initramfs-`uname -r `.img  `uname -r`

    

   dracut命令:

     为当前正在使用的内核重新制作ramfs文件;需在急救模式下操作。

     dracut  initramfs-`uname -r `.img  `uname -r`

 

编译内核:

1)准备好开发环境。

2)获取目标主机上硬件设备的相关信息。

3)获取目标主机系统功能的相关信息。

4)获取内核源代码包。https://www.kernel.org/

 

开发环境准备:

      包组:

        1Development  Tools 开发工具包。

    2、在虚拟机中安装make  menuconfig依赖的ncurses包。

           ncurses-5.9-13.20130511.el7.x86_64

 

      目标主机硬件设备相关信息:

         CPU

           #cat /proc/cpuinfo 查看CPU信息

           # lscpu           查看CPU信息

           #arch            查看架构  

 

硬件设备:

      pci设备:

         lspci  -v

         lsusb  -v

         lsblk  块设备

 

内核编译安装:

安装开发包组;

下载源码文件;

.config:准备文本配置文件;

make menuconfig:配置内核选项;

make [-j  #] :编译内核 ,使用#CPU并发编译;

make modules_install:安装驱动模块至/lib/modules/目录下。

make install :安装内核相关文件。

          1)安装内核文件到本机/boot目录下。

          2)生成initramfs伪根文件系统。

          3)编辑/boot/grub2/grub.cfg配置文件

 

编译内核:

配置内核选项:

  支持“更新”模式进行配置:make help

   1make config:基于命令行以遍历的方式去配置内核中可以配置的每个选项;

   2make menuconfig:基于ncurses的文本窗口界面;

   3make gconfig:基于GTKGNOME)环境窗口界面;

   4make xconfig:基于QTKDE)环境的窗口界面;

 

  支持“全新配置”模式进行配置

   1make defconfig:基于内核为目标平台提供的“默认”配置进行配置;

   2make allyesconfig:所有选项均回答为“yes”;

   3make allnoconfig:所有的选项均回答为“no”;

 

内核编译:

全编译:make [-j #]

编译内核的一部分功能:

   1)只编译某目录中的相关代码:

     示例:编译打开内核对ntfs文件系统功能以模块化方式支持,同时支持写权限。

         [root@centos7 ~]# cd /usr/src/linux

         [root@centos7 linux]# make fs/ntfs/ntfs.ko (其中文件名需要自己写,事先不存在)

       

       2)只编译一个特定的模块:

          示例:只编译e1000驱动模块;

           [root@centos7 ~]# cd /usr/src/linux

           [root@centos7 linux]# make drivers/net/ethernet/intel/e1000/e1000.ko

    

     如何交叉编译:

         编译的目标平台与当前平台不相同;

          #make  ARCH=arch_name

          例如:

           #make  ARCH=arm

         要获取特定目标平台的使用帮助;

          #make  ARCH=arch_name help

          例如:

          #make  ARCH=arm help

     

      在已经执行过编译操作的内核源代码中做重新编译,需要事先做清理操作:

         make clean:清理大多数编译生成的文件,但会保留config文件等。

         make mrproper:清理所有编译生成的文件,config及某些备份文件。

         make distclean:清理所有编译生成的文件基本清理到编译前的状态。

 

开始编译内核:

   内核编译前期准备:

Linux kernel下载网址:https://www.kernel.org/下载需要编译的内核版本。

在虚拟机中安装开发工具包组:Development Tools,可以使用yum grouplist 查找。

[root@centos7 cd]# yum -y groupinstall –disablerepo=mage "Development Tools"

在虚拟机中安装make  menuconfig依赖的ncurses包。

[root@centos7 cd]# yum -y install –disablerepo=mage ncurses*

编译内核虚拟机环境:centos 7

编译之前确认本机硬件信息 (普通编译、交叉编译)。

 

1)将下载好的kernel文件copyroot目录下。

       [root@centos7 ~]# ll -h linux-3.18.42.tar.xz

       -rwxrw-rw-. 1 root root 78M sep 20 21:50 linux-3.18.42.tar.xz

       [root@centos7 ~]#

 

2)在虚拟机中安装开发工具包组:Development Tools,可以使用yum grouplist 查找。

    [root@centos7 cd]# yum -y groupinstall –disablerepo=mage "Development Tools"

 

    3)解压linux-3.18.42.tar.xz内核包到/usr/src目录下。

    [root@centos7 ~]# tar xvf linux-3.18.42.tar.xz -C /usr/src

 

4)cd/usr/src目录下,为linux-3.18.42创建软链接。

        [root@centos7 ~]# cd /usr/src/

        [root@centos7 src]# ln -s linux-3.18.42/  linux

        [root@centos7 src]# ll

        total 4

        drwxr-xr-x.  2 root root    6 jun  9  2014 debug

        drwxr-xr-x.  3 root root   34 sep 20 22:12 kernels

        lrwxrwxrwx.  1 root root   14 sep 20 23:16 linux -> linux-3.18.42/

        drwxrwxr-x. 23 root root 4096 sep 17 18:55 linux-3.18.42

 

      查看解压缩后的内核文件大小。

        [root@centos7 src]# cd  linux

        [root@centos7 linux]# du -sh .

        633M .

        [root@centos7 linux]#

   

5)拷贝本机/boot/config-3.10.0-229.el7.x86_64内核编译模板文件到/usr/src/linux/.config

    编译内核时默认会对这个.config文件。

   [root@centos7 linux]# cp -rf /boot/config-3.10.0-229.el7.x86_64  /usr/src/linux/.config

   [root@centos7 linux]# wc -l .config

   5310 .config

   [root@centos7 linux]#

 

6)/usr/src/linux/目录下执行make menuconfig.config文件进行更改操作。

        1make menuconfig 是依赖于ncurses包的,如果没有安装需要进行安装。

           [root@centos7 linux]# yum -y install –disablerepo=mage ncurses*

        

        2)在/usr/src/linux/目录下执行make menuconfig.config文件进行更改操作。

            [root@centos7 linux]# make menuconfig

    blob.png

general setup 配置:补充kernel version后的version info

   blob.png 

关闭蓝牙

  blob.png 

打开内核对ntfs文件系统功能以模块化方式支持,同时支持写权限。

  blob.png 

执行exit到首页,再次执行exit退出,并选择yes保存操作更改。

 

     现在在看一下/usr/src/linux/.config文件的大小。

         root@centos7 linux]# du -sh .

         634M .

         [root@centos7 linux]#

     这时我们发现比更改前多了1M

 

  7)使用make命令开始对内核编译。

         make  -j # 指定本机编译内核CPU的个数,并行编译。

 

     查看本机CPU个数:

      [root@centos7 linux]# lscpu

      Architecture:          x86_64

      CPU op-mode(s):        32-bit, 64-bit

      Byte Order:            Little Endian

      CPU(s):                4

      On-line CPU(s) list:   0-3

      Thread(s) per core:    1

      ……………………….

      [root@centos7 linux]#

 

开始编译内核:Need to wait for a period of time

  [root@centos7 linux]# make -j 4

 

查看编译后的/usr/src/linux目录大小:

  [root@centos7 linux]# du -sh .

  7,0G .

  [root@centos7 linux]#

 

查看是否编译生成了ntfs.ko文件

  [root@centos7 linux-3.18.42]# find -name  "*.ko"  | grep "ntfs"

  ./fs/ntfs/ntfs.ko

  [root@centos7 linux-3.18.42]#

 

 8)安装模块至 /lib/modules目录下。

      [root@centos7 linux]# make modules_install

 

 9)安装内核相关文件。

  1)安装内核文件到本机/boot目录下。

  2)生成initramfs伪根文件系统。

  3)编辑/boot/grub2/grub.cfg配置文件

 

      [root@centos7 linux]# make install  (一条命令,以上三步全部搞定)

      sh ./arch/x86/boot/install.sh 3.18.42-zhengyibolinux arch/x86/boot/bzImage \

  System.map "/boot"

      [root@centos7 linux]#

    

     /boot目录下查看发现已经多了一个内核文件。

     /boot/grub2/grub.cfg文件中查看发现已经多了一个新内核信息。

 

 10)重启 reboot,使用新内核启动。

 

 

 

  

 

 

 

 

 

 

       

       

原创文章,作者:zhengyibo,如若转载,请注明出处:http://www.178linux.com/48371

(0)
zhengyibozhengyibo
上一篇 2016-09-21 21:20
下一篇 2016-09-21 22:19

相关推荐

  • Infobright高性能数据仓库

    1.  概述         Infobright是一款基于独特的专利知识网格技术的列式数据库。Infobright简单易用,快速安装部署,使用中无需复杂操作,能大幅度减少管理工作;在应对50TB甚至更多数据量进行多并发复杂查询时,更能够显示出令人惊叹的速度。相比于MySQL,其查询速度提升了数倍甚…

    Linux干货 2015-04-05
  • Linux GRUB legacy

    Linux GRUB Linux GRUB Linux GRUB 单用户模式(密码破解) 救援模式 实例 GRUB菜单 GRUB命令行接口 GRUB简介 GRUB 菜单组成 GRUB配置文件 GRUB安装及修复 GRUB单用户及救援模式 GRUB简介 了解grub之前,需要理解linux的启动流程,如果之前有对linux启动流程不了解的可以看:http://…

    Linux干货 2016-04-25
  • PageRank算法

    1. PageRank算法概述          PageRank,即网页排名,又称网页级别、Google左侧排名或佩奇排名。         是Google创始人拉里·佩奇和谢尔盖·布林于1997年构建早期的…

    Linux干货 2015-12-15
  • 计算机编程简史图

       这个图片太经典了,本来想翻译的,后来觉得这么经典的图片可能早已被人翻译了,简单的Google一下,果然有人翻译了。那我就把英文版和中文版都转过来吧。我们可以看到,其中很大一部分人都和Unix有着不解之缘(参见《Unix传奇上篇,Unix传奇下篇》) 英文原版 中文翻译版 什么也不说了,直接上图(图片比较大,单击图片看大图) 计算机编…

    Linux干货 2015-04-02
  • Linux文本处理三剑客之awk详解

    前言 awk是一款强大的报告生成器,不同于sed和grep,它的侧重点是如何把文本信息更好的展示出来,常用与统计和格式化输出。awk相当于微型的shell,有着自己一套语法结构,例如:循环结构,数组,条件判断,函数,内置变量等功能。处理对象一般纯文本文件或纯文本信息。 用法详解 基本语法 awk [options] 'progra…

    Linux干货 2015-04-29
  • 设计模式(四)原型模式Prototype(创建型)

    1.   概述 我们都知道,创建型模式一般是用来创建一个新的对象,然后我们使用这个对象完成一些对象的操作,我们通过原型模式可以快速的创建一个对象而不需要提供专门的new()操作就可以快速完成对象的创建,这无疑是一种非常有效的方式,快速的创建一个新的对象。 例子1:孙悟空拔下一嘬猴毛,轻轻一吹就会变出好多的孙悟空来。 例子2:寄个快递下面是一个邮寄快…

    Linux干货 2015-06-25