跳转到内容

Linux启动进程

本页使用了标题或全文手工转换
维基百科,自由的百科全书

这是本页的一个历史版本,由奧田95留言 | 贡献2020年1月12日 (日) 18:00 Systemd init编辑。这可能和当前版本存在着巨大的差异。

Linux启动进程是启动Linux时执行的一个复杂的初始化过程。它在很多方面类似于BSD系统和别的类Unix系统的启动过程。[1][2]

启动一个Linux系统涉及到很多阶段和软件组件,包括硬件初始化、执行启动加载程序、加载和启动Linux内核镜像,和执行很多启动脚本和守护进程[3]对于不同的阶段和组件它们存在不同的变化和途径;比如GRUBLILOSYSLINUX或者Loadlin等能被用来当作启动加载器[4],同时启动脚本可以是传统的init[5]风格,也可以是系统配置能被执行的现代替代方案比如systemdUpstart

概述

早期阶段的Linux启动进程十分依赖于计算机架构。IBM PC兼容机是Linux常用的架构;在这种系统中,BIOS扮演着重要角色,而这在其他系统中很难找到类似的东西。在下面的例子中,假设为IBM PC兼容机

  1. BIOS针对实际的硬件平台执行启动任务。一旦硬件被遍历、启动需要的硬件被正确初始化,BIOS就会从配置好的启动设备加载和执行启动代码。
  2. 启动加载程序通常会为用户呈现一个可能的启动项的菜单而且有一个将在几秒后被选择的默认项。一旦作出选择,启动引导器将和把内核加载到内存,并且提供一些参数且移交控制权。
  3. 内核,如果被压缩将自解压。它将配置系统功能,譬如必要的硬件和内存分页,称为start_kernel(),这会执行大部分系统配置(中断、内存管理、设备和驱动初始化等)。然后它分别启动内存管理进程、调度和init进程等在用户空间执行的进程。
  4. init由被shell(sysv、bsd、runit)执行的脚本或者被二进制组件(systemd、upstart)执行的配置文件组成。Init有特定的级别(sysv、bsd)或目标(systemd),每个都是由特定的一组服务(守护进程daemons)组成。这在用户环境提供很多非操作系统的服务和结构。一个典型的服务环境启动一个网络服务、数据库服务和网络。
  5. 一个典型的桌面环境从一个名为显示管理器的守护进程开始,它开始一个由图形化服务组成的图形化环境,提供一个基础底层的图形栈和一个提供身份验证的登录管理器。在用户输入正确验证信息,会话管理器开始一个会话。会话是包含一系列程序比如UI组件(面板、桌面、小程序等),它们一个构成一个完整的桌面环境。

关机时,init会以控制者的姿态去关闭所有的用户空间功能。init随后终止,内核自行关闭。

启动加载程序阶段

启动加载阶段应计算机架构而不同。更早的阶段不是针对特定操作系统,基于BIOS的x86_64启动进程被认为开始于MBR代码用真实模式执行和第一阶段启动加载程序被加载。而对于UEFI系统,像Linux内核的有效负载,能直接加载,不需要启动加载程序。下面是对流行的启动引导程序的总结:

  • LILO不能识别和解析文件系统布局。 而是在实时系统中创建一个配置文件(/etc/lilo.conf),它将原始偏移量信息(映射器工具)映射到内核和ram磁盘的位置(initrd或initramfs)。 配置文件(其中包括每个引导分区和内核路径名等数据)以及自定义选项(如果需要),然后与引导加载程序代码一起写入MBR引导程序。 当此引导器读取并由BIOS控制时,LILO加载菜单代码并绘制它,然后使用存储的值与用户输入一起计算和加载Linux内核或链接加载任何其他引导加载程序。
  • GRUB 1包含运行时读取通用文件系统以访问其配置文件的逻辑。这使得GRUB 1能够从文件系统读取其配置文件,而不是将其嵌入到MBR中,从而允许它在运行时更改配置,并以可读取的格式指定磁盘和分区,而不是依赖于偏移量。 它还包含一个命令行界面,如果配置错误或损坏,可以更容易地修复或修改GRUB。
  • GRUB 2与GRUB 1的不同之处在于有两个(可选三个)阶段,并且能够自动检测各种操作系统和自动配置。第一阶段加载程序(stage1)加载和执行由BIOS从主引导记录(MBR)或另一个来自分区引导扇叶的引导加载程序。它的工作是发现和访问各种文件系统,以便稍后可以读取配置文件。如果第二阶段加载程序不连续,或者如果文件系统或硬件需要特殊处理才能访问第二级加载程序,则可选的中级加载程序(阶段1.5)由第一级加载程序加载和执行加载程序。最后加载第二阶段加载程序(stage2),并显示允许用户选择操作系统或检查和编辑启动参数的GRUB启动菜单。选择菜单项并选择参数后,GRUB会将内核加载到内存中,并将控制权传递给它。GRUB 2还能够链接加载另一个引导加载程序。
  • SYSLINUX / ISOLINUX是一个专门从FAT文件系统引导完整的Linux的启动加载程序。它通常用于启动或抢救软盘,live USB和其他轻量级引导系统。 ISOLINUX通常由Linux live CD和可引导安装CD使用。
  • Loadlin是一个可以在运行时用Linux内核替换正在运行的DOS或Windows 9x内核的启动加载程序。这在硬件需要通过软件打开并且这种配置程序是专有的且仅适用于DOS的情况下可能是有用的。这种引导方法现在不太需要,因为Linux具有大量硬件设备的驱动程序,但在移动设备中已经有一些用途。 另一个用例是当Linux位于BIOS无法启动的存储设备上时:DOS或Windows可以加载相应的驱动程序来弥补BIOS的限制并从那里启动Linux。

内核阶段

Linux内核处理所有操作系统进程,如内存管理、任务调度、I/O、进程间通信和系统总体控制。这分为两个阶段 :

首先,内核(作为压缩映像文件)被加载到内存中并进行解压缩,并且建立了一些基本的功能,如基本内存管理。 然后最后一次切换到主内核启动过程。

一旦内核完全运行,并且作为其启动的一部分,在加载和执行时,内核会查找一个运行的init进程,它单独设置用户空间以及用户环境所需的进程和最终会话。然后允许内核自身闲置,受其他进程调用。

initramfs

initramfs自Linux内核的2.5.46版本开始加入这个概念,其意图是尽可能地替换以前Linux核心在启动过程中执行的功能。 早期用户空间的典型用途是检测需要哪些设备驱动程序来加载主用户空间文件系统,并从临时文件系统加载它们。[6]

Init进程

Init是Linux的根进程。进程号为1,它是所有进程的父进程。

Systemd init

参考资料

  1. ^ Linux 引导过程内幕. www.ibm.com. 2006-07-26 [2017-06-29] (中文(中国大陆)). 
  2. ^ 13.3. 引导管理器和各引导阶段. www.freebsd.org. [2017-06-29]. 
  3. ^ M. Jones. Inside the Linux boot process. [2017-06-29]. 
  4. ^ What is boot loader (boot manager) ? - Definition from WhatIs.com. SearchDataCenter. [2017-06-29] (美国英语). 
  5. ^ Ippolito, Greg. Linux: Init Process and PC Boot Procedure. www.yolinux.com. [2017-06-29] (英语). 
  6. ^ About initramfs. www.linuxfromscratch.org. [2017-06-29].