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
下一篇 2016-09-21

相关推荐

  • 重构-改善既有代码的设计:重构原则(二)

    1.什么是重构 重构(Refactoring):在不改变软件的功能和外部可见性的情况下,为了改善软件的结构,提高清晰性、可扩展性和可重用性而对软件进行的改造,对代码内部的结构进行优化。 2.为何重构   1)改进软件设计(整理代码) 重构和设计是相辅相成的,它和设计彼此互补。有了重构,你仍然必须做预先的设计,但是不必是最优的设计,只需要一个合理的解…

    Linux干货 2015-04-07
  • 数据结构-栈和队列

    1.栈 1.1 栈的定义 栈是一种特殊的线性表。其特殊性在于限定插入和删除数据元素的操作只能在线性表的一端进行。如下所示: 结论:后进先出(Last In First Out),简称为LIFO线性表。 栈的基本运算有六种: 构造空栈:InitStack(S)、 判栈空: StackEmpty(S)、 判栈满: StackFull(S)、 …

    Linux干货 2015-04-07
  • 设计模式(八)装饰器模式Decorator(结构型)

    1. 概述        若你从事过面向对象开发,实现给一个类或对象增加行为,使用继承机制,这是所有面向对象语言的一个基本特性。如果已经存在的一个类缺少某些方法,或者须要给方法添加更多的功能(魅力),你也许会仅仅继承这个类来产生一个新类—这建立在额外的代码上。       通过继…

    Linux干货 2015-07-03
  • Apache运行机制剖析

    1. B/S交互过程 浏览器(Browser)和服务器(Web Server)的交互过程:   1、  浏览器向服务器发出HTTP请求(Request)。 2、  服务器收到浏览器的请求数据,经过分析处理,向浏览器输出响应数据(Response)。 3、  浏览器收到服务器的响应数据,经过分析处理,将最终结果显示在浏览…

    Linux干货 2015-04-10
  • vim编辑器的用法

    vim编辑器的用法 1、vi的基本概念     vi可以分为三种模式,分别是命令模式(command mode)、输入模式(Insert mode)和末行模式(last line mode),各模式的功能如下:     1) 命令行模式command mode)         …

    Linux干货 2015-09-14
  • Javascript 装载和执行

    一两个月前在淘宝内网里看到一个优化Javascript代码的竞赛,发现有不少的人对Javascript的执行和装载的基础并不懂,所以,从那天起我就想写一篇文章,但一直耽搁了。自上篇《浏览器渲染原理简介》,正好也可以承前启后。 首先,我想说一下Javascript的装载和执行。通常来说,浏览器对于Javascript的运行有两大特性:1)载入后马上执行,2)执…

    Linux干货 2016-08-15