1
1
# OS 启动
2
2
3
+ 首先ROM中的BIOS进行硬件自检,根据自己的设置(开机按F2)按顺序检设备中是否有启动程序(检测MBR512个字节中最后两个字节为0x55 0xAA则可以启动)。之后运行bootloader如grub.
4
+
3
5
linux有3种启动方式:** System V init** ,** upstart** ,** systemd**
4
6
***
5
7
@@ -52,8 +54,8 @@ inittab文件中的每一项都是如下格式:
52
54
53
55
## upstart
54
56
55
- upstart中,程序执行单位被称作作业(Job),所有的init作业都必须将其配置文件(配置文件指出作业什么时候start,什么时候stop)放置于目录 /etc/init/之下。Upstart启动时,从 /etc/init/ 目录中读取各个Job的配置文件,获取所有Job 。然后发出Startup信号,所有监听这个信号的作业会被执行。在作业执行过程中,作业本身也可以自己发出信号,其他监听这个信号的服务接着就会被启动执行。Upstart通过这样的方式来达到异步和实时控制作业的启动执行。
56
- 基于事件的 Upstart 是 /sbin/init 守护进程的替代品,它仅为在需要那些服务的时候启动服务而生,
57
+ upstart中,程序执行单位被称作作业(Job),所有的init作业都必须放置于目录 /etc/init/之下。Upstart启动时,从 /etc/init/ 目录中获取所有Job 。然后发出Startup信号,所有监听这个信号的作业会被执行。在作业执行过程中,作业本身也可以自己发出信号,其他监听这个信号的服务接着就会被启动执行。Upstart通过这样的方式来达到异步和实时控制作业的启动执行。
58
+ 基于事件的 Upstart 是 /sbin/init 守护进程的替代品, upstart包提供了新的init daemon
57
59
58
60
在Upstart之下,你可以有2种方式** 添加系统服务程序** :
59
61
* 按照System V 规则编写服务,并置于相应位置。
@@ -63,11 +65,78 @@ upstart中,程序执行单位被称作作业(Job),所有的init作业都必
63
65
64
66
![ upstart工作流程] ( ./upstartWorkProcess.png )
65
67
68
+ ### upstart的术语
69
+
70
+ #### job
71
+
72
+ 一个工作(job)是init可以理解的一系列指令(类似具有特定规则的脚本)。典型的指令包括一个程序(二进制文件或是脚本)和事件的名称。Upstart init daemon会在事件触发的时候运行相应的程序。用户可以分别用 initctl start 和 stop 命令手动启动或终止一项工作。工作又可以分为任务和服务。
73
+
74
+ > 用户可以定义自己的job放在/etc/event.d/目录下。
75
+ ```
76
+ $cat /etc/event.d/myjob
77
+
78
+ #触发event为hithere
79
+ start on hithere script
80
+ echo "Hi"
81
+ end script
82
+ ```
83
+
84
+ #### event
85
+
86
+ 事件(event)是 init 可以得到的状态变更信息。几乎系统所有的内部或外部状态变更都可以触发一个事件。比如,引导程序会触发启动(startup)事件,系统进入运行级别2会 触发运行级别2(runlevel 2)事件,而文件系统加载则会触发路径加载(path-mounted)事件,拔掉或安装一个热插拔或USB设备(如打印机)也会触发一个时间。
87
+
88
+ > 用户还可以通过 initctl emit 命令来手动触发一个事件。
89
+
90
+ #### process
91
+
92
+ process 是由jobs定义的services或者task,它将被init daemon 运行。 每个job可以定义一个或者多个不同的process,分别在其生命周期的不同状态运行。
93
+
66
94
### upstart兼容sysvinit
67
95
68
96
由于很多软件包中都包含了sysv的启动脚本,为了兼容这部分程序,upstart提供了兼容机制.在/etc/init/下有rc-sysinit和rc作业,其运行机制是:作业rc-sysinit在收到 “(filesystem and static-network-up) or failsafe-boot” 的信号之后由Upstart启动。一切正常的话,rc-sysinit通过telinit完成运行级别信号的发送。作业rc在收到运行级别信号之后,由Upstart启动。然后rc通过运行/etc/init.d/rc $RUNLEVEL这个命令, 来完成/etc/rcN.d/下相应程序的启动。
69
97
这样,就完成了兼容sysvinit的过程。
70
98
99
+ ### upstartVSsysv
100
+
101
+ SysV启动是线性、顺序的。后面的要等待前面的启动后才能启动,同时不能解决诸如系统接收到打印机等热插拔事件安装时来启动某种特定的服务这类问题
102
+
103
+ upstart是基于事件的,能够实现按需启动,同时解决了热插拔设备安装时启动特定服务的要求。同时支持不同服务并行启动。
104
+
105
+
106
+ ## Systemd
107
+
108
+ Systemd是一个比upstart设计思路更超前的init系统,其核心是为了加快linux的启动速度,研究如何并行化启动init以后的用户进程
109
+
110
+ Systemd使用** target** 来处理** 引导和服务管理** 过程,target被用于分组不同的引导单元以及启动同步进程.
111
+
112
+ terget实际上也类似一种脚本文件,用来指明程序应该怎么执行,执行什么。类似于upstar的config。
113
+
114
+ ### System启动流程
115
+
116
+ 1 . systemd执行的第一个目标是default.target。但实际上default.target是指向graphical.target的软链接。文件Graphical.target的实际位置是/usr/lib/systemd/system/graphical.target。在graphical.target会启动multi-user.target。
117
+
118
+ 2 . multi-user.target将自己的子单元放在目录/etc/systemd/system/multi-user.target.wants里.multi-user.target为多用户支持设定系统环境。非root用户会在这个阶段的引导过程中启用。防火墙相关的服务也会在这个阶段启动。
119
+ 之后multi-user.target将控制权交给另一层basic.target
120
+
121
+ 3 . basic.target单元用于启动普通服务特别是图形管理服务。它通过/etc/systemd/system/basic.target.wants目录来决定哪些服务会被启动.
122
+ basic.target之后将控制权交给sysinit.target
123
+
124
+ 4 . sysinit.target会启动重要的系统服务例如系统挂载,内存交换空间和设备,内核补充选项等等。
125
+ sysinit.target在启动过程中会传递给local-fs.target。
126
+
127
+ 5 . local-fs.target,这个target单元不会启动用户相关的服务,它只处理底层核心服务。这个target会根据/etc/fstab和/etc/inittab来执行相关操作。
128
+
129
+ ### System components
130
+
131
+ ![ systemd components] ( ./Systemd-components.png )
132
+ ***
133
+ ![ Boot structure] ( ./bootStructureWithSystem.png )
134
+
135
+ ## 参考
136
+
137
+ [ upstart分析] ( https://blog.csdn.net/dandelionj/article/details/8551361 )
71
138
139
+ [ 走进Linux之system启动流程] ( https://blog.csdn.net/yuzhihui_no1/article/details/52228763 )
72
140
141
+ [ ubuntu启动过程] ( https://blog.csdn.net/u013830021/article/details/72840669 )
73
142
0 commit comments