linux系统启动流程
By francis_hao Jul 15,2018
boot-系统启动流程,基于UNIX System V Release 4
描述
不同发行版的系统启动流程也不尽相同,但是也可粗略的划分为以下几部分:
1. hardware
2. operating system (OS) loader
3. kernel
4. root user-space process (init and inittab)
5. boot scripts
Hardware
按下启动或者重启之后,控制权就交给了存储在只读存储器(通常是PROM)里的程序了,通常这个程序被叫做BIOS。BIOS会执行一些基本的自测,并且会从非易失性存储中读取参数,在PC中,存储是基于电池的CMOS存储器。在非PC中,通常叫做"the NVRAM" (nonvolatile RAM)。
存储的参数在不同系统中其内容也不同,但是基本来说,需要由其指定由哪块设备提供OS loader,这样的设备通常叫做"the boot device"。硬件启动步骤就是从boot device的固定位置加载OS loader并把控制权交给它。
OS loader
OS loader的主要任务就是从某块设备中定位内核,加载并运行。大部分OS loader允许用户进行交互,这样就可以选择要加载的内核,并传输一些可选的参数。
在很多系统里,OS loader会受到很多限制,比如大小,因此这个部分有时候会被分成两个阶段。
linux系统里OS loader通常是lilo(8) 或 grub(8)
Kernel
当内核被加载,它会初始化各种组件和操作系统,对应每个部分任务的软件被认为是驱动,内核启动一个内核进程用于虚拟内存交换,进程叫做"kswapd",之后会挂载一些文件系统在根目录下。
一些参数可能会被传递给内核,比如改变挂载的主文件系统,详细的参数参见bootparam(7)。
在这之后,内核会创建初始化用户进程,并给它数值为1的PID,典型的,是执行程序/sbin/init,但是也可以由参数指定。
Root user-space process
说明:下面的描述是基于UNIX System V Release 4的。然而,很多系统使用了另一种相关但是从根本上不同的方法,systemd(1)。其对应的启动过程细节在bootup(7)。
当/sbin/init启动后,它读取/etc/inittab文件以获取运行级别,每个运行级别对应一系列的服务。超级用户可以通过init(1)改变运行级别,而且可以通过runlevel(8)查询当前的运行级别。然而,通过编辑该文件来管理独立的服务并不是很方便,/etc/inittab只是用来引导一系列的脚本,由这些脚本来实现实际的启动/关闭独立的服务
Boot scripts
对于每个托管的服务(mail, nfs server, cron, etc),有独自的一个启动脚本在一个特殊的目录下(大部分是/etc/init.d),脚本可以接受start、stop等参数。
Sequencing directories
为了使特定的脚本在特定的运行级别下开始/停止,并且有特定的次序,因此使用了排序的目录,通常的形式是/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中国大陆许可协议 进行许可。欢迎转载,请注明出处:
转载自:https://www.cnblogs.com/yinghao1991/p/9314668.html
参考
【1】 man 7 boot