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

相关推荐

  • CentOS 7上的性能监控工具

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

    Linux干货 2016-09-07
  • Linux磁盘管理

                             Linux磁盘管理 磁盘管理:  本章内容    磁盘结构    分区类型   &nbsp…

    系统运维 2016-09-02
  • 第十周 N21 总有刁民想害朕

    1、请详细描述CentOS系统的启动流程(详细到每个过程系统做了哪些事情)   加电-MBR-GRUB-/sysinit-init X 对应的服务-/etc/rc.d     MBR        读取分区表     GRUB      &…

    Linux干货 2016-09-26
  • Linux上文件管理类命令实例讲解

    下面介绍三个文件cp, mv, rm管理命令: cp命令:copy,复制命令 命令格式: cp 源文件 目标文件 复制又分为单源复制和多源复制两种情况: 单源复制 如果目标文件不存在,创建此文件,并复制数据流到此文件; [root@localhost tmp]# cp yum.log ok [root@localhost tmp]# ls -l total …

    Linux干货 2018-02-28
  • LVM逻辑卷管理练习

         小编今天要讲的内容是如何创建逻辑卷,然后扩展它、缩减它。LVM 的重点就在于可以弹性的调整文件系统的容量!所以,下面练习开始。 1、创建一个至少有两个PV组成的大小为20G的名为testvg的 VG;要求PE大小为16MB, 而后在卷组中创建大小为5G的逻 辑卷testlv;挂载至/users目录。 ①准备两个10G的…

    2017-08-26
  • 组管理与grep匹配

    1、复制/etc/skel目录为/home/tuser1,要求/home/tuser1及其内部文件的属组和其它用户均没有任何访问权限。     ~]# cp -r /etc/skel /home/tuser1     ~]# chmod -R 700 /home/tuser1 2…

    Linux干货 2016-10-17