1、linux内核的组成部分:

    kernel文件:

    kernel object:内核模块

    ramdisk:辅助性文件,用来驱动rootfs所在硬件设备。


2、linux启动流程:

    POST--->BOOT Sequence(bios中设定的启动顺序)--->从启动设备的mbr中引导grub第一阶段--->kernel(有时会借助于ramdisk文件)--->rootfs(根切换)--->/sbin/init(用户空间的第一个程序,它的配置文件存放于:/etc/inittab;/etc/init/*.conf;/usr/lib/systemd/system)--->设定内核运行的级别、系统初始化、关闭或启动服务--->启动终端。


grub的三个阶段:

stage1:安装在mbr中,bootloader引导

stage1_5:mbr之后的扇区上,此扇区主要存放识别第二阶段的所在设备的驱动程序和文件系统

stage2:位于磁盘分区上;一般位于/boot/grub/目录下,加载第二阶段后会显示grub菜单,

    e:编辑菜单

       加密、保护编辑菜单和启动系统。




3、编译内核安装

3.1、程序包的编译安装步骤:

    ①、./configure :检查编译环境的依赖关系是否满足,并设置编译参数

    ②、make :执行编译过程,调用所需编译工具执行

    ③、make install:安装,即将程序的四部分组成文件复制到相应的目录下。


3.2、编译安装前提条件:

    开源代码--->编译成可执行的二进制格式--->发行版(以通用的目标去编译)

    编译内核的前提条件:

        ①、准备好开发环境

        ②、获取目标主机上的硬件设备相关信息

        ③、获取目标主机系统功能的相关信息,例如:要启用的文件系统

        ④、获取内核源代码:www.kernel.org

①、准备开发环境:

    centos6.7:

        "Development Tools" "server platform development"

    centos7:

        "Development Tools" "server platform development"


注意:要安装:[root@localhost ~]# yum list all *ncurse* 这些包。


②、获取目标主机上的硬件信息:

  CPU设备信息:

    [root@localhost ~]# cat /proc/cpuinfo | grep "model name"

    model name: Intel(R) Core(TM) i5-5250U CPU @ 1.60GHz

    [root@localhost ~]# 

    或:

    [root@localhost ~]# lscpu | grep "Model name"

    Model name:            Intel(R) Core(TM) i5-5250U CPU @ 1.60GHz

    [root@localhost ~]# 

    或:

    [root@localhost ~]# yum install x86info -y   

    [root@localhost ~]# x86info | grep -i processor

    Processor name string (BIOS programmed): Intel(R) Core(TM) i5-5250U CPU @ 1.60GHz

    Total processor threads: 1

    This system has 1 processor running at an estimated 1.60GHz

    [root@localhost ~]# 


 PCI设备信息:显卡、网卡、键盘、鼠标等。

    [root@localhost ~]# lspci [-v]    //查看pci信息

    [root@localhost ~]# lsusb    //查看usb信息

    [root@localhost ~]# lsblk    //查看硬盘信息(块设备信息)

    

注意:内存不需要去驱动,但是要了解有多大的内存


也可以了解全部的硬件设备信息(类似windows的设备管理器)

    #hal-device



3.3、内核编译过程

    ①、下载内核源代码:

        #mget https://cdn.kernel.org/pub/linux/kernel/v4.x/linux-4.14.12.tar.xz

    ②、解压缩至/usr/src目录:(内核编译安装建议放在此目录中进行)

        #tar xJf linux-4.14.12.tar.xz -C /usr/src

       注意:如果要编译内核驱动程序(硬件驱动),应该在/usr/src/linux目标,但是一般都会跟版本号,建议做链接(#ln -sv linux-4.14.12 linux),这样做支持回滚,如果版本有很多,直接改链接就可以。同样适用于应用程序操作。

    ③、#cd /usr/src/linux

        #ls

     ④、 #make help //查看编译参数帮助

           configuration targets  //配置参数,选里面的一种或几种

       #make menuconfig   //会报错需安装ncurse环境

        #yum install ncurses-devel 

 编译方式一:  #make menuconfig  //编译内核,文本编辑  

        注意:[*]:表示编译进内核

            [m]:编译成模块

            [ ]:不编译此功能

 编译方式二:#make xconfig  //需安装qt包组,图形编译,kde桌面环境

 编译方式三:#make gconfig  //需安装gtk包组,图形编译,gnome桌面环境




4、总结内核编译过程:

1)、下载源代码,www.kernel.org
2)、#tar xf linux-3.10.67.tar.xz -C /usr/src
3)、#cd /usr/src
4)、#ln linux-3.10.67  linux
5)、#cd linux

6)、#make menuconfig  //配置内核选项


  [root@localhost ~]# ls /boot/config-3.10.0-514.el7.x86_64  //此配置文件记录了内核编译的一些选项,可做为模板,但不是每个发行版都有此配置文件,红帽是有的。因此可以复制过                                            来当模板使用:#cp /boot/config-3.10.0-514.el7.x86_64 /usr/src/linux/.config,然后配置make menuconfig  


  配置内核选项:

   Ⅰ、支持以“更新”模式进行配置,重新生成新的配置文件(.config),即在已有的(.config)文件基础之上进行修改配置。

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

        b)、make menuconfig:基于curses的文本配置窗口

        c)、make gconfig:基于GTK开发环境的窗口界面,“桌面平台开发包组”

        d)、make xconfig:基于QT开发环境的窗口界面

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

        a)、make deconfig:基于内核为目标平台提供的“默认”配置为模板进行配置,不会读取(.config)文件

        b)、make allnoconfig:所有选项均为“no”,只是为了测试内核使用的


7)、#make [-j #]    //编译内核;设置编译时的线程数量,不加-j选项表示在一个内核上编译

      如:#make -j 4  //启动4核心进行编译,需要注意的是:编译时cpu几乎会满载

   

   编译内核方式:

        a)、多线程编译:#make -j #

        b)、编译内核中一部分代码:

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

                 #cd /usr/src/linux

                 #make /path/to/dir   //需要编译的目录 

             只编译一个特定的模块  

                 #cd /usr/src/linux

                 #make /path/to/dir/file.ko   //编译特定模块,file.ko不存在,但是存在file.c文件,对应的改后缀名即可。                 

                 #cp /path/to/dir/file.ko /lib/modules/3.10.0-514.el7.x86_64/kernel  //复制编译后的模块至相关指定目录下。


   交叉编译内核:编译的目标平台与当前的编译操作平台不同

       #make ARCH=arch_name   //是什么平台就写什么平台

     

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

       #make ARCH=arch_name help


   如何在执行过程编译操作的内核源码树上做重新编译:

       事先清理操作:

            方法一:#make clean :清理编译生成的绝大多数文件,但会保留config及编译外部模块所需的文件

            方法二:#make mrproper:清理编译生成的所有文件,包括配置生成的config文件及某些备份文件

            方法三:#make distclean:相当于mrproper,额外清理各种patches以及编译器备份文件

       然后在执行如下操作:

            #make menuconfig

           

8)、#make modules-install  //安装内核模块;此时会在/lib/modules/目录下生成指定版本的内核文件


    注意:模块安装完成后,可以开始安装内核,安装内核其实就是安装/usr/src/linux/arch/x86_64/boot/bzimage;bzimage是一个链接文件,它是链接到x86目录下:/boot/bzimage文件。


9)、#make install  //安装内核核心


    在/boot下会有生成的内核文件,与内核版本同名的initramfs文件及与内核版本同名的system.map文件;system.map文件记录了各种系统映射关系。


10)、完成1-9步骤,重启,选择编译的内核


注意:如果通过ssh连接到终端,如果此时中断连接,那么此中断上的进程也会关闭,可以通过ssh连接后,在screen中进行操作。因此上述步骤6、7、8、9建议放在screen中操作。

    screen命令:在终端模拟器上打开操作:(有可能需要自行安装)

    打开screen:#screen

    拆除screen:ctrl+a,d  //拆除是剥离桌面,不是关闭

    列出screen:#screen -ls

    重连screen:#screen -r SCREEN_ID //连接到screenID

    关闭screen:#exit   //退出screen,多个要执行多次,且在screen中退出。