欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

CentOS 系统启动流程

程序员文章站 2024-03-23 19:25:52
...

CentOS 系统启动流程

CentOS 6 启动流程:
POST –> Boot Sequence –> Bootloader (MBR) –> kernel –> initramfs –> rootfs –> switchroot –> /sbin/init –> 加载init的配置文件 /etc/inittab –> 设置默认runlevel –> 运行系统初始化脚本 –> 按照配置文件 <启动/关闭> 对应runlevel的服务(指令) –> 启动CLI终端 –> 启动GUI终端(如果选择)

CentOS 5 和 CentOS 6 的启动流程

    Linux:kernel + rootfs

        kernel:进程管理、内存管理、网络管理、驱动管理、文件系统、安全功能。
        rootfs:根文件系统
            glibc :GNU library C ,GNU的C标准库;

        库:library,函数集合,function,调用接口

            函数:function,代码片段
                为了让函数能够更灵活的被调用,函数都有个函数名,不同函数可以接受不同类型不同数量的参数;

            调用接口:不同功能层之间的通信规则;
            头文件:描述每个库中有多少个函数、每个函数的函数名以及接受参数的类型和数量的文件

            过程调用:procedure,无返回值

            函数调用:function,必须有返回值

            【注意】库从能否执行的角度来说也是一种可执行二进制程序,但是库本身没有独立执行入口,即:库文件只能被其他有执行入口的程序调用而被动执行,本身不能主动执行。

        程序:二进制可执行文件

        内核设计流派:
            单内核设计:把所有功能集成于同一个程序,每一个功能使用内核线程来实现;
                特点:共同协作,效率高,一个地方出问题,整个内核都会受到影响;
                如:Linux
            微内核设计:每一个功能使用一个子系统来实现,通过一个*调配系统调度工作;
                特点:调度工作,效率低,故障率低,运作过程透明;
                如:Windows,Solaris

        Linux内核特点:
            支持模块化: 
                .ko  :kernel object,内核模块,内核对象
                .so  :share object,用户空间的库

            支持模块的动态装卸载:

            组成部分:
                核心文件:/boot/vmlinuz-VERSION-released
                    ramdisk:
                        centos 5 :
                            模拟为一个硬盘;
                            文件名:/boot/initrd-VERSION-release.img
                        centos 6 :
                            模拟为一个文件系统(性能更好);
                            文件名:/boot/initramfs-VERSION-release.img

                模块文件:/lib/modules/VERSION-release


