CentOS系统启动流程

1.png 

 

Linux系统的组成部分

  1、动态视角:内核+根文件系统
  2、静态视角:磁盘分区+文件

Linux运行中的系统环境

  1、用户空间:应用程序(进程或线程)
  2、内核空间:内核代码(系统调用)

内核设计流派:

  *单内核设计:把所有功能集成于同一个程序,如:Linux
  *微内核设计:每种功能使用一个单独的子系统实现,如:windows

Linux内核特点

  1、支持模块化:.ko(kernel object)
  2、支持模块运行时动态装载或卸载

Linux内核的组成

  1、核心文件:/boot/vmlinu-VERSION-release
  2、ramdisk:中间临时根文件系统,动态创建出来的,使用缓冲和缓存来加速对磁盘上的文件访问
    CentOS 5:/boot/initrd-VERSION-release.img
    CentOS 6、7:/boot/initramfs-VERSION-release.img
  3、模块文件:/lib/modules/VERSION-release

CentOS系统初始化流程(内核级别)

  POST –> BootSequence(BIOS)–> BootLoader(MBR)–> kernel(ramdisk)–> rootfs(readonly)–> /sbin/init(/etc/inittab)

第一步、POST:加电自检,检查硬件设备是否存在

  1、用于实现POST的代码在主板上ROM(CMOS)芯片上。
  2、主板上的ROM(CMOS):主板上的一块可读写的并行或串行FLASH芯片,是用来保存BIOS的硬件配置和用户对某些参数的设定。(BIOS设置程序一般都被厂商整合在芯片中,因此BIOS设置有时也被叫做CMOS设置)  

第二步、Boot Sequence:按次序查找各引导设备,第一个有引导程序的设备即为本次启动要用到的设备

  BIOS:Basic Input Output System,基本输入输出系统。它保存着计算机最重要的基本输入输出的程序、开机后自检程序和系统自启动程序,从CMOS中读写系统设置的具体信息。 其主要功能是为计算机提供最底层的、最直接的硬件设置和控制 

第三步、BootLoader:引导加载器,程序

  提供一个菜单,允许用户选择要启动的系统或不同的内核版本,把用户选定的内核装载到RAM中的特定空间中,解压、展开,而后把系统控制权移交给内核。
    *Windows上的引导加载器:ntloader
    *Linux上的引导加载器:
      LILO:短小精悍的linux加载器,1024柱面之后无法加载,现在多用于安卓手机启动。
      GRUB:GRand Unified Bootloader,统一引导加载器
         GRUB 0.X(CentOS 5/6):Grub Legacy
         GRUB 1.X(CentOS 7)::Grub2,完全重写,设计理念上很大改变

MBR:Master Boot Record,主引导记录

  ext系列及GPT系列的文件系统的bootloader都在MBR中的前446个字节,MBR为该磁盘的第一个扇区(1st stage),共512字节。

    MBR的组成:512bytes
      446bytes:bootloader
      46bytes:fat(GPT文件系统中不同)
      2bytes:55AA(分区表有效性标识)

