1、内核

1.1内核分类

内核设计流派:
    单内核(monolithic kernel):Linux
    把所有功能集成于同一个程序

微内核(micro kernel):
    Windows, Solaris
    每种功能使用一个单独子系统实现



1.2、内核组成

组成部分:
    核心文件:/boot/vmlinuz-VERSION-release


1.3、centos6启动


blob.png

    1.加载BIOS的硬件信息,获取第一个启动设备
    2.读取第一个启动设备MBR的引导加载程序(grub)的启动信息
    3.加载核心操作系统的核心信息,核心开始解压缩,并尝试驱
    动所有的硬件设备
    4.核心执行init程序,并获取默认的运行信息
    5.init程序执行/etc/rc.d/rc.sysinit文件
    6.启动核心的外挂模块
    7.init执行运行的各个批处理文件(scripts)
    8.init执行/etc/rc.d/rc.local
    9.执行/bin/login程序,等待用户登录
    10.登录之后开始以Shell控制主机



1.4、系统运行级别

    /sbin/init CentOS6    之前;
    
    运行级别:为系统运行或维护等目的而设定;0-6:7个级别
    0:关机
    1:单用户模式(root自动登录), single, 维护模式
    2: 多用户模式,启动网络功能,但不会启动NFS;维护模式
    3:多用户模式,正常模式;文本界面
    4:预留级别;可同3级别
    5:多用户模式,正常模式;图形界面
    6:重启
    
    默认级别: 3, 5
    切换级别:init #
    查看级别:runlevel ; who -r



2、内核编译


2.1、内核组成


内核组成部分:
kernel:
     内核核心,一般为bzImage,通常在/boot目录
    下,名称为vmlinuz-VERSION-RELEASE
kernel object:
     内核对象,一般放置于
    /lib/modules/VERSION-RELEASE/

[ ]: N
[M]: M
[*]: Y

辅助文件:ramdisk
    initrd
    initramfs


2.2、准备

前提:
    (1) 准备好开发环境
    (2) 获取目标主机上硬件设备的相关信息
    (3) 获取目标主机系统功能的相关信息
    例如:需要启用相应的文件系统
    (4) 获取内核源代码包
    www.kernel.org
目标主机硬件设备相关信息:
    CPU:
    cat /proc/cpuinfo
    x86info -a
    lscpu



2.3、步骤

    tar xf linux-3.10.67.tar.xz -C /usr/src
    cd /usr/src
    ln -sv linux-3.10.67 linux
    cd /usr/src/linux
    cp /boot/config-$(uname -r) ./.config
    make help
    make menuconfig
    make -j 2
    make modules_install
    make install
    reboot


2.4、如何编译

(1) 配置内核选项
支持“更新”模式进行配置:make help
    (a) make config:基于命令行以遍历的方式去配置内核
    中可配置的每个选项
    (b) make menuconfig:基于curses的文本窗口界面
    (c) make gconfig:基于GTK (GNOME)环境窗口界面
    (d) make xconfig:基于QT(KDE)环境的窗口界面

支持“全新配置”模式进行配置
    (a) make defconfig:基于内核为目标平台提供的“默认
    ”配置进行配置
    (b) make allyesconfig: 所有选项均回答为“yes“
    (c) make allnoconfig: 所有选项均回答为"no“
(2) 编译
    全编译:make [-j #]
    编译内核的一部分功能:
    
    (a) 只编译某子目录中的相关代码
        cd /usr/src/linux
        make dir/
    (b) 只编译一个特定的模块
        cd /usr/src/linux
        make dir/file.ko

        例如:只为e1000编译驱动:
        make drivers/net/ethernet/intel/e1000/e1000.ko
要获取特定目标平台的使用帮助
    make ARCH=arch_name help
    make ARCH=arm help


在已经执行过编译操作的内核源码树做重新编译:
    需要事先清理操作:
    make clean:清理大多数编译生成的文件,但会保留
    config文件等;
    make mrproper: 清理所有编译生成的文件、 config及某
    些备份文件;
    make distclean:mrproper、 patches以及编辑器备份文件;


2.5、卸载内核

    删除/lib/modules/目录下不需要的内核库文件
    删除/usr/src/linux/目录下不需要的内核源码
    删除/boot目录下启动的内核和内核映像文件
    更改grub的配置文件,删除不需要的内核启动列表