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