资料来源

https://blog.csdn.net/sinat_14840443/article/details/40508245
https://blog.51cto.com/leejia/788895
https://www.cnblogs.com/jason-lu/articles/3272963.html

linux主机启动过程

1 BIOS自检

开机时进入BIOS
主要是侦测电脑的周边配套设备是否工作正常,读取对应的配置参数。
如CPU的类型、速度、缓存等、主板类型、内存的速度,容量、硬盘的大小,类型和工作模式

2 根据BIOS中的设置从指定的设备启动系统

  • 2.1 BIOS自检完成后,BIOS会根据用户设置的启动顺序来由那个设备来启动电脑的操作系统,这个设备一般是硬盘.即进入硬盘的MBR(引导扇区),

    其中有512字节,前446字节中保存的程序是”启动程序”,为了“选择启动分区”,即选择从那个硬盘分区来加载开机的程序。然后启动程序会去读取对应分区的操作系统。即启动grub程序。

  • 2.2 找到启动设备(硬盘),将存放于引导扇区、第一阶段所用到的boot loader 装载到RAM中执行,

    此处的boot loader大小上小于一个扇区的大小(512字节),执行目的是加载第二阶段的boot loader

  • 2.3 读取并执行第二阶段boot loader

    第二阶段boot loader可称为内核加载程序。
    执行时,通常会显示一闪而过的屏幕,
    接着linux以及可选的初始化内存盘(临时的根文件系统)会被装载到存储器,
    加载系统镜像,第二阶段的boot loader将控制权转交给内核镜像。
    内核开始自解压、初始化。
    总结:在这个阶段,第二阶段的boot loader会检查系统的硬件,枚举那些附加的硬件设备,挂载根设备,之后加载需要的内核模块.完成之后,第一个用户空间程序(init)开始执行,更高层次的系统初始化开始.

    3 系统init初始化。

    内核启动后,创建ID为 1# 的进程,用来创建若干内核线程,执行程序 /sbin/init(变成一个用户进程)
    init程序根据/etc/inittab配置文件,执行对应的脚本进行系统初始化。
    例如设置键盘、字体,装载模块,设置网络等。

    /etc/inittab配置文件详解

    init的进程号是1(ps -aux | less),从这一点就能看出,init进程是系统所有进程的起点,Linux在完成核内引导以后,就开始运行init程序。
    init程序需要读取配置文件/etc/inittab。
    inittab是一个不可执行的文本文件,它有若干行指令所组成。

    登记项格式

    id:runlevels:action:process
    标识符 : 系统的运行级别 : 实施的动作 : 执行的指令

1 identifier

登记项标识符,最多为4个字符.用于惟一地标识/etc/inittab文件中的每一个登记项,不能重复。

2 runlevel

系统的运行级别runlevel
简单来说,运行级别可理解为系统处在不同的状态。
指定相应登记项在哪一个运行级中被处理。
/etc/inittab中可通过给配置项指定runlevel,实现在init程序将系统带入runlevel对应的状态时,触发对应配置项的process和action。
可以通过id:3:initdefault: 设置init进程结束之后的系统所处的状态为多用户命令行状态,且为默认。
如果该字段为空,那么相应的登记项将适用于所有的运行级.在该字段中,可以同时指定一个或多个运行级,其中各运行级分别以数字0.1.2.3.4.5.6或字母a、b、c表示,且无需对其进行分隔.
本质是在软件层面上的状态,系统硬件方面没有的信息来表示runlevel。
init和inittab是runlevel影响系统状态的唯一原因。

0:关机
让init关闭所有进程并终止系统。
1:单用户
用来将系统转到单用户模式,单用户模式只能有系统管理员进入,在该模式下处理那些在有登录用户的情况下不能进行更改的文件,改runlevel的编号1也可以用S代替。
在这个模式中,用户登录不需要密码,默认网卡驱动是不被加载,一些服务不能用。
(可用于找回丢失密码)
2:多用户状态
允许系统进入多用户的模式,但并不支持文件共享,NFS服务不开启,这种模式很少应用。
(特点:没有网络服务)
3:真正的多用户模式
最常用的运行模式,主要用来提供真正的多用户模式,也是多数服务器的缺省模式。
结果上看,其实就是表示命令行模式
(有网络服务)
4:系统未使用保留给用户
一般不被系统使用,用户可以设计自己的系统状态并将其应用到runlevel 4阶段,尽管很少使用,但使用该系统可以实现一些特定的登录请求。
用户自行定义4对应的含义。
5:图形界面
是将系统初始化为专用的X Window终端。对功能强大的Linux系统来说,这并不是好的选择,但用户如果需要这样,也可以通过在runlevel启动来实现该方案。
6:系统重启
关闭所有运行的进程并重新启动系统。

3 action


动作关键字
用于指定init(M)命令或进程对相应进程(在“process”字段定义)所实施的动作.
具体动作包括:

