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

相关推荐

  • Centos 7 DNS配置及理论详解

    DNS是什么及BIND讲解内容 域名系统(英文:Domain Name System,缩写:DNS)是internet的一项服务。它作为将域名和IP地址相互映射服务,能够使人更方便地访问互联网。DNS使用TCP和UDP端口53。当前,对于每一级域名长度的限制是63个字符,域名总长度则不能超过253个字符。讲解内容:    DNS名称解析方…

    Linux干货 2016-04-25
  • ifcfg, ip, ss,配置文件 (Blog 7)

    Linux主机接入网络:
    IP/MASK
    GATEWAY
    DNS

    Linux干货 2017-11-27
  • Linux文件属性及如何修改文件属性

    ls -al:显示文件的文件名与相关属性并列出所有文件详细的权限与属性   dr-xr-x—.   7       root     root       4…

    2017-04-03
  • 磁盘管理和高级文件系统管理-习题

    高级文件系统管理-习题 1、 创建一个可用空间为40G 的RAID1 设备,要求其chunk大小为128k ,文件系统为ext4 ,有一个空闲盘,开机可自动挂载至/backup目录 [root@centos7 ~]# mdadm -C /dev/md0 -c 128 -a yes -l 1 -n 2 -x 1 /dev/sdb /dev/sdc /dev/s…

    Linux干货 2016-09-01
  • nginx 日志切割(脚本实现)

        这里主要介绍nginx日志切割.(访问日志与错误日志)     准备好一台机器,配置随意,安装nginx应用。     1. nginx安装步骤   # tar xf nginx-1…

    Linux干货 2016-07-10
  • 26期全程班-第六周博客作业

    请详细总结vim编辑器的使用并完成以下练习题 1、复制/etc/rc.d/rc.sysinit文件至/tmp目录,将/tmp/rc.sysinit文件中的以至少一个空白字符开头的行的行首加#; # cp /etc/rc.d/rc.sysinit /tmp # vim /tmp/rc.sysinit :%s@^\([[:space:]]\+\)@#\1@g 2…

    Linux干货 2017-03-07