CentOS启动流程与grub_第1张图片

微内核设计使每种功能都单独独立出来.导致相互之间的逻辑关系变得很复杂.也有安全上的隐患.现在linux的内核是在单内核的基础上支持了模块化

linux把核心文件(文件系统之类)之外的其他功能多做成了模块化.支持了运行时的动态装/卸载

CentOS启动流程与grub_第2张图片

ramdisk就是为了解决这个矛盾的关系才存在的  ramdisk在内核之前装载到内存中 把内存中的某段空间当成磁盘来使用 让内核来当成根目录使用.内核把真根挂在进来之后让位 



CentOS系统启动流程: (仅用于MBR类型结构)


①POST(自检):

    加电自检,检查计算机各种硬件是否存在

    ROM : CMOS(最有代表性的)  通过ROM加载自检程序

    BIOS: Basic Input and Output System

    ROM+RAM  可被CPU访问,线性寻址的物理空间

②Boot Sequence

    根据BIOS中设定的启动顺序引导设备. 第一个有引导程序的设备即为文辞启动要用到的设备

    bootloader: 引导加载器.程序. 提供一个菜单.允许用户选择要启动的系统或不同的内核版本.

    并加载到RAM中 解压 把系统控制权移交给内核

        Linux : 

    LILO: LIlux LOader  无法加载1024以后柱面的系统  --安卓中还用

    GRUB: Grand Uniform Bootloader 

    CentOS 5/6 : GRUB 0.x  -->重命名 : Grub Legacy

    CentOS 7 : GRUB 1.x  -->重命名: Grub2

    bootloader装在MBR

    MBR:  (磁盘分区讲过) Master Boot Record

        512bytes

        446bytes: bootloader

        64bytes : fat

        2bytes : 55AA   55AA表示bootloader有效 其他表示无效

    注: GRUB会在最后进行单独介绍

