CentOS6系统启动流程

概述

    了解系统的启动流程,有助于我们了解Linux系统上的一些工作原理,有助于我们深入的理解一个系统的运作方式,那么本篇就以CentOS6系统为例,介绍一下有关Linux系统启动相关的内容,分为一下几个部分:

    1、Linux系统的一些基础概念

    2、CentOS6上的启动流程概述

    3、系统启动相关故障恢复和系统服务脚本案例

第一章    Linux系统启动相关的基本概念

    1、Linux系统的组成部分:内核+根文件系统

        内核的功能:进程管理、内存管理、网络协议栈、文件系统、驱动程序、安全功能(加密解密的栈、SELINUX等)

    2、运行中的系统环境可分为两层:内核空间、用户空间

        用户空间:一般执行的是应用程序(进程或线程)

        内核空间:执行的是内核代码,当用户空间的程序需要用到特权指令,硬件调度等内核级别操作时,通过系统调用,向内核发起申请,由内核执行后,将结果返回给用户空间的程序

    3、内核设计流派:

        单内核设计:把所有功能集成于同一个程序,linux是单内核

        微内核设计:每种功能使用一个单独的子系统实现,windows是微内核

    4、Linux内核特点:

        支持模块化:虽然是单内核设计,把所有功能集成于同一个程序,但是linux支持模块化的设计,将一些非关键性的功能等,做成模块,一般内核模块文件为XXX.ko  (kernel object)

        支持模块运行时动态装卸载:当一个模块需要用到时,可以动态对其进行装载,用不到时,可以动态进行卸载,这样实际上就类似微内核的设计理念

    5、Linux内核的组成部分:

        核心文件:如:/boot/vmlinuz-2.6.32-642.el6.x86_64 

        ramdisk:因为系统启动时,根文件系统的一定是在某个磁盘分区上,而内核如果没有编译该根文件系统的相关驱动,这样就会导致无法正常启动系统;并且内核需要加载的各种模块文件,其都在/lib/modules/目录下,此目录必然在/根下,而根无法驱动,也会造成相关内核模块无法正常运行,进而也不能启动系统,此时,就需要借助ramdisk来完成对根文件系统的驱动。而ramdisk是在/boot目录下,/boot目录是由grub的1.5阶段进行驱动的

                centos5:/boot/initrd-VERSION-RELEASE.img

                centos6、7:/boot/initramfs-VERSION-RELEASE.img

        各种模块文件:/lib/modules/内核版本号/* 

        如果安装了多个内核版本,则对应的目录下就有多个文件,或多个目录

第二章    CentOS6上的启动流程概述

    1、CentOS6上的启动流程概述

    blob.png  

    2、POST加电自检

        POST: Power-On-Self-Test,加电自检,是BIOS功能的一个主要部分。负责完成对CPU、主板、内存、硬盘子系统、显示子系统、 串并行接口、键盘、 CD-ROM光驱等硬件情况的检测。
                ROM: BIOS, Basic Input and Output System,保存着有关计算机系统最重要的基本输入输出程序,系统信息设置、 开机加电自检程序和系统启动自举程序等。
                RAM: CMOS互补金属氧化物半导体,保存各项参数的设定
                按次序查找引导设备,第一个有引导程序的设备为本次启动设备

        

    3、bootloader程序(Linux系统上为grub)

        引导过程:根据BIOS中设定的次序查找各引导设备,第一个有引导程序的设备,即为本次启动要用到的设备

        引导程序:bootloader:引导加载器、程序

                windows:叫ntloader

                Linux:

                        LILO:linux loader  现在很多android用的就是此引导程序,对1024柱面后的分区不支持 

                        GRUB:grand uniform bootloader

                                Centos6: GRUB 0.X  零点几的版本

                                Centos7: GRUB 1.X  一点几的版本

                                1.X与0.X有很大不同,故GRUB 0.X的版本被称为grub legacy,而GRUB 1.X的版本被称为Grub2

        引导程序的功能:

            提供一个菜单,允许用户选择要启动的系统或不同的内核版本;并能够把用户选定的内核,装载到内存中的特定空间中,对其进行解压展开,而后把整个系统的控制权,移交给内核

        MBR:Master Boot Record主分区不能超过4个

            MBR:一共512个字节byte,前446个字节存储bootloader,后64byte存储了分区表(fat),最后2个字节是存储着4个16进制数据,一般为55AA,表示该MBR是有效的,其他数字表示该MBR无效

            英文字符中,1个字符就需要1个字节

            GRUB:因为MBR中只有前446个字节存储bootloader,GRUB是bootloader的一种实现方式,也就是说GRUB正常情况下,只能有446个英文字符,这样对程序员来说,要求太高,故通常情况下,grub分成以下几个阶段:

                    第一阶段:存储在bootloader中

                    第1.5阶段:文件系统驱动,称为第1.5阶段,通常存储在MBR紧跟着的扇区中,用来驱动/boot分区

                    第二阶段:放在硬盘的/boot分区的/boot/grub下

                    第三阶段:加载内核

                一般情况下,系统启动时是加电自检,然后bootloader进行加载内核,但是grub风格的bootloader是先加载grub的第二阶段,就是加载磁盘中的/boot/grub,该程序就摆脱了446字节的限定,从而提供了丰富的启动接口,然后由该程序加载内核

            注意:UEFI、GPT并不适用以上理论

    4、加载内核,内核进行自身初始化

        自身初始化的步骤和功能

            <1>进行自身初始化:

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

            <2>加载硬件驱动程序;(可能会借助于ramdisk加载驱动)

            <3>以只读方式挂载根文件系统;(之所以要以只读方式挂载,是为了避免万一内核有bug,造成的文件系统损坏)

            <4>运行用户空间的第一个应用程序:/sbin/init                    

    5、ramdisk程序介绍

        Linux内核的特性之一:使用缓冲和缓存来加速对磁盘上的文件访问

        ramdisk 是一种把内存当磁盘用的机制,用来启动时加载相应的驱动等

            早期centos5上用的是initrd(就是把内存当磁盘使用),后来centos6和7换成了initramfs(内存当文件系统使用),之所以换,是因为initrd是把内存当磁盘用,但是一旦涉及到磁盘,为了加速写入和读取的速率,就会有缓冲和缓存的出现,但是ramdisk机制本身就是在内存上实现,如果再进行缓冲和缓存,就会造成系统浪费,所以,后期就换成了initramfs

        centos5上initrd的创建工具程序:mkinitrd

        centos6、7上initramfs上的创建工具程序:dracut或mkinitrd

        initrd 映像实际上是一个 RAM 磁盘,其中包含带有基本配置文件、二进制文件、库和驱动程序的小型文件系统。在这个小型文件系统中,有一个将在引导期间装入到内存中的根文件系统,还有一个用于装入系统设备驱动程序的初始化脚本;它将在加载完所有设备驱动程序后重新加载实际的根文件系统磁盘。

        在内核引导过程中,初始 RAM 磁盘(initrd)是由grub阶段 2 引导加载程序加载到内存中的,它会被复制到 RAM 中并挂载到系统上。这个 initrd 会作为 RAM 中的临时根文件系统使用,并允许内核在没有挂载任何物理磁盘的情况下完整地实现引导。由于与外围设备进行交互所需要的模块可能是 initrd 的一部分,因此内核可以非常小,但是仍然需要支持大量可能的硬件配置。在内核引导之后,就可以正式装备根文件系统了(通过 pivot_root):此时会将 initrd 根文件系统卸载掉,并挂载真正的根文件系统。

    6、系统第一个程序init

        init程序的类型:

            centos5:SysV init

                其配置文件:/etc/inittab

            centos6: Upstart

                其配置文件:/etc/inittab和/etc/init/*.conf

            centos7:Systemd

                其配置文件:/usr/lib/systemd/system/、/etc/systemd/system/

        init管理用户空间的各个程序运行,除非有需要进行内核特权级别操作时,内核才会被用户空间的各个系统调用,完成一些内核级别的操作

       

        init初始化用户空间的启动流程为:/sbin/init程序主要是通过读取/etc/inittab文件来完成一定的任务,完成的任务有:

            定义默认运行级别–>运行系统初始化脚本(/etc/rc.d/rc.sysinit)完成系统初始化–>关闭指定运行级别下的各服务,启动指定级别下需要开启的各服务–>启动tty虚拟终端,调用login程序,显示登录提示符,让终端进行登录

    7、/etc/inittab配置文件详解

        配置文件/etc/inittab的格式及其功能:

        (以centos5上的该文件为例介绍,有助于理解centos6、7上对应的文件的作用)

        每行定义一种action,以及与之对应的process

        每行的格式为id:runlevel:action:process

            id:一个任务的唯一标识符

            runlevel:在那些级别启动此任务;可以是一个数字,也可以多个数字,也可以为空(表示所有级别),例如:3或35或空

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

            process:具体执行的任务

            常见的action:

                wait  等待切换至此任务所在的级别时,执行一次(刚切换时执行)

                respawn:一旦此任务终止,就自动重新启动之

                initdefault:设定默认运行级别,此时,process省略,因为一旦有了initdefault,就表示是定义默认的运行级别,而不需要运行别的process

                sysinit:设定系统初始化方式,该action对应的process一般为指定/etc/rc.d/rc.sysinit脚本,该脚本定义了整个系统初始化时的脚本(centos5、6有用到该脚本,但centos7没有用到该脚本)

        例如:

            id:3:initdefault: 表示定义默认运行级别就是3

            si::sysinit:/etc/rc.d/rc.sysinit   表示所有级别利用/etc/rc.d/rc.sysinit脚本完成系统初始化

            tty1:2345:respawn:/usr/sbin/mingetty tty1  表示在2345运行级别启动mingetty指令,给指令传递参数tty1,一旦该程序停止,要自动重启。mingetty会调用login程序,打开虚拟终端的程序,除了minget    ty之外,还有诸如getty等

            l3:3:wait:/etc/rc.d/rc 3   表示当切换到3级别时运行/etc/rc.d/rc脚本,往脚本里传递参数为3,意味着去启动或关闭/etc/rc.d/rc3.d/目录下的服务脚本所控制的服务

    8、Linux运行级别:为了系统的运行或维护等目的而设定的机制

        0-6一共七个级别,各级别的意义:

            0:关机,shutdown

            1:单用户级别(single user),root用户,无需认证,维护模式

            2:多用户模式,带网络功能,但无nfs功能,维护模式

            3:完全多用户模式;文本界面

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

            5:完全多用户模式,图形化界面

            6:重启 reboot

        默认级别:3、5

        级别切换:init 数字

        级别查看:who -r或runlevel

    9、系统初始化脚本/etc/rc.d/rc.sysinit

        系统初始化脚本文件:/etc/rc.d/rc.sysinit的功能:

            <1>设置主机名

            <2>设置欢迎信息

            <3>激活udev和selinux(udev主要是用来创建设备文件)

            <4>挂载/etc/fstab文件中定义的所有文件系统

            <5>检测根文件系统,并以读写方式重新挂载根文件系统

            <6>设置系统时钟

            <7>根据/etc/sysctl.conf文件的设定,来设定内核参数

            <8>激活lvm及软raid设备

            <9>激活swap设备

            <10>加载额外设备的驱动程序

            <11>清理操作

    10、系统相关运行级别上的相关服务

        init在利用/etc/inittab配置文件,进行用户空间系统初始化时,会有关于默认运行级别的定义,当定义好默认运行级别,利于/etc/rc.d/rc.sysinit完成系统初始化后,就会按照运行级别,来关闭、打开相应级别下的服务

        各种服务的控制脚本程序是存放在/etc/rc.d/init.d/目录下,然后各个对应级别下要关闭或开的程序以软连接的方式存放在/etc/rc.d/rc运行级别.d/目录下

            以K开头的表示要关闭的服务,后面数字表示优先级,数字越小,越先关闭

            以S开头的表示要开启的服务,后面数字表示优先级,数字越小,越先开启

            一般是先关闭相关服务后,再开启相关服务

        /etc/rc.d/rc.local 该脚本为正常行级别的最后一个脚本,可以将一些希望开机时自动启动,但又不合适编辑成服务脚本的一些命令或程序,写在该文件中,单独成行,即可完成开机自动启动

        建议在生产环境里面,将ctrl+alt+del里面重启的快捷键禁用

        对应的文件在/etc/init/control-alt-delete.conf里,可通过/etc/inittab获知其定义信息

        /etc/rc.d/init.d/下的脚本的格式:

            这类脚本都需要在开头注释段标明:一般要接受至少start、stop、restart、status四个参数

            #!/bin/bash

            # crond    start/stop the cron daemon 标明脚本功能 ,此项可以不写

            # chkconfig:2345 11  88  标明该服务脚本初始状态下的运行级别,启动优先级,关闭优先级,必须要写

            # description:  描述

                功能代码段

                …

        chkconfig命令管理系统服务脚本

            利用chkconfig命令自动在各级别目录下创建对应的K或S的链接文件,且可以管理服务脚本的开机启动或关闭等

            要想利用chkconfig进行管理,脚本必须要满足上述注释段的要求,然后将脚本放到/etc/init.d/目录下

            然后利用"chkconfig  –add  脚本名  –level 运行级别"  将脚本添加到chkconfig可管理的列表中,不指定–level则默认是从脚本中读取运行界别的定义。

            添加完成后,可利用"chkconfig 脚本名 on|off"来管理脚本的启动或关闭 

            将脚本移除chkconfig的管理列表:chkconfig –del 脚本名

            查看所有服务脚本的运行级别的开机运行状态:chkconfig

            查看指定脚本的开机运行状态:chkconfig 脚本名

            修改脚本的运行级别:chkconfig [–level LEVELS] 脚本名  on|off|reset   表示将脚本的指定的级别是on还是off还是reset

                –level LEVELS如果不指定,默认为2345级别

        xinetd管理的服务

            service 命令:手动管理服务
            service 服务 start|stop|restart
            service –status-all
            瞬态( Transient)服务被xinetd进程所管理,进入的请求首先被xinetd代理
            配置文件: /etc/xinetd.conf、 /etc/xinetd.d/<service>(每个被xinetd管理的服务在xinetd.d下都有一个对应的控制脚本)
            用chkconfig控制的服务: chkconfig SERVICE_NAME on

第三章    系统启动相关故障恢复和系统服务脚本案例

    1、删除initramfs文件,造成系统无法启动,并恢复

        (删除initramfs文件后,如果没有重启系统,只需cd到/boot目录,然后执行mkinitrd initramfs-`uname -r`.img  `uname -r`命令,重新生成initramfs文件即可)

        步骤一、删除initramfs文件,重启系统

    1.png

    2.png

        步骤二、插入系统光盘,利用光盘引导进入紧急救援模式

    3.png

    4.png

    4.png

    5.png

    6.png

    7.png

    8.png

    9.png

    10.png

    

        步骤三、进入紧急救援模式后,chroot进入真正的根文件系统,运行mkinitrd命令生成新的initramfs文件

            (主要要切换到/boot目录下执行mkinitrd命令)

            且命令格式为:mkinitrd initramfs-`uname -r`.img  `uname -r`

            文件生成完成后,重启系统即可完成系统的进入

    11.png

    12.png

    2、破解root用户密码

        步骤一:启动系统,在启动前,按任意键,进入引导菜单界面

    1.png

        步骤二:按a键,进入grub引导编辑菜单界面,在后面添加1或者S或s或single然后回车进入单用户模式

    2.png

    3.png

        步骤三、运行passwd命令修改密码,然后运行reboot重启系统即可完成对root密码的修改

    4.png

    

    3、编写服务脚本/root/bin/testsrv.sh,完成如下要求
        (1) 脚本可接受参数: start, stop, restart, status
        (2) 如果参数非此四者之一,提示使用格式后报错退出
        (3) 如是start:则创建/var/lock/subsys/SCRIPT_NAME, 并显示“启动成功”
            考虑:如果事先已经启动过一次,该如何处理?
        (4) 如是stop:则删除/var/lock/subsys/SCRIPT_NAME, 并显示“停止完成”
            考虑:如果事先已然停止过了,该如何处理?
        (5) 如是restart,则先stop, 再start
            考虑:如果本来没有start,如何处理?
        (6) 如是status, 则如果/var/lock/subsys/SCRIPT_NAME文件存在,则显示
            “ SCRIPT_NAME is running…”
            如果/var/lock/subsys/SCRIPT_NAME文件不存在,则显示“ SCRIPT_NAME is stopped…”
            其中: SCRIPT_NAME为当前脚本名
        (7)可用chkconfig 和 service命令管理

    脚本代码为:

    !/bin/bash    
    #chkconfig:35 88 10
    #description:nwc test service
    
    FILE=/testdir/server_file
    
    function START() {
            if [ -f $FILE ];then
                    echo "$0 has been start"        
            else
                    touch $FILE && echo "Start success" || echo "Start fail"
            fi  
    }
    
    
    function STOP() {
            if [ -f $FILE ];then
                    rm -rf $FILE && echo "Stop success" || echo "Stop fail"
            else
                    echo "$0 has been stopped"
            fi  
    }
    
    function RESTART() {
            STOP
            START
    }
    function STATUS() {
            [ -f $FILE ] && echo "$0 is running..." || echo "$0 is stopped..."
    }
    
    
    case $1 in
    start)
            START
    ;;
    
    stop)
            STOP
    ;;
    
    restart)
            RESTART
    ;;
    
    status)
            STATUS
    ;;
    
    *)
            echo "Usage: $0 start|stop|restart|status"
    ;;
    esac

    将脚本拷贝到/etc/rc.d/init.d/目录下,并给予执行权限,过程和效果如下

[root@localhost ~]# cd /etc/rc.d/init.d/
[root@localhost init.d]# ll nwcservice 
-rwxr-xr-x 1 root root 644 9月   8 17:35 nwcservice
[root@localhost init.d]# chkconfig --add nwcservice
[root@localhost init.d]# chkconfig | grep "nwcservice"
nwcservice     	0:关闭	1:关闭	2:关闭	3:启用	4:关闭	5:启用	6:关闭
[root@localhost init.d]# chkconfig nwcservice on
[root@localhost init.d]# service nwcservice start
/etc/init.d/nwcservice has been start
[root@localhost init.d]# service nwcservice stop
Stop success
[root@localhost init.d]# service nwcservice restart
/etc/init.d/nwcservice has been stopped
Start success
[root@localhost init.d]# service nwcservice status
/etc/init.d/nwcservice is running...
[root@localhost init.d]# service nwcservice dsjhkdsa
Usage: /etc/init.d/nwcservice start|stop|restart|status
[root@localhost init.d]#

    

原创文章,作者:M20-1倪文超,如若转载,请注明出处:http://www.178linux.com/44783

(0)
上一篇 2016-09-09 12:11
下一篇 2016-09-09 12:36

相关推荐

  • ldd 的一个安全问题

    我们知道“ldd”这个命令主要是被程序员或是管理员用来查看可执行文件所依赖的动态链接库的。是的,这就是这个命令的用处。可是,这个命令比你想像的要危险得多,也许很多黑客通过ldd的安全问题来攻击你的服务器。其实,ldd的安全问题存在很长的时间了,但居然没有被官方文档所记录来下,这听上去更加难以理解了。怎么?是不是听起来有点不可思议?下面,让我为你细细道来。 首…

    Linux干货 2016-05-05
  • 08.04 笔记总结

    1.ps axo  user,ruser,group,rgroup,cmd  //  ruser  表示程序发起的用户,一般是指系统当前的用户  //  user  表示程序的所有者。在大数情况下,两个用户都是系统当前的用户, 之后当程序被赋予suid的时候,可能user会发生变化。 2….

    Linux干货 2016-08-08
  • 网络管理及其一些网络协议

    1,这周我们主要学的是有关网络的相关知识;下面我就介绍一下我感觉重要的一些内容。 首先介绍的是计算机网络协议的七层模型:从上到下依次分为:7,应用层(application):OSI模型的第七层,负责为操作系统或网络应用程序提供访问网络服务的接口。                …

    2017-09-02
  • tomcat配置详解

    主程序: ·tomcat ·tomcat-admin-webapps ·tomcat-webapps ·tomcat-docs-webapp ·java-1.8.0-openjdk 配置文件: 配置文件目录:/etc/tomcat 主配置文件:server.xml webapps存放位置:/var/lib/tomcat/webapps/ webapps的根目…

    2017-08-08
  • 马哥教育网络班18期+第10周课程练习

    博客作业10周.md—E:\Documents CentOS启动流程 1. 加电自检 2. 引导加载次序:BOOT Sequence 3. bootloader: 4. GRUB引导加载器 5. 进入Kernel 6. 运行init 7. 运行初始化脚本 8.启动系统服务 9. 设置登陆终端 整体总结 习题 习题1 习题2 习题3 习题4 习题5 习题6 练…

    Linux干货 2016-06-23
  • Mogilefs使用Nginx实现代理访问

    MogileFS介绍:  MogileFS是一个开源的分布式文件存储系统,由LiveJournal旗下的DangaInteracitve公司研发。可支持文件自动备非的功能,提供高可用性和高可扩展性。 MogileFS组件:  trackers:   MoglieFS的调度器,是mogileFS的核心,访问入口。  功能…

    Linux干货 2015-08-06

评论列表(1条)

  • 马哥教育
    马哥教育 2016-09-10 11:40

    一如既往的认真,认真踏实,理论部分透彻,实验部分完整,赞一个。