By francis_hao Jul 15,2018 html
boot-系统启动流程,基于UNIX System V Release 4 linux
不一样发行版的系统启动流程也不尽相同,可是也可粗略的划分为如下几部分: spa
1. hardware 操作系统
2. operating system (OS) loader server
3. kernel htm
4. root user-space process (init and inittab) blog
5. boot scripts 排序
按下启动或者重启以后,控制权就交给了存储在只读存储器(一般是PROM)里的程序了,一般这个程序被叫作BIOS。BIOS会执行一些基本的自测,而且会从非易失性存储中读取参数,在PC中,存储是基于电池的CMOS存储器。在非PC中,一般叫作"the NVRAM" (nonvolatile RAM)。 进程
存储的参数在不一样系统中其内容也不一样,可是基原本说,须要由其指定由哪块设备提供OS loader,这样的设备一般叫作"the boot device"。硬件启动步骤就是从boot device的固定位置加载OS loader并把控制权交给它。 ip
OS loader的主要任务就是从某块设备中定位内核,加载并运行。大部分OS loader容许用户进行交互,这样就能够选择要加载的内核,并传输一些可选的参数。
在不少系统里,OS loader会受到不少限制,好比大小,所以这个部分有时候会被分红两个阶段。
linux系统里OS loader一般是lilo(8) 或 grub(8)
当内核被加载,它会初始化各类组件和操做系统,对应每一个部分任务的软件被认为是驱动,内核启动一个内核进程用于虚拟内存交换,进程叫作"kswapd",以后会挂载一些文件系统在根目录下。
一些参数可能会被传递给内核,好比改变挂载的主文件系统,详细的参数参见bootparam(7)。
在这以后,内核会建立初始化用户进程,并给它数值为1的PID,典型的,是执行程序/sbin/init,可是也能够由参数指定。
说明:下面的描述是基于UNIX System V Release 4的。然而,不少系统使用了另外一种相关可是从根本上不一样的方法,systemd(1)。其对应的启动过程细节在bootup(7)。
当/sbin/init启动后,它读取/etc/inittab文件以获取运行级别,每一个运行级别对应一系列的服务。超级用户能够经过init(1)改变运行级别,并且能够经过runlevel(8)查询当前的运行级别。然而,经过编辑该文件来管理独立的服务并非很方便,/etc/inittab只是用来引导一系列的脚本,由这些脚原本实现实际的启动/关闭独立的服务
对于每一个托管的服务(mail, nfs server, cron, etc),有独自的一个启动脚本在一个特殊的目录下(大部分是/etc/init.d),脚本能够接受start、stop等参数。
为了使特定的脚本在特定的运行级别下开始/中止,而且有特定的次序,所以使用了排序的目录,一般的形式是/etc/rc[0-6S].d,每一个目录下是链接到/etc/init.d目录里的脚本的链接。
一个最初的脚本(一般是/etc/rc)从inittab被调用,这个脚本调用对应目录的脚本连接,其中连接以'S'开头的表示以start参数调用,以'K'开头的表示以stop参数调用,而脚本的执行顺序则是根据数字顺序进行的,好比
/etc/rc2.d/S12syslog会先于/etc/rc2.d/S80sendmail执行,而/etc/rc2.d/K10xfs则会以stop执行
不少系统管理这些连接是经过chkconfig(8)来进行的。
本文由 刘英皓 创做,采用 知识共享署名-非商业性使用-相同方式共享3.0中国大陆许可协议 进行许可。欢迎转载,请注明出处:
转载自:http://www.javashuo.com/article/p-pckffeym-cw.html
【1】 man 7 boot