• 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

  • 相关阅读:
    C#获取上级文件夹路径
    C#string与byte数组转行
    C#BAT与VBS文件的创建和执行调用
    C#生成条形码
    C#根据生日计算所属十二星座
    C#获取某一字符串第N到第N+1空格的字符
    WPF的DataGrid表格动态加载合并列
    WPF递归设置CheckBox与TextBox禁用联动
    WPF基础知识
    WPF Popup绑定目标控件上下左右位置
  • 原文地址:https://www.cnblogs.com/yinghao-liu/p/9314668.html
Copyright © 2020-2023  润新知