GRUP引导阶段:

  这时候就可以看到我们的Centos系统了,但是一般都不需要操作,会自动启动系统。其实我们也可以自己手动启动系统的。

  加载运行GRUB共可分为三步: 
    1、bootloader:1st stage,位于MBR中,为了引导2nd stage。
    2、Partition:filesystem driver,1.5stage,mbr之后的扇区,让stage1中的bootloader能识别stage2所在在分区上的文件系统。
    3、Partition:/boot/grub,2nd stage,位于boot基本磁盘分区中,GRUB的引导程序。

  stage2及内核等通常放置于一个基本磁盘分区
    功用:
     (1)提供菜单、并提供交互式接口
        e:编辑模式,用于编辑菜单
        c:命令模式,交互式接口
     (2)加载用户选择的内核或操作系统
        运行传递参数给内核
        可隐藏此菜单
     (3)为菜单提供了保护机制
        为编辑菜单进行认真
        为启用内核或操作系统进行认证

  如何识别设备:
     (hd#,#)
        hd#:磁盘编号,用数字表示,从0开始编号
        #:分区编号,用数字表示,从0开始编号

  grub的命令行接口:

	e:编辑模式,用于编辑菜单
	c:命令模式,交互式接口
	
	常用命令:
		help:获取帮助列表
		help KEYWORD:详细帮助信息
		find(hd#,#)/PATH/TO/SOMEFILE
		root(hd#,#)
		kernel /PATH/TO/SOMEFILE:设定本次启动时用到的内核文件,额外还可以添加许多内核支持使用的cmdline参数
			例如:init=/path/to/init,selinux=0
		initrd /PATH/TO/INITRAMFS_FILE:设定为选定的内核提供额外文件的randisk
		boot:引导启动选定的内核

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

  配置文件:/boot/grub/grub.conf

     配置项:
	 default=#: 设定默认启动的菜单项;落单项(title)编号从0开始;
	 timeout=#:指定菜单项等待选项选择的时长;
	  splashimage=(hd#,#)/PATH/TO/XPMPICFILE:指明菜单背景图片文件路径;
	  hiddenmenu:隐藏菜单;
	  password [--md5] STRING: 菜单编辑认证;
	  title TITLE:定义菜单项“标题”, 可出现多次;用来引导多个内核或者操作系统
	      root (hd#,#):grub查找stage2及kernel文件所在设备分区;为grub的“根”; 
	      kernel /PATH/TO/VMLINUZFILE [PARAMETERS]:启动的内核
	      initrd /PATH/TO/INITRAMFSFILE: 内核匹配的ramfs文件;

 

第四步、kernel(ramdisk),加载内核

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

  ramdisk: 
    *Linux内核的特性之一:使用缓存和缓存来加速对磁盘上的文件访问
    *辅助性文件,并非必须,这取决于内核是否能直接去的rootfs所在的设备
      目标设备驱动,例如SCSI设备的驱动
      逻辑设备驱动,例如LVM设备的驱动
      文件系统,例如xfs文件系统
 
    *ramdisk是一个简装版的根文件系统

用户空间的启动流程,/sbin/init(/etc/inittab)

  设置默认运行级别–>运行系统初始化脚本,完成系统初始化–>关闭对应级别下需要停止的服务,启动对应级别下需要开启的服务–>设置登录终端[–>启动图形终端]

  init程序的类型:
    CentOS 5-:SysV init
      配置文件:/etc/inittab
    CentOS 6:Upstart
      配置文件:/etc/inittab
           /etc/init/*.conf
    CentOS 7:Systemd
      配置文件:/usr/lib/systemd/system/
           /etc.systemd/system/

第五步、设置默认运行级别

  运行级别:为了系统的运行或维护等目的而设定的机制
    0-6:7个级别
      0:关机,shutdown
      1:单用户模式(single user),root用户无需认证,维护模式 
      2:多用户模式(multi user),会启动网络功能,但不会启动NFS,维护模式
      3:多用户模式(multti user),完全功能模式,文本界面
      4:预留级别,目前无特别使用目的,但习惯以同3级别功能使用
      5:多用户模式(multti user),完全功能模式,图形界面       

                     6:重启,reboot
    默认级别:3,5
    级别切换:init #
    级别查看:who -r ,runlevel

第六步、系统初始化

  内核加载完毕,会运行init程序,init进程起来后,系统启动的控制权移交给init进程

  /sbin/init进程是所有进程的父进程,当init起来之后,它首先会读取配置文件/etc/inittab,进行以下工作:
    1.执行系统初始化脚本(/etc/rc.d/rc.sysinit),对系统进行基本的配置,以读写方式挂载根文件系统及其它文件系统,到此系统基本算运行起来了,后面需要进行运行级别的确定及相应服务的启动;
    2.确定启动后进入的运行级别;
    3.执行/etc/rc.d/rc,该文件定义了服务启动的顺序是先K后S,而具体的每个运行级别的服务状态是放在/etc/rc.d/rcn.d(n=0~6)目录下,所有的文件均链接至/etc/init.d下的相应文件。
    4.有关key sequence的设置
    5.有关UPS的脚本定义
    6.启动虚拟终端/sbin/mingetty 
    7.在运行级别5上运行X

  配置文件:/etc/inittab

	
	每行定义一直action以及与之对应的process
		id:runlevels:action:process
			id:一个任务的标识符
			runlevels:在哪些级别启动此任务;#,###,也可以为空,表示所有级别
			action:在什么条件下启动此任务
			process:任务
		
		action:
			wait:等待切换至此任务所在的级别时执行一次
			respawn:一旦此任务终止,就自动重新启动之
			initdefault:设定默认运行级别,此时,process省略
			sysinit:设定系统初始化方式,此处一般为指定/etc/re.d/rc.sysinit脚本
	
	例如:
		id:3initdefault:
		si::sysinit:/etc/re.d/rc.sysinit (设定系统初始化方式)
	
		l0:0:wait:/etc/rc.d/rc 0
		l1:1:wait:/etc/rc.d/rc 1 (等到运行级别为1时启动或关闭/etc/rc.d/rc3.d/目录下的服务脚本所控制服务)
		...
		l6:6:wait:/etc/rc.d/rc 6

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

第七步、关闭对应级别下需要停止的服务,启动对应级别下需要开启的服务

在CentOS 5和6中,系统服务都被设计为一个单独的服务脚本,可以通过运行这些脚本来管理系统服务。在/etc/rc.d/目录下面有7个rc#.d格式的子目录(#为0-6的整数,对应着七个系统运行级别)

  rc脚本:接受一个运行级别数字为参数

	脚本框架:
		for srv in /etc/re.c/rc#.d/K*,do
			$srv stop
		done
									
		for srv in /etc/re.c/rc#.d/K*,do
			$srv start
		done	

	K*:要停止的服务;K##*,优先级,数字越小,越是优先关闭,依赖的服务先关闭,然后关闭被依赖的
	S*要启动的服务;S##*,优先级,数字越小越是优先启动,被依赖的服务先启动,而依赖的服务后启动

	/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 name 
    删除:chkconfig –del name
    修改指定的链接类型:
      chkconfig [–level LEVELS] name <on|off|reset>
        –level LEVELS]:指定要控制的级别,默认为2345

     注:正常级别下,最后启动的一个服务S99local没有链接至/etc/init.d下的某脚本,而是链接至/etc/rc.d/rc.local(/etc/rc.local)脚本,因此,不变或不需写为服务脚本的程序期望能开机自动运行时,直接放置于此脚本文件中即可。

第八步:启动终端

读取/etc/init/start-ttys.conf这个配置文件,完成启动终端的流程。其中会判定,如果运行级别为5的话,在启动tty1-6之后会再启动图像终端。

总结:系统启动流程

  POST –> BootSequence(BIOS)–> BootLoader(MBR)–> kernel(ramdisk)–> rootfs(readonly)–> /sbin/init(/etc/inittab) –> 设置默认运行级别 –> 运行系统初始化脚本,完成系统初始化 –> 关闭对应级别下需要停止的服务,启动对应级别下需要开启的服务 –> 设置登录终端[–>启动图形终端]

 

原创文章,作者:[email protected],如若转载,请注明出处:http://www.178linux.com/65225

(0)
641348038@qq.com[email protected]
上一篇 2016-12-30 17:46
下一篇 2016-12-30 21:18

相关推荐

  • CentOS 7上的性能监控工具

    Linux中基于命令行的性能监控工具:dstat、top、netstat、vmstat、htop、ss、glances 1、dstat – 多类型资源统计工具(需配置epel源)   该命令整合了vmstat,iostat和ifstat三种命令。同时增加了新的特性和功能可以让你能及时看到各种的资源使用情况,从而能够使你对比和整…

    Linux干货 2016-09-07
  • 缓存需知

    Edit Web缓存核心技术点需知 5.1 HTTP首部控制 5.2 基于新鲜度检测机制: 2.1 特征1:时间局部性 2.2 特征2:空间局部性 2.3 缓存的优点 2.4 哪类数据应该被缓存 2.5 哪类数据可缓存但不应该被缓存 2.6 缓存命中率决定缓存有效性 2.7 缓存数据生命周期 2.8 缓存处理步骤 2.9 缓存和普通数据读取的区别 1. 完整…

    Linux干货 2017-06-01
  • 推荐-Nginx Proxy模块的应用之负载均衡

    Ngnix Proxy模块的应用之负载均衡 Ngnix Proxy模块的应用之负载均衡 Proxy 模块介绍 实验环境 配置Proxy Proxy 模块介绍   在我之前的文章提到过,Nginx可以提供反向代理加速、基于应用层的负载均衡并能对后端服务器做健康状态检测。下面我们就动手操作一下,看如何实现上述功能。 实验环境 主机名称 主要功能 外网地址 内网地…

    Linux干货 2016-03-27
  • 马哥教育网络班20期+第6周练习博客

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

    Linux干货 2016-07-22
  • 软件包管理

    一、软件管理程序rpm 简介:RPM是通过预编译并打包成为RPM文件格式后再加以安装的一种方式,并且还能够进行数据库的记载。 1、优点:     1、RPM内含已经编译过的程序与设置文件等数据,可以让用户免除重新编译的困扰;     2、RPM在被安装之前,会先检查系统的硬盘容量…

    Linux干货 2016-08-24
  • linux发行版的基础目录名称命名法则及功用规定。

    Linux文件系统:         Linux:glibc标准C库                  &nb…

    Linux干货 2016-10-30