CentOS 系统启动流程:

    POST :Power On and Self Testing ,加电自检 
        ROM :CMOS,互补金属氧化物半导体;
            BIOS :Basic Input and Output System

            内存组成:ROM + RAM


    BOOT Sequence :引导次序
        按次序查找各引导设备,第一个有引导程序的设备即为本次启动用到的设备,可在BIOS设置中自定义该次序;



    bootloader :引导加载器,引导程序
            windows :ntloader
            Linux :
                LILO :LInux LOader
                GRUB :GRand Uniform Bootloader
                    CentOS 5 & 6 :GRUB 0.X :GRUB Legacy
                    CentOS 7 :GRUB 1.X :GRUB 2

            GRUB是bootloader的一种。
            bootloader功能:提供一个菜单,允许用户选择要启动系统或不同的内核版本;把用户选定的内核装载至内存的特定空间中,解压、展开,并将系统控制权移交给内核,内核启动后,就完全接管了BIOS的工作,BIOS从此终止。

            MBR:
                前446位:bootloader ;
                中64位 :fat(分区表) ;
                后2位 :55AA,标记位;标记MBR是否有效
            【注意】MBR储存在磁盘上,但是不属于任何一个分区,所以只要找到磁盘就能读取该数据;BIOS系统可以直接读取设备的内容;

            【注意】内核文件和驱动程序等很多关键数据是储存在某个分区内,并处于某种文件系统中,无法直接读取,所以需要多次引导。


            GRUB :引导过程分为两阶段【其实是三阶段:第1阶段、1.5阶段和2阶段】

                1st stage :MBR上的bootloader,找到/boot目录所在分区,目的就是找到硬盘上的2阶段的内容

                1_5 stage:存储着驱动:目的就是帮助GRUB第2阶段能够识别/boot目录所在分区的文件系统类型从而访问内核和initramfs(或initramdisk)等关键数据的存储所在位置;在磁盘上存储的位置为紧跟在MBR之后。

                2nd stage :读取内核和ramfs(或ramdisk)等关键数据到内存中,BIOS移交管理权给内核。


                boot目录一般都是单独分区,但是也可以u单独分区而在root文件系统下建立,但是因为grub只能访问基本磁盘分区(即不能是lvm或raid等其他分区),所以boot目录所在分区必须是个基本分区。


        【注意】第1.5阶段和initrd(或initramfs)的异同:
            相同点:
            1、二者都是为了解决“鸡和蛋”的问题,二者的目的功能都可以看做是加载了一个辅助文件系统,辅助GRUB和kernel驱动磁盘并找到磁盘上指定位置的某些数据并读取;
            2、二者的内容都是存储了磁盘和文件系统的驱动;
            3、二者都不是从厂家出来后固定不变的,而是在安装系统过程中,根据具体工作设备环境的不同,而自动生成的。

            不同点:

            1、  stage1.5是为了BIOS提供驱动,initrd是为了Linux kernel 提供驱动;
            2、stage1.5阶段的启动次序是位于BIOS读取磁盘上的MBR中的446字节(即第1阶段)之后,第2阶段之前,
            3、initrd(或initramfs)的位置是在stage2结束,内核已经加载至内存,BIOS移交管理权给内核之后。

        【注意】kernel必须在initrd之前加载,否则系统无法启动,需要手动修改,修改方法如下:
              在错误界面按d,删除initrd一行,此时只剩下kernel一行,然后按o在kernel行下面增加一个空行,选择这个空行,按e编辑,输入initrd的信息即可,假如你的系统是centos6且boot设备名是/dev/sda1的话,可以这么写:initrd (hd0,0)/initramfs-
              此时按Tab键能够自动补全就可以了,按Enter返回上一层菜单,按b键开始引导系统。注意:如果重启的话需要重复此操作。


    kernel :系统内核是通过bootloader加载的
        自身初始化:
            探测可识别到的所有硬件设备:
            加载硬件驱动程序(有可能会借助于ramdisk加载驱动);
            以“只读”方式挂载根文件系统;
            运行用户空间的第一个应用程序:/sbin/init

            init程序的类型:
                SysV :init,CentOS 5
                配置文件: /etc/inittab

                Upstart :init,CentOS 6
                配置文件: /etc/inittab 和 /etc/init/*.conf

                Systemd :systemd,CentOS 7
                配置文件:/usr/lib/systemd/system 和 /etc/systemd/system

            init ramdisk和ramfs :此文件不是系统自带的,是安装系统时生成的

                CentOS 5 :initrd , rd即ramdisk
                CentOS 6 :initramfs

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

                ramdisk或ramfs的生成工具:
                    CentOS 5 :mkinitrd
                    CentOS 6 :mkinitrd或dracut

            【注意】1、ramdisk或ramfs与系统内核kernel不同,内核是固定不变的,而此文件是在系统安装过程中根据安装环境的不同而自动定制生成的。
                   2、也就是说,不同设备的内核可以通用,但是安装过程中生成的ramdisk或ramfs文件不一定通用。


系统初始化流程:
        POST --> BootSquence (BIOS) --> Bootloader (MBR) --> kernel (ramdisk) --> rootfs (只读) --> switchroot --> /sbin/init

    /sbin/init

    CentOS 5 :

        系统运行级别:为了系统的正常运行或维护等应用目的而设定;    
        0-6 :7个级别
            0 :关机
            1 :single,单用户模式,维护模式(使用root用户且无需登录直接进入系统)
            2 :多用户模式,维护模式,会启动网络功能,不会启动网络文件系统(NFS);需要账号密码登录才能进入系统
            3 :多用户模式,正常模式,文本界面;
            4 :预留级别,可同3级别一样使用,不常用;
            5 :多用户模式,正常模式,图形界面;
            6 :重启

        默认级别:
            3 or 5

        切换级别:
            init #

        查看级别:
            runlevel
            who -r


        配置文件:/etc/inittab

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

                id:3:initdefault:
                si::sysinit:/etc/rc.d/rc.sysinit

                l0:0:wait:/etc/rc.d/rc 0
                l1:1:wait:/etc/rc.d/rc 1
                ...
                l6:6:wait:/etc/rc.d/rc 6

            说明:rc 3 意味着读取/etc/rc.d/rc3.d/ 目录,类似目录名对应运行级别,如 rc0.d/ - rc6.d/ ,该目录下的文件有如下特征:

            k* :k##* :k代表停止服务队列标识,##代表停止次序,
                数字越小,越优先运行,数字越小的服务,通常优先停止本服务,然后为本服务提供环境的其他服务才可以停止;
            s* :s##* :s代表启动服务队列标识,##代表启动次序,
                数字越小,越优先运行,数字越小的服务,通常优先启动,为其他服务提供依赖环境;

        对于同一个服务来说,如果处于k状态是开头的“ ## ”数字越大,则同一个文件变成s状态时,开头的数字“ ## ”就越小。

            如 :对于NetworkManager服务来说,停止态时的文件名为:K23NetworkManager,开启态的文件名为:S24NetworkManager 。


    chkconfig命令:

        查看服务在所有级别的启动或关闭的设定情形:
            chkconfig [--list] [--type type][name]

        添加:
            SysV的服务脚本放置于/etc/rc.d/init.d(或目录:/etc/init.d)

            chkconfig --add name

                如:查看某服务在各运行级别的状态
                    ]# chkconfig --list httpd
                    httpd           0:off   1:off   2:on    3:on    4:on    5:on    6:off


        将一个脚本或可执行程序变成服务,加入服务列表,然后就可以使用service或chkconfig命令管理服务
                ~]# vim /etc/rc.d/init.d/test-srv
                #!/bin/bash
                #
                # chkconfig : 345 66 33
                # description: test srv script
                echo "hello"

                ~]# chmod +x /etc/rc.d/init.d/test-srv
                ~]# chkconfig --add testsrv
                ~]# chkconfig --list testsrv   

            【注意】345 代表在3,4,5运行级别下状态为 S ,在剩余的级别下状态为 K ,66代表 S66 启动运行次序,33代表 K33停止次序;                         

        删除:
            chkconfig --del name    

        修改其制定的连接类型:
            chkconfig [--level level] name <on|off|reset>
                    --level LLLL on :如果省略LLLL时结果为开启2,3,4,5

        【注意】正常级别下,最后自动一个服务为S99local没有链接至/etc/rc.d/init.d一个服务脚本,而是指向/etc/rc.d/rc.local脚本,因此,不便或无需写为服务的可执行程序可以置于此/etc/rc.d/init.d/目录,想开机启动时自动运行的命令,可直接置于此/etc/rc.d/rc.local文件中。


    设置终端及登录:        
        tty1:2345:respawn:/usr/sbin/mingetty tty1
        tty2:2345:respawn:/usr/sbin/mingetty tty2
        ...
        tty1:2345:respawn:/usr/sbin/mingetty tty6

        mingetty会调用login程序


        /etc/rc.d/rc.sysinit :系统初始化脚本
            (1) 设置主机名
            (2) 设置欢迎信息
            (3) **udev和selinux
            (4) 挂载/etc/fstab文件中功能定义的文件系统
            (5) 检测根文件系统,并以读写方式重新挂载根文件系统
            (6) 设置系统时钟
            (7) **swap设备
            (8) 根据/etc/sysctl.conf文件设置内核参数
            (9) **lvm及soft raid设备
            (10)加载额外设备的驱动程序
            (11)清理操作


    CentOS 5 用户空间启动流程总结:
        /sbin/init --> /etc/inittab——设置默认运行级别——读取运行系统初始化脚本(即 /etc/rc.d/rc.sysinit )——完成系统初始化——关闭对应需要关闭的服务,启动需要启动的服务——设置登录终端 --> 启动登录程序

        【notes】整个用户空间的启动过程只用了一个配置文件 /etc/inittab ,第一个配置文件调用了另一个配置文件 /etc/rc.d/rc.sysinit 。


    CentOS 6 :              
        /sbin/init              
            init程序为:upstart,其配置文件:
                /etc/inittab , /etc/init/*.conf

                注意:/etc/init/*.conf 文件语法,遵循 upstart 配置文件语法格式,但向下兼容。


    CentOS 6 流程总结:
        /sbin/init --> /etc/inittab——设置默认运行级别 --> 读取系统初始化配置文件 /etc/init/*.conf --> 完成系统初始化 --> 启动登录程序


GRUB(Boot Loader):

        grub :GRand Unified Bootloader
            grub 0.x : grub legacy
            grub 1.x : grub2

            二者完全不同,无继承关系,只是名字类似;

        grub legacy:
            stage  1  :mbr
            stage 1_5 :mbr之后的扇区,让stage1中的bootloader能识别stage2所在的分区上的文件系统;
            stage  2  :磁盘分区(/boot/grub/)

            grub配置文件:/boot/grub/grub.conf <-- /etc/grub.conf (软链接)

            stage2及内核等通常放置于一个基本磁盘分区,不会放在lvm或raid上;

                stage2功用:
                (1) 提供菜单、并提供交互式接口
                    e :编辑模式,用于编辑菜单
                    c :命令模式:内置交互式命令行接口
                (2) 加载用户选择的内核或操作系统
                    允许传递参数给内核
                    可以隐藏此菜单
                (3) 为菜单提供了保护机制
                    为编辑菜单进行认证
                    为启动内核或操作系统进行认证

            如何识别设备:
                (hd#,#)
                    hd# :数字代表磁盘编号
                    #   :分区编号
                        如(hd0,0)

            grub的命令行命令:
                help :获取帮助列表
                help KERWORD :详细帮助信息
                find (hd#,#)/PATH/TO/SOMEFILE :寻找某文件
                root (hd#,#) :设定根设备
                kernel /PATH/TO/KERNEL_FILE :设定本次启动时用到的内核文件并设定内核参数;
                    如:
                        init=/path/to/init
                        selinux=0
                initrd /PATH/TO/INITRAMFS_FILE :设定为选定的内核提供额外文件的ramdisk;
                boot :引导启动选定的内核

                手动在grub命令行接口启动系统:
                    grub> root (hd#,#)
                    grub> kernel /vmlinuz-VERSION-RELEASE ro root=/dev/DEVICE
                    grub> initrd /initramfs-VERSION-RELEASE.img
                    grub> boot

            grub配置文件:/boot/grub/grub.conf
                配置项:
            default=#   :设定默认启动的菜单项,菜单项默认从0开始
            timeout=#   :指定等待时长;
            password --encrypted STRING     :菜单编辑前认证
            title TITLE :定义菜单项标题

            kernel (hd#,#)/PATH/TO/VMLINUZ_FILE [PARAMETERS]    :内核
            initrd (hd#,#)/PATH/TO/INITRAMFS_FILE               :辅助文件
            password --encrypted STRING     :启动选定内核或操作系统前的认证

        生成认证STRING命令:
            grub-crypt   :输入两次密码,会生产sha512类型的STRING