boot:只有在引导过程中,才执行该进程,但不等待该进程的结束;当该进程死亡时,也不重新启动该进程.
bootwait:只有在引导过程中,才执行该进程,并等待进程的结束:当该进程死亡时,也不重新启动该进程.实际上,只有在系统被引导后,并从单用户方式进入多用户方式时,这些登记项才被处理;如果系统的默认运行级设置为2(即多用户方式),那么这些登记项在系统引导后将马上被处理.
initdefault:指定系统的默认运行级.系统启动时,init将首先查找该登记项.如果存在init将据此决定系统最初要进入的运行级.具体来说,init将指定登记项“run_level”字段中的最大数字(即最高运行级)为当前系统的默认运行级;如果该字段为空,那么将其解释为“0123456”,并以“6”作为默认运行级.如果不存在该登记项,那么init将要求用户在系统启动时指定一个最初的运行级.
off:如果相应的进程正在运行,那么就发出一个警告信号,等待20秒后,再通过杀死信号强行终止该进程.如果相应的进程并不存在那么就忽略该登记项.
once:启动相应的进程,但不等待该进程结束便继续处理/etc/inittab文件中的下一个登记项;当该进程死亡时,init也不重新启动该进程.注意:在从一个运行级进入另一个运行级时,如果相应的进程仍然在运行,那么init就不重新启动该进程.
ondemand:与“respawn”的功能完全相同,但只用于运行级为a、b或c的登记项.
powerfail:只在init接收到电源失败信号时执行相应的进程,但不等待该进程结束.
powerokwait :电源已经故障,但是在等待执行对应操作的时候突然来电了就执行对应的process
powerwait:只在init接收到电源失败信号时执行相应的进程,并在继续对/etc/inittab文件进行任何处理前等待该进程结束.
powerfailnow :当电源故障并且init被通知UPS电源已经快耗尽执行相对应的process
respawn:如果相应的进程还不存在,那么init就启动该进程,同时不等待该进程的结束就继续扫描/etc/inittab文件;当该进程死亡时,init将重新启动该进程.如果相应的进程已经存在,那么init将忽略该登记项并继续扫描/etc/inittab文件.
sysinit:只有在启动或重新启动系统并首先进入单用户时,init才执行这些登记项.而在系统从运行级1-6进入单用户方式时,init并不执行这些登记项.”action”字段为“sysinit”的登记项在“run_level”字段不指定任何运行级.
wait:启动进程并等待其结束,然后再处理/etc/inittab文件中的下一个登记项.
ctrlaltdel :当用户按下ctrl+alt+del这个组合键的时候执行对应的process。

4 process

所要执行的shell命令.任何合法的shell语法均适用于该字段.

5 举例

  1. id:3:initdefault:
  2. 这个登记项表示我们默认的运行级别是3,也就是说我们默认开机启动会进入命令行模式。
  3. 而/etc/rc.d/rc.sysinit的作用主要是:
  4. 1,激活udevselinux
  5. 2,根据/etc/sysctl.conf文件设定内核参数
  6. 3,设定系统时钟
  7. 4,键盘的键映射,即识别键盘
  8. 5,启用swap分区
  9. 6,设定主机名
  10. 7,根文件系统检测及重新以读写方式挂载
  11. 8,激活RAIDLVM设备
  12. 9,启用磁盘配额
  13. 10,检测及挂载其他文件系统(挂载/etc/fstab中定义的设备)
  14. 11,清除过期的锁和PID文件
l0:0:wait:/etc/rc.d/rc 0
l1:1:wait:/etc/rc.d/rc 1
l2:2:wait:/etc/rc.d/rc 2
l3:3:wait:/etc/rc.d/rc 3
l4:4:wait:/etc/rc.d/rc 4
l5:5:wait:/etc/rc.d/rc 5
l6:6:wait:/etc/rc.d/rc 6

例如:运行级别为5时,以5为参数运行/etc/rc.d/rc脚本,init将等待其返回(wait)
/etc/rc.d/rc.d这个目录中存放的是在对应级别下所要开启和禁用的服务的文件。
当进入n运行级(n就是上面所定义的运行级别),会把/etc/rc.d/rc
.d(*表示对应登记项process字段rc后的数字)这个目录中所有以S开头的文件启用,把以K开头的文件给禁用,并且这些文件只在进入相应的运行级别时执行一次,退出此运行级别失效。所以每个运行级别的服务是独立的,

ca::ctrlaltdel:/sbin/shutdown -t3 -r now

在所有运行级别下,按下ctrl+alt+del时等待3秒钟后重新启动系统。这就是为什么我们按下这三键后重新启动系统

pf::powerfail:/sbin/shutdown -f -h +2 "Power Failure; System Shutting Down"

在所有的运行级别下,如果电源故障,会给出提示信息,并且在2min后关机。

pr:12345:powerokwait:/sbin/shutdown -c "Power Restored; Shutdown Cancelled"

在12345运行级别下,如果电源故障的时候,电源又恢复正常,则给出提示信息,并且立即终止关机。

1:2345:respawn:/sbin/mingetty tty1
2:2345:respawn:/sbin/mingetty tty2
3:2345:respawn:/sbin/mingetty tty3
4:2345:respawn:/sbin/mingetty tty4
5:2345:respawn:/sbin/mingetty tty5
6:2345:respawn:/sbin/mingetty tty6

在2345运行级别下,会启用6个命令行界面的终端,并且一旦终端终止,就会在创建一个新的。这就是为什么我们的系统下会有6个命令行界面的终端。

x:5:respawn:/etc/X11/prefdm -nodaemon

只有我们进入5运行级别,会打开图形用户终端,并且一旦终端终止,就会再创建一个新的。如果把这一行删了,图形界面便无法使用。