CentOS 6系统启动流程

Linux系统的组成

内核+根文件系统
内核功能:
    进程管理、内存管理、文件系统管理、网络管理、安全功能、驱动程序

运行中的系统环境可分为两层:内核空间、用户空间
    用户空间:应用程序(进程或线程)
    内核空间:内核代码(系统调用)

内核设计流派:
    单内核设计:把所有功能集成与同一个程序
        Linux
    微内核设计:每种功能使用一个单独的子系统实现
        Windows,Solaris

    Linux内核特定:
        支持模块化:.ko(Kernel Object)
        支持模块运行时动态装载或卸载

        组成部分:
            核心文件:/boot/vmlinuz-VERSION-release
            ramdisk:
                CentOS 5:/boot/initrd-VERSION-release.img
                CentOS 6,7:/boot/initramfs-VERSION-release.img
            模块文件:/lib/modules/VERSION-release

CentOS系统启动流程

整体来说系统启动分为以下几个过程:

%ZZ(2}_)I(VCNDFP$47J1F0.png

1.加电自检

步骤1:通过BIOS(Basic Input Output System)即基本输入输出系统来检测硬件设备是否存在且运行正常,如:CPU、内存、硬盘,如果有异常情况,BIOS自检阶段会报错,从而导致系统无法启动
步骤2:去读BIOS启动顺序当中的第一个可引导设备(例如硬盘)的第一个扇区(MBR 512字节),然后执行里面的代码,实际上这里BIOS并不关心启动设备第一个扇区中是什么内容,它只是负责读取该扇区内容、并执行

2.Boot Loader

 我们首先来了解一下MBR,它是Master Boot Record的缩写。硬盘的0柱面、0磁头、1扇区称为主引导扇区。它由三个部分组成,主引导程序(Bootloader)、 硬盘分区表DPT(Disk Partition table)和硬盘有效标志(55AA)
 Boot loader:引导加载器
    Windows:ntloader
    Linux:LILO、GRUB

我们以GRUB为例来分析整个过程:
    Boot loader的主要功能是功能丰富,提供菜单,允许用户选择要启动系统或不同的内核版本;把用户选定的内核装载到内存中的特定空间中,解压、展开,并把系统控制权移交给内核。存放于MBR的前446bytes当中,但是446bytes容纳这么多功能,显然是很难得,因此,将Boot loader程序分为三个阶段来运行:
        stage1:存放于MBR的前446bytes当中,负责引导stage2
        stage1.5:在MBR之后的扇区中存放,让stage1中的bootloader能识别stage2所在的分区上的文件系统
        stage2:通过Bootloader加载所有配置文件及相关的环境参数信息,这些配置文件及相关的环境参数存放于磁盘分区上的/boot/grub目录下

3.加载kernel

在Bootloader开始读取操作系统内核文件后,接下来会将内核文件解压缩后装载到内存当中,然后根据内核提供的功能开始测试与加载各个设备(CPU、硬盘、网卡等)。
通过ramdisk来加载设备的驱动程序
    ramdisk:
        能够通过bootloader程序将其加载到内存当中,然后这个文件会被加压缩并且在内存中模拟一个根文件系统,这个根文件系统能够提供一个可运行的程序,通过该程序加载在启动过程当中所需要的核心模块。
    CentOS 5:initrd,工具程序:mkinitrd
    CentOS 6:initramfs,工具程序:mkinitrd,dracut
        mkinitrd initramfs-KERNEL-VERSION.img KERNEL-VERSION

Boot loader可以加载kernel以initrd,然后在内存中让initrd解压缩成根目录,然后内核可以在这个虚拟的根文件系统上加载和是的驱动程序,来加载硬盘等设备,之后释放虚拟的根文件系统,并以只读方式挂载磁盘上真实的根文件系统,之后启动/sbin/init程序

内核空间启动过程

POST --> BootSequence(BIOS) --> BootLoader(MBR) --> kernel(ramdisk) --> rootfs(readonly) --> /sbin/init

4.启动用户空间第一个执行程序/sbin/init

init程序
    CentOS 5:采用Sys V,配置文件为/etc/inittab
    CentOS 6:采用Upstart方式,特点是守护进程间的通信依赖于D-Bus进行,因此,可基本实现类似并行启动;
        配置文件:/etc/inittab、/etc/init/*.conf
    CentOS 7:采用systemd方式,服务只有在第一次被访问到时才会真正启动起来,因此,启动过程非常之快
        配置文件:/usr/lib/systemd/system, /etc/systemd/system

运行级别:为了系统的运行或维护等目的而设定的机制
    0:关机,shutdown
    1:单用户模式(single),root用户,无须认证可直接登录
    2:多用户模式,会启用网络功能,但不会启用nfs,维护模式
    3:正常模式,多用户,全功能,文本界面,通常用于服务器
    4:预留级别
    5:正常模式,多用户,全功能,图形界面操作,一般用于个人
    6:重启,reboot

    默认级别:3,5
    级别切换:init #
    级别查看:who -r或runlevel

在内核、硬件及驱动信息加载完毕后,内核会呼叫用户空间中的第一个执行程序/sbin/init,是所有进程的父进程,init程序主要功能是对系统进行初始化:

    1.首先会去读取配置文件/etc/inittab、/etc/init/*.conf
        /etc/inittab文件格式
            id:一个任务的标识符
            runlevels:在哪些级别下运行此任务#,##,可以为空,表示所有级别
            action:在什么条件下运行此任务
            process:任务

        action:
            wait:切换至此级别运行一次
            respawn:此process终止,就重新启动之
            initdefault:默认运行级别;process省略
            sysinit:设定系统初始方式,此处一般指为/etc/rc.d/rc.sysinit

    2.根据以上配置文件当中所定义运行级别以及参数去执行/etc/rc.d/rc.sysinit进行系统的初始化,/etc/rc.d/rc.sysinit所做的事情主要以下几点
        (1)根据配置文件中的设定来配置主机名(去读/etc/sysconfig/network文件中HOSTNAME进行)
        (2)打印文本欢迎信息
        (3)挂载所有定义在/etc/fstab文件中的文件系统
        (4)激活swap设备
        (5)激活SELinux和udev
        (6)检测根文件系统,并实现以读写方式重新挂载
        (7)设置系统时钟
        (8)根据/etc/sysctl.conf文件设定内核参数的值
        (9)激活LVM和RAID设备
        (10)加载额外的设备驱动程序
        (11)清理操作

    3.根据默认运行级别执行/etc/rc.d/rc脚本
        /etc/rc.d/rc脚本根据默认运行级别去启动或关闭/etc/rc.d/rc#.d目录下的所有脚本
            K*:要停止的服务;k##*,优先级,数字越小,越是优先关闭;依赖的服务先关闭,而后关闭被依赖的
            S*:要启动的服务;S##*,优先级,数字越小,越是优先启动,被依赖的服务先启动,而依赖的服务后启动
        rc脚本:接受一个运行级别数字为参数
            /etc/init.d/*(/etc/rc.d/init.d/*)脚本执行方式
                # /etc/init.d/SRV_SCRIPT {start|stop|restart|status}
                # service SRV_SCRIPT {start|stop|restart|status}

            chkconfig命令:管控/etc/init.d目录下每个脚本在各级别下的启动或关闭状态
                查看:chkconfig --list [NAME]
                添加:chkconfig --add SRV_NAME
                    能被添加至服务脚本定义格式之一:
                        #!/bin/bash
                        #
                        # chkconfig: LLL NN NN
                        # description:
                删除:chkconfig --del SRV_NAME
                修改指定的连接类型:
                    chkconfig [--level LEVELS] name <one|off|reset>
                        --level LEVELS:指定要控制的运行级别,默认为2345
    4.执行/etc/rc.d/rc.local脚本
        正常级别下,最后启动的一个服务S99local没有连接至/etc/init.d/下的某脚本,而是链接至了/etc/rc.d/rc.local脚本;因此,不便或不需写为服务脚本的程序期望能开机自动运行时,直接放置于此脚本文件中即可
    5.在完成系统所有先关服务启动之后,接下来Linux就会启动终端或者是X Window来向用户提供登录界面
        根据/etc/init/tty.conf文件中的配置启动一个应用程序-----login
        如果默认运行级别为5,会启动一个图形虚拟终端,附加X应用程序

用户空间的启动流程:/sbin/init

设置默认运行界别 --> 运行系统初始化脚本,完成系统初始化 --> 关闭对应级别下需要停止的服务,启动对应级别下需要开启的服务 --> 设置登录终端 --> login

系统启动流程简要总结

POST加电自检 --> Boot Sequence(BIOS) --> Boot Loader(GRUB) --> kernel(ramfs) --> rootfs(readonly) --> switchroot --> /sbin/init --> (/etc/inittab, /etc/init/*.conf) --> 设定默认运行级别 --> 初始化系统脚本(/etc/rc.d/rc.sysinit) --> 关闭或启动对应级别下的服务(/etc/rc.d/rc#.d/) --> 启动终端程序

原创文章,作者:zhai796898,如若转载,请注明出处:http://www.178linux.com/46531

(0)
zhai796898zhai796898
上一篇 2016-09-15
下一篇 2016-09-15

相关推荐

  • shell脚本之until循环

    一、用until实现下列脚本 1、每隔3秒钟到系统上获取已经登录的用户的信息;如果发现用户hacker登录,则将登录时间和主机记录于日志/var/log/login.log中,并提示该用户退出系统。 #!/bin/bash #author:jackCui #description:Find out if the sys…

    Linux干货 2016-08-18
  • 源码包编译安装

    程序包编译安装:      Application-VERSION-release.src.rpm–> 安装后,使用rpmbuild命令制作成二进制格式的rpm包,而后再安装      源代码 –> 预处理 –> 编译 &#8…

    Linux干货 2016-08-23
  • Linux用户及权限管理

    Linux用户及权限管理 当我们用ls -al查看一个文件的详细信息的时候会显示出一个有七个字段的文件详细信息,现在我们来了解下这七个字段各自代表的意义 drwxr-xr-x 18 root root 4096 12月 16 15:25 .config 我们先来说明这七段分别表示什么每个字段我们用 | 隔开 drwxr-xr-x | 18 | root | …

    Linux干货 2016-12-19
  • Redis学习手册(持久化)

    一、Redis提供了哪些持久化机制:     1). RDB持久化:     该机制是指在指定的时间间隔内将内存中的数据集快照写入磁盘。         2). AOF持久化:     该机制将以日志…

    Linux干货 2015-02-25
  • LVM逻辑卷管理相关命令的用法

    前提:创建分区,文件或添加硬盘作为LVM的物理卷 pv(物理卷) 命令用法 1、pvcreate创建pv pvcreate -s    指定PE大小,默认为4M 2、pvremove删除pv 3、pvs,pvdisplay显示pv pvs 显示pv摘要 pvdisplay 详细显示pv 4、pvmove:把卷组中一个物…

    Linux干货 2016-08-30
  • MySQL常见备份与恢复方案

    MySQL常见备份方案有以下三种:        mysqldump + binlog        lvm + binlog          xtrabac…

    Linux干货 2015-10-01