博文二十九:CentOS系统启动流程

一、简述

    CentOS启动流程

f3f63cb35e6890248a3fb98d7c48465d4f4.jpg

二、使用

    1.POST(Power On Self Test)

        计算机接通电源后,系统进行的一个自我检查的例行程序,这个程序通常称为POST(加电自检),此过程会对系统几乎所有硬件进行检测。此时系统的控制权就交由BIOS来完成

        POST大致检测过程为:加电-CPU-ROM-BIOS-System Clock-DMA-64KB RAM-IRQ-显卡等。

        ( 此过程详细参考:http://blog.sina.com.cn/s/blog_61746be701017x3g.html )

    2.BOOT Sequence

        BIOS按次序查找各个引导设备,找到的第一个有引导程序的设备即为本次启动用到的设备。

        查找引导实际上是在磁盘的MBR中查找引导加载器/引导程序(bootloader)。

        2.1)MBR(Master Boot Record)

    硬盘的0柱面、0磁头、1扇区称为主引导扇区、MBR(主引导记录),其总共大小为512字节,由三部分组成。

组成部分大小(字节)
bootloader(主引导程序)最大为446
DPT(硬盘分区表)64
55AA(分区有效标志)2

    此阶段的过程是:BIOS将找到MBR,然后将找到MBR中的bootloader加载到内存中,此阶段也被称之为GRUB的第一阶段(stage1)。

        2.2)bootloader

    bootloader就是一段小程序,通过这段小程序可以初始化硬件设备,建立内存空间的映射图,将系统的软硬件环境带到一个合适的状态,为后期调用操作系统内核做准备。 

bootloader分类

系统类别
Windowsntloader
Linux

LILO(LInux LOader)

GRUB(GRand Uniform Bootloader)

    此处仅简单介绍GRUB,GRUB功用如下:

        提供一个菜单,允许用户选择要启动系统或不同的内核版本,把用户选定的内核装在到内核中特定的空间中,解压、展开,并把系统控制权交给内核。

    此阶段的过程对于GRUB来说,有两个阶段:

        stage1.5:加载MBR之后的扇区,识别stage2所在分区上的文件系统。

        stage2:读取/boot/grub/grub.conf或menu.ls等配置文件,为用户显示GRUB选项、信息,确定内核启动参数等。

    3.Kernel(ramdisk)

            通过上一阶段,kernel已经被读到,其内存上的环境也已经准备好了,此时kernel开始解压缩,并将解压后的内核放置在内存中,调用start_kernel()函数来启动一系列的初始化函数并初始化各种设备,完成Linux核心环境的建立。Linux内核建立后,基于Linux的程序则可以正常运行。

    此阶段中也被称之为kernel的自身初始化,其主要操作有:

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

        加载硬件驱动程序(因为内核解压缩装载在内存中,所以内核要足够小,驱动就未被封装在内核中,此文件称为核心文件,其核心文件一般路径及格式:/boot/vmlinuz-VERSION-release),有可能会借助于ramdisk(ramdisk,即虚拟内存盘,用于通过软件将一部分内存(RAM)模拟为硬盘来使用的一种技术)来加载驱动。

        以只读方式挂载根文件系统。

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

    4.Init/Systemd

        init程序是Linux系统不可获取的程序之一,init进程是由内核启动的用户级进程,其路径在/sbin/init或/bin/sh。内核通过启动第一个init程序(init进程编号为1)的方式来完成其它进程的引导。

        systmed 是一个用户空间的程序,属于应用程序,不属于 Linux 内核范畴。Systemd 是 Linux 系统中最新的初始化系统(init),它主要的设计目标是克服 SysV init 固有的缺点,提高系统的启动速度。

        4.1)进程编号为“1”的程序分类
