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、软链接:ln  -s  相对于软链接的路径/绝对路径   软链接文件    硬链接:ln  相对路径原文件   硬链接文件 2、getent的使用    gentent p…

    系统运维 2016-08-05
  • RAID级别及各个级别特性

    1、什么RAID      RAID是“Redundant Array of Independent Disk”的缩写,中文意思是独立冗余磁盘阵列。 2、RAID的级别及各个级别的特性:     (1)RAID-0:无差错控制的条带化:   &nbs…

    Linux干货 2016-04-12
  • bash通配符和正则表达式元字符部分归纳

    Linux中有各种各样的字符,而且在不同环境和不同命令之下含义也不同 作为新手,决定先归纳学到的符号,方便后面学习厘清它们之间的关系。 glob 简化了的正则表达式 bash默认通配符: ? :只匹配一个任意字符; * :匹配零个或多个任意字符;   [^] :方括号及其中^中的取反 [abc]:匹配任何一个列在方括号中的字符(这个例子要么匹配一个…

    Linux干货 2016-04-11
  • locate、find命令使用总结

    一、简介    在linux系统中存在"一切皆文件"的说法,这就足以说明文件的重要性,因此查找文件也是我们必须要掌握的技能。这时候熟练使用locate、find命令也就显得至关重要。尤其是find命令常用于日常工作中如安装完某个软件之后要查看这些软件的安装配置路径,或是需要按指定条件直接查找我们需要操作的文件。因此更需…

    Linux干货 2015-08-31
  • 软件包管理器之一——RPM介绍及应用

    一、前言:     在没有软件包管理器前,用户都是通过源代码的方式来安装软件。但是我们很容易发现,在每次安装软件时都必须对操作系统的境、编译的参数进行对应的编译,并且操作过程很是复杂,这对于不熟悉操作系统的朋友来说真心困难,那么有没有一款软件能让用户能很简单的安装所需的软件呢?    &n…

    Linux干货 2015-07-20
  • Linux自动备份脚本

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://nolinux.blog.51cto.com/4824967/1541163        今天网上一个朋友问了我一个shell的题目,让我帮他做下。下面是题目以及解题思路。 题目:…

    Linux干货 2016-08-15