③Kernel:

    自身初始化:

    探测可识别到的所有硬件设备

    加载硬件驱动程序(有可能会借助与ramdisk加载驱动)  加载硬件驱动时加载真正跟文件系统      所在设备驱动程序 这是有可能用到ramdisk

    以只读方式挂载跟文件系统 --以防内核bug把跟文件修改

    运行用户控件的第一个应用程序 /sbin/init

    init程序的类型:

        CentOS 5之前: SysV init

            配置文件 : /etc/inittab

        CentOS 6 : Upstart init  -支持并发服务启动

            配置文件 : /etc/inittab -没用. 为了兼容CentOS5  运行系统级

          /etc/init/*.conf

        CentOS 7 : Systemd 

    ramdisk:

        Linux内核的特性之一: 使用缓冲和缓存来加速对磁盘上的文件访问 -前提是硬盘是机            械是硬盘 

        ramdisk -->  ramfs 提速机制

        由于ramdisk是把内存中的部分空间当成硬盘来使用.所以需要数据时还是会从硬盘再            加载过来.这就造成了数据的两次读取 .所以会把ramdisk做成ramfs来优化

         CentOS 5 : initrd

         工具程序: mkinitrd

         CentOS 6,7 : initramfs

            工具程序: dracut, mkinitrd

        配置文件 : /usr/lib/systemd/system/ , /ets/systemd/system


至此:内核级别的系统初始化流程为:

POST-->BootSequence(BIOS)-->Bootloader--> kernel(ramdisk)-->rootfs(只读方式)-->/sbin/init

rootfs以只读方式挂载根是因为防止在启动过程怕对文件进行修改 对系统造成损害

在启动了init之后就会init就会开始执行一系列操作:

用户空间的系统启动流程

设定默认运行级别-->系统初始化脚本-->启动/关闭相应级别下的服务-->启动终端


/sbin/init

    CentOS 有7个运行级别:

        0: 关机 init0

    1: 单用户模式 (sigle user) 只有root 并且无需认证   维护模式

    2: 多用户模式 (multi user) 启动网络功能.不会启动NFS(网络文件系统) 维护模式

     3: 多用户模式 (multi user) 完全功能模式 文本界面 不激活桌面系统

    4: 预留级别 目前无特别使用目的  但是习惯同3级别功能使用

    5: 多用户模式 (multi user) 完全功能模式 启动图形接口

    6: 重启模式 

    init # : 级别切换

    who -r | runlevel 可以查看当前系统的运行级别

    init的配置文件在/etc/inittab中

    CentOS启动流程与grub_第3张图片

    以id:runlevels:action:process来定义每个相应级别的对应任务

        id: 任务的标识符

        runlevels: 在哪些级别启动此任务 #,###, 可以为空表示所有级别

        action: 在什么条件下启动此任务

        process: 任务 (通常是一个程序或者是脚本)

    action有:

        wait: 等待切换至此任务所在的级别时执行一次

        respawn: 此任务终止时 就自动重新启动 (登陆界面)

        initdefault: 设定默认运行级别 此时 process省略

        sysinit: 设定系统初始化方式,此处一般指定/etc/rc.d/rc.sysinit

    id的例:

        si::sysinit:/etc/rc.d/rc.sysinit   完成系统初始化

        tty1:2345:respawn:/usr/sbin/mingetty tty1

        ...是指定级别的时候会运行mingetty程序  后面跟着的tty表示这命令是用来启动虚              拟终端的 这就是能用ctrl+alt+F1~F6 切换终端的原因

    mingetty只是用来打开终端的

    tty6:2345:respawn:/usr/sbin/mingetty tty6

    mingetty会调用login程序

            打开虚拟终端的程序除了mingetty之外 还有 getty

        tty7:5:respawn:/etc/X11/  

            启动图形界面   tty系列命令会一起出现 缺了哪个tty那个tty就无法运行

        l0:0:wait:/etc/rc.d/rc 0  

    l1:1:wait:/etc/rc.d/rc 1  

        ....

        l6:6:wait:/etc/rc.d/rc 6

        只有切换至指定级别时运行一次 给 /etc/rc.d/rc  传递参数0~6 

        这个脚本会在切换界别时执行一次 对该级别下需要启动|关闭的服务进行相应操作

        核心部分为通过下面这段代码

        CentOS启动流程与grub_第4张图片

        在每个级别对应的 /etc/rc.d/rc#.d 目录下存放着这些文件

    CentOS启动流程与grub_第5张图片    K开头的文件表示下次切换到该级别时需要关闭的服务

    S开头的文件表示下次切换到该级别时需要启动的服务

    上面的代码会通过读取指定开头全部文件来做相关的开启 关闭操作

    chkconfig 命令 : 管控/etc/init.d/每个服务脚本在各级别下的启动或关闭状态

    查看: chkconfig --list [name]

    添加: chkconfig --add name   file必须是在/etc/init.d 下创建的才可以添加

     能被添加的服务的脚本定义格式

    #!/bin/bash

    # chkconfig: L L L NN NN   ll表示添加后自动为on的level 第一个NN启动优先级                              第二个NN 关闭优先级 没有被添加到的level下文件一                              直都会是k开头的格式存在

 level里 - 表示所有级别一直都是关闭状态

    删除: chkconfig --del name 

    chkconfig [--level LEVELS] name  开机自启

          --level LEVELS : 指定要控制的级别 默认为2345

    

===========================================================================================

grub

grub的主要作用是加载用户所选定的内核

grub在工作时有三个步骤:

    stage1:mbr   无法加载逻辑卷  所以内核只能放在基本卷中

    stage1-5: 在mbr之后的扇区.让stage1中的bootloader能识别stage2所在的分区上的文件系统

    stage2: 这个阶段存放在磁盘分区(/boot/grub)  这个分区上还有内核文件 ramdisk等 所以      grub能加载到内核文件

        stege2 及内核通常会单独放置于一个基本分区 但是不是必须的

        功用:

    (1).提供菜单.并提供交互式接口

        e: 编辑模式 用于编辑菜单

        c: 命令模式 交互式接口

        p: 输入密码 设定了密码的情况下 要先输入密码 否则没反应

    (2).加载用户选择的内核或操作系统

        允许传递参数给内核

        可隐藏此菜单

    (3).为菜单提供了保护机制

        为编辑菜单进行认证

        为启用内核或操作系统进行认证

     grub的命令行接口:    

    CentOS启动流程与grub_第6张图片

        help: 获取帮助列表

        help keyword : 详细指定命令的帮助

        find (hd#,#) /path/to/somefile  find能查找到的文件是与启动相关的文件

        root (hd0,0) 把哪个设备分区设定为根设备  

        (hd#,#) 第几块磁盘第几个分区 . 从零开始编号 hd0,0 第一个磁盘上的第一个分区

         -root是设置grub的跟设备  在root指定根设备的过程分为两种情况

            ①/boot在一个独立的分区

            root把grub所在的分区指为根 这样就能直接通过 /grub来启动了

            否则会出现一下这种情况

            CentOS启动流程与grub_第7张图片

            此时root把/boot所在的区域指为根 就能解决这个死循环问题 grub是直接通                 过/grub来访问的

            ②/boot没有单独分区 在/分区下面 此时root就直接把真根指为根 

            此时grub的访问路径为 /boot/grub

        kernel /PATH/TO/KERNEL_FILE 设定本次启动时用到的内核文件  额外还可添加许多                内核支持使用的cmdline 参数

例如 : init=/path/to/init  selinux=0  禁用selinux

    内核文件通常被取名为vmlinuz  z表示文件是以压缩格式存放的意思

initrd /PATH/TO/INITRAMFS_FILE:为选定的内核提供额外文件的ramdisk 必须与内核                                号完全匹配

boot: 引导启动选定的内核

    

        配置文件: /boot/grub/grub.conf   <-- /etc/grub.conf  链接指向/boot

  配置项:

default=# 设定默认启动的菜单项: 菜单项(title)编号从0开始

timeout=# 指定菜单选项等待选择的时长

splashp_w_picpath=(hd#,#)/PATH/TO/XPM_PIC_FILE  指明菜单背景图片文件路径

hiddenmenu: 是否隐藏菜单

password [--md5] STRING 设定认证方式 

title TITLE: 定义菜单项标题   可出现多次 定义多个选项

root (hd#,#):grub查找stage2及kernel文件所在设备分区  必须要缩进写

kernel /PATH/TO/VMLINUZ_FILE [PARAMETERS] : 启动的内核

initrd /PATH/TO/INITRAMFS_FILE : 内核匹配的ramfs文件

password [--md5] STRING : 启动选定的内核或操作系统时进行的位置

        CentOS启动流程与grub_第8张图片

这个设置对应于

    CentOS启动流程与grub_第9张图片

     亲测 :不支持中文  按e进行编辑

    CentOS启动流程与grub_第10张图片

    可以按ESC返回  按C进入编辑模式

     注: 进入救援模式是从这里进行操作 进入的 具体方法 在上文中已经说过