centos6 之前的系统启动:
linux启动流程:
1)加电自检
2)读取MBR,引导加载程序grub,完成grub的三个阶段。
3)加载系统内核kernel,执行系统初始化信息。
4)启动用户空间第一个执行程序/sbin/init,并调用init的配置文件,完成初始化。
5)启动核心的外挂模块,来启动各种所需服务。
6)启动6个虚拟终端,执行/bin/login 程序,等待用户登录。
7)登录之后开始以Shell控制主机。
CMOS通电-->BIOS启动-->读取MBR-->加载程序grub-->加载内核kernel-->执行程序/sbin/init-->/bin/login
1。加载BIOS 的硬件信息,获取第一个启动设备
加电自检:Power-On-Self-Test(POST)
检测硬件设备是否正常运行。自检功能是由一个软件程序来实现的,叫做BIOS,(basic input output system),即基本输入输出系统,它被装载在一个硬件芯片CMOS上,CMOS是个硬件设备。加电过程就是给CMOS通电,然后启动其上的BIOS程序,BIOS程序会根据CMOS上的配置信息来读取其他硬件设备信息并进行检查是否存在且能正常运行,之后就进行硬件设备的初始化。
加电自检:给CMOS通电,其上的BIOS启动,并根据CMOS的配置信息来检查其他硬件设备是否正常,之后进行设备初始化。
2。读取第一个启动设备MBR 的引导加载程序(grub)的启动信息
读取MBR,引导加载程序grub,完成grub的三个阶段。
硬件设备初始化后,BIOS会列出一些可以启动的装置顺序,然后开始读取第一个可以启动的设备中的操作系统文件。
怎样来读取这第一个启动设备上的操作系统文件呢?需要用到启动管理程序:Boot Loader。它是个程序,依赖与硬盘,这个硬盘就是第一个可以启动的硬盘。Boot Loader是在该硬盘上第一个扇区上MBR(master boot record,主引导记录)当中。每个硬盘分区都有块启动分区,这个启动分区就是用来为操作系统安装Boot Loader。
Boot Loader的主要功能:一个就是去识别、加载操作系统中的核心文件,并提交到内存中运行,进而启动对应的操作系统。另一个主要功能是提供菜单信息(这些菜单信息可为使用者提供不同的启动项目来加载操作系统),并将启动管理功能转交给其他的加载程序。
Boot loader功能的发挥是需要grub的是三个阶段来完成的。
BIOS列出启动顺序,读取加载并启动第一个可以启动硬盘上的第一个启动扇区上的MBR上的Boot Loader,发挥Boot loader的功能,而功能的发挥是通过引导加载程序grub来实现,也就是共要完成grub的三个阶段stage1-1.5-2。
3。加载核心操作系统的核心信息,核心开始解压缩,并尝试驱动所有的硬件设备
加载系统内核kernel,执行系统初始化信息。
在Boot Loader完成grub的是三个阶段后,就开始读取操作系统内核文件,接下来就会将内核文件解压缩后装载到内存当中,然后根据内核提供的功能开始检测与加载各个设备。
此时的设备检查和之前bios自检不同,此时内核程序已完全接管了BIOS的工作,之后的操作都是由内核来完成的。此时内核程序还没有加载到磁盘便没法读取系统上的内核文件,而加载磁盘时就需要磁盘驱动程序,磁盘驱动程序还在硬盘上,但硬盘上的驱动程序还没被读取到。这就形成了死循环。
所以这里用了个虚拟文件系统来解决这个问题。虚拟文件系统(Initial RAM DISK)同样放置在/boot目录下,并且是一个以initrd(5)或initamfs(6)开头的文件。这个以initrd开头的文件能通过Boot Loader程序将其加载到内存中,然后这个文件会被解压缩并在内存中模拟一个根文件系统,这个根文件系统能提供一个可以运行的程序,通过该程序可以加载在启动过程中所需的核心模块(RAID, LVM, SCSI 等文件系统和磁盘驱动程序),加载完后会协助内核重启呼叫/sbin/init来执行后面的正常启动。
总的来说就是:Boot Loader 可以加载kernel(以vmlinuz开头的文件)和initrd(以initrd开头的文件),然后在内存中让initrd(5)或initamfs(6)解压缩成虚拟的根目录,然后内核kernel可以在这个虚拟的根目录上加载合适的驱动程序,来检查和加载硬盘等各个设备,再之后释放虚拟的根文件系统,且会协助内核重启呼叫/sbin/init来执行后面的正常启动,并以只读的方式挂载到磁盘上真实的根文件系统,之后就是正常的启动过程了。
4。核心执行init 程序,并获取默认的运行信息
启动用户空间第一个执行程序/sbin/init,并调用init的配置文件
在内核、硬件及驱动信息加载完毕后,内核会呼叫用户控件的第一个执行程序/sbin/init,init程序主要功能是准备软件运行环境,包括系统的主机名称、网路配置、文件系统格式等其他服务的启动管理。这些所有的操作都是通过init的配置文件来定义的。
init的配置文件:
centos5:由于centos5采用的是SysV init方式,其特点是启动用户空间的服务程序,通常通过脚本进行,有依赖关系的服务将被串行启动;这导致了centos5的系统启动过程非常慢,其配额制文件为:/etc/initab
centos6:采用的是Upstart的方式,其特点是守护进程间的通信依赖于D-Bus进行,因此,可基本实现类似并行启动,配置文件:/etc/inittab,/etc/init/*.conf
centos7:采用Systemd方式,其特点是服务只有在第一次被访问到时才会真正启动起来;因此centos7系统启动过程非常快,配置文件:/usr/lib/systemd/*
启用用户空间的第一个执行程序/sbin/init,这个程序根据init的配置文件来开始init初始化。初始化第一步是:根据/etc/inittab(centos5);或者/etc/inittab、/ect/init/*.conf(centos6)配置文件进行系统环境初始化。
5。初始化第一步结束后,开始初始化第二步。初始化第二步,init会根据/etc/rc.d/rc.sysinit中定义的内容进行系统初始化。
6。启动核心的外挂模块,init 执行/etc/rc.d/目录下的各个批处理文件(scripts),最后执行/etc/rc.d/rc.local。
在/etc/rc.d/rc.sysinit初始化完成系统后,此时系统就已经顺利开始工作了。只不过此时还有启动一些所需要的各项服务,这样主机才能提供我们需要的功能,如网路服务,dhcp服务等。这里是通过inittab中提到的l3:3:wait:/etc/rc.d/rc 3配置进行的。实际上为/etc/rc.d/rc3.d下所有链接文件来决定如何启动或关闭服务。其中,以S开头的都被传递start参数来启动;以K开头的都被传递stop参数来停止。
/etc/rc.d/rc3.d/下的所有链接文件,都是链接到/etc/init.d/目录下的所有脚本,即为/etc/init.d/SERVICE_SCRIPTS。这些脚本遵循LSB服务脚本定义规范,都接受至少4个最基本的参数:{start|stop|status|restart}。
/etc/init.d/目录下的脚本在指定级别为启动还是停止的控制方法:
1。脚本开头:
# chkconfig: S_LEVELS S_PRIO K_PRIO (s_levels s_prio k_prio)
# description:
#!/bin/bash
#LLLL 表示初始在哪个级别下启动,- 表示都不启动
# chkconfig: LLLL nn nn
服务脚本中,必须有#chkconfig 35 97 07,其中35表示开机支持在那个模式上启动 ,97 07分别是服务列表名的前缀,分别表示启动或关闭状态
2。脚本开头的第二方法:
### BEGIN INIT INFO
# Provides: $network
# Should-Start: iptables ip6tables
# Short-Dercription: Bring up/down networking
# Description: Bring up/down networking
### END INIT INFO
这些脚本可以直接被调用:
/etc/init.d/SERVICE_SCRIPTS {start|stop|status|restart}
也可以使用service 命令调用:
service SERVICE_SCRIPTS {start|stop|status|restart}
上面的服务也可以开机时(或切换为指定级别时)被自动启动或停止:
方法:
/etc/rc.d/rc脚本,以及每个级别对应的级别目录下的“符号链接”来进行(/etc/rc.d/rcN.d)如下内容:
S##SERVICE_SCRIPTS
K##SERVICE_SCRIPTS
##:两位数字,表示优先级;比如想启动一个web服务,那首先得有网络服务,因为web服务依赖于网络服务,因此网络服务就会被优先启动,web服务就后于网络服务启动,同样,在停止是要先停止web服务,最后才能停止网络服务。
注意:
有个特殊的链接在所有的/etc/rc.d/rcN.d/目录下,这个链接就是S99local指向/etc/rc.local脚本,这个是最后执行的。
这个脚本的功能是:那些不方便定义为服务脚本的,想设定为开机自动运行的,可以直接把命令写到此脚本中以实现开启运行。
7。执行/bin/login 程序,等待用户登录
根据/etc/inittab中指定的id:3:initdefault:来启动终端,并且会启动6个虚拟终端且处于等候状态,虚拟终端启动后会在此虚拟终端上附加个用户登录程序/bin/login,来等待用户登录。
在完成系统所有相关服务启动后,接下来linux就会启动终端或者是X window来向用户提供登录界面,例如启动虚拟终端
一般启动6个虚拟终端:
tty1:2345:respawn:/sbin/mingetty tty1
tty2:2345:respawn:/sbin/mingetty tty2
tty3:2345:respawn:/sbin/mingetty tty3
tty4:2345:respawn:/sbin/mingetty tty4
tty5:2345:respawn:/sbin/mingetty tty5
tty6:2345:respawn:/sbin/mingetty tty6
每个虚拟终端启动后,会立即通过此终端附加一个应用程序——login
如果默认级别为5,还会启动一个图形虚拟终端,会附加X应用程序
注意:
1。centos6的init程序为upstart,其配置文件为/etc/init/*.conf ;此些配置遵循upstrat语法格式进行编程;
2。centos6 的服务控制事实上大多数并没有使用upstart脚本来控制,而使用的是SysV风格的脚本;
8。登录之后开始以Shell控制主机