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)
上一篇 2016-12-30 17:46
下一篇 2016-12-30 21:18

相关推荐

  • 系统基础之用户,组及权限管理

    用户及组详解 概论:   现今,大多数操作系统都是多用户(Multi-tasks)多任务(Mulit-Users)的系统.在多年前,计算机资源远没有现在这么丰富,都是多人使用同一台计算机,为了保障使用计算机的用户权益不受到损害,完成资源使用隔离,人们采取了用户机制标识使用者的方法.  每个使用者都是用户,用户是由UID进行标识,通过密码进…

    Linux干货 2016-08-04
  • 马哥教育网络班22期+第6周课程练习

    请详细总结vim编辑器的使用并完成以下练习题 vim: 模式化的编辑器 基本模式:     编辑模式:命令模式     输入模式:     未行模式:内置的命令行接口 打开文件:      …

    Linux干货 2016-09-26
  • 第四周 文件操作

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

    Linux干货 2017-12-24
  • Nginx 进阶 (ssl、fpm、rewrite、cache配置等)

    Nginx(与ssl结合配置https网站、rewrite,fastcgi配置详解) 前言 前面已经介绍过Nginx的一些基础概念,还有几个比较重要的模块:利用ssl给会话加密,利用rewrite功能灵活改写访问结果,以及利用fastcgi与php模块结合等等。 一、配置https网站 1、自建CA (1)生成私钥文件 mkdir -p /etc/pki/C…

    Linux干货 2016-12-26
  • Linux Bash Shell有关变量

    bash 创建一个子bash-n 查看是否有错误-x 逐行显示信息$:显示当前PIDPPID :显示父进程PIDSHLVL :显示当前shell是几级shellpstree 显示进程树-p 同时显示进程号ps -ef 显示进程信息 本地变量 :仅对当前SHELL有效,对子SHELL也无效环境变量:对当前SHELL及子SHELL均有效。 set 显示本地变量和…

    2017-09-16
  • OSI模型与TCP/IP协议栈

         OSI模型:     使用OSI模型的意义:      简化教学     加快发展速度     确保技术的互操作性     简化模块化设计  &nbs…

    2017-08-20