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

 

原创文章,作者:641348038@qq.com,如若转载,请注明出处:http://www.178linux.com/65225

(0)
641348038@qq.com641348038@qq.com
上一篇 2016-12-30
下一篇 2016-12-30

相关推荐

  • N25第六周博客作业

    第六周博客作业   请详细总结vim编辑器的使用并完成以下练习题 1、 复制/etc/rc.d/rc.sysinit文件至/tmp目录,将/tmp/rc.sysinit文件中的以至少一个空白字符开头的行的行首加#; :%s@^\([[:space:]]\+\)@#\1@ig    2、 复制/boot/grub/grub.con…

    Linux干货 2017-01-10
  • UEFI原理小结

    1. UEFI 和 BIOS        UEFI 和 BIOS它们都可以认为是一种烧录了不同程序的PC固件,它们都可以用来启动系统,并且UEFI可兼容MBR,并直接支持GPT;BIOS是IBM PC兼容机中常用的一种固件; UEFI是Intel开发和发布的EFI的继任者,它由UEFI论…

    Linux干货 2016-05-01
  • Linux基础知识(二)-bash基础特性,文件管理命令

    1、Linux上的文件管理类命令都有哪些,其常用的使用方法及相关示例演示。 2、bash的工作特性之命令执行状态返回值和命令行展开所涉及的内答及其示例演示 4、文件的元数据信息有哪些,分别表示什么含义,如何査看?如何修改文件的时间戳信息。 5、如何定义一个命令的别名,如何在命令中引用另一个命令的执行结果? 6、显示/var目录下所有以l开头,以一个小写字母结…

    Linux干货 2016-09-26
  • 马哥教育网络第20期第八周课程练习

    1、 请描述网桥、集线器、二层交换机、三层交换机、路由器的功能、使用场景与区别。在局域网内,大量主机之间的通信通过arp广播来连接目的主机地址的,为减少在共享环境里的介质,网桥的作用是将广播域划分为多个小的冲突域,但广播域没有变。工作在OSI数据链路层,端口很少。基于软件。可以处理上层事务。 集线器:对接收到的信号进行再生整形放大,扩大网络传输距离,工作在O…

    Linux干货 2016-08-15
  • 计算机的组成及其功能

    硬件部分     运算器:对数据进行处理,如基本四则运算和逻辑运算     控制器:协调整个计算机资源的运行,调试各个命令的执行顺序     存储器:数据的保存位置,可分为内存和其它各种非断电丢失的硬盘    …

    Linux干货 2016-10-30
  • 马哥教育21期网络班—第12周课程+练习—-LAMP练习

    1、请描述一次完整的http请求处理过程; (1) 建立或处理连接:接收请求或拒绝请求 (2) 接收请求: 接收来自于网络的请求报文中对某资源的一次请求的过程; 持久连接:接收到请求不会断开这个请求 非持久连接:一个连接请求断开一次 并发访问响应模型(Web I/O): 单进程I/O结构:启动一个进程处理用户请求,而且一次只处理…

    Linux干货 2016-09-26