系统类型第一个程序配置文件
CentOS 5SysVinit/etc/inittab
CentOS 6Upstartinit/etc/inittab,/etc/init/*.conf
CentOS 7Systemdsystemd/usr/lib/systemd/system,/etc/systemd/system

            SysV、Upstart、Systemd三者比较(Systemd加速启动原理)

fd3239cc1c999baaef93227c7277964680f.jpg

        4.2)此阶段涉及流程

            4.2.1)CentOS 5 、CentOS 6

f8fb99308bcf06edd2d44f40e187c860553.jpg

        CentOS 5 init程序为:SysV    配置文件为 /etc/inittab

            读取/etc/inittab文件( inittab文件里面定义了系统默认运行级别 )

# 读取/etc/inittab文件的功用
  初始运行级别(RUN LEVEL)
  系统初始化脚本
  对应运行级别的脚本目录
  定义UPS电源终端/恢复脚本
  在虚拟控制台生成getty,以生成终端
  在运行级别5初始化X

            运行级别:为了系统的运行或维护等应用目的而设定

        0-6(7个级别)

级别功用
0关机
1单用户模式(root,无须登录),single,维护模式
2多用户模式,会启动网络功能,但不会启动NFS,维护模式
3多用户模式,正常模式,文本界面
4预留级别,可同级别3
5多用户模式,正常模式,图形界面
6重启

    级别查看

默认级别 :3,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 0 --> 意味着读取/etc/rc.d/rc0.d/
K*:K##*:##运行次序,数字越小,越先运行,数字越小的服务,通常为依赖到别的服务
S*:S##*:##运行次序,数字越小,越先运行,数字越小的服务,通常为被依赖到的服务

# K*与S*通常是脚本应用的方式,例如
for srv in /etc/rc.d/rc0.d/K*;do
  $srv stop
done

for srv in /etc/rc.d/rc0.d/S*;do
  $srv start
done

    chkconfig命令

        查看服务在所有级别的启动或关闭设定情况

# 格式
chkconfig [--list] [name]
# 添加(SysV 的服务脚本放置于/etc/rc.d/init.d (/etc/init.d))
  chkconfig --add name
    #!/bin/bash
    #
    # chkconfig:LLLL nn nn
# 删除
  chkconfig --del name
# 修改指定的链接类型
  chkconfig [--level levels] name <on|off|reset>
     --level LLLL:指定需要设置的级别,省略时表示2345

    系统初始化

        系统初始化脚本,完成系统初始化

/etc/rc.d/rc.sysinit :系统初始化脚本
# 功用
  设置主机名
  设置欢迎信息
  激活udev和selinux(可以在grub.conf中的kernel行添加selinux=0,以此来关闭selinux)
  挂载/etc/fstab文件中定义的文件系统
  检测根文件系统,并以读写方式重新挂载根文件系统
  设置系统时钟
  激活swap设备
  根据/etc/sysctl.conf文件设置内核参数
  激活lvm及software raid设备
  加载额外设备的驱动程序
  清理操作

    启动对应服务

    各种服务存在的位置/etc/rc#.d/文件,其中名称为“S”开头代表开机启动的服务,名称为“K”开头的是关机要执行的任务。#代表数字,一个数字代表一个运行级别,即上述的级别0-6(7个运行级别)。

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

    注意:/etc/init/*.conf文件语法遵循upstart配置文件的语法格式。

    4.2.2)CentOS 7

3017f471f39c5789b9d36046cdcd296fe73.jpg

基本上可以参考CentOS 5与CentOS 6系统进行对比。

执行initrd.target
    包括挂载/etc/fstab文件中的系统,此时挂载后,就可以切换到根目录了

从initramfs根文件系统切换到磁盘根目录

systemd执行默认target配置
    centos7表面是有“运行级别”这个概念,实际上是为了兼容以前的系统,每个所谓的“运行级别”都有对应的软链接指向,默认的启动级别时/etc/systemd/system/default.target,根据它的指向可以找到系统要进入哪个模式。 

    模式:

    0 ==> runlevel0.target, poweroff.target

    1 ==> runlevel1.target, rescue.target

    2 ==> runlevel2.target, multi-user.target

    3 ==> runlevel3.target, multi-user.target

    4 ==> runlevel4.target, multi-user.target

    5 ==> runlevel5.target, graphical.target

    6 ==> runlevel6.target, reboot.target

systemd执行sysinit.target

    在CentOS6上是被叫做rc.sysint程序,初始化系统及basic.target准备操作系统

systemd启动multi-user.target下的本机与服务器服务

systemd执行multi-user.target下的/etc/rc.d/rc.local

Systemd执行multi-user.target下的getty.target及登录服务

getty.target是启动终端的systemd对象

    如果到此步骤,系统没有被指定启动图形桌面,到此就可以结束了,如果要启动图形界面,需要在此基础上启动桌面程序。

    5.执行/bin/login

        执行/bin/login程序,等待用户登录

三、补充

    正常级别下,最后启动的一个服务(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
tty3:2345:respawn:/usr/sbin/mingetty tty3
tty4:2345:respawn:/usr/sbin/mingetty tty4
tty5:2345:respawn:/usr/sbin/mingetty tty5
tty6:2345:respawn:/usr/sbin/mingetty tty6
#  mingetty 会调用login程序

        系统启动时的操作,其运行级别应该设置为1。

 

转载于:https://my.oschina.net/comics/blog/2250191

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值