从 Linux 引导说起

你可曾想过当你按下电源键到Linux登陆提示符出现这段时间在背后发生了什么吗?

Jun 26, 2015 • tvvocold < 1 min to read • linux boot

从 Linux 引导说起

你可曾想过当你按下电源键到Linux登陆提示符出现这段时间在背后发生了什么吗?

Linux的引导过程是一个用来初始化系统的程序。它包含了在打开电源键之后直到用户界面可操作之前的一切。

一旦你开始使用Linux,你会发现如果你对引导过程中的步骤非常熟悉,将会有助于你解决相关故障以及按需配置你的计算机。

打开电源–>BIOS–>MBR(主引导记录,硬盘的第一个扇区–>引导程序(例如GRUB)–>内核(Linux 系统))–>initramfs映像–>/sbin/init(父进程)–>终端提示符–>X Windows System(图形用户界面)

BIOS - 第一步

开启一台X86平台的Linux系统涉及到很多步骤。当计算机的电源被打开时,基本输入输出系统(BIOS)开始初始化硬件,包括屏幕、键盘,同时测试主存储器。这个过程也被叫做POST(加电自检)。 BIOS软件被存储在主板的一个ROM芯片上。在这之后,剩下的引导过程将完全的被操作系统所控制。

主引导记录(MBR)和引导程序

一旦加电自检完成,系统控制权就由BIOS传递给了引导程序。引导程序通常被存储在系统中的一个硬盘,不是在引导扇区(传统的BIOS/MBR系统)就是在EFI分区(较新的可扩展固件接口或者EFI/UEFI系统)。在这时,机器并不能存取大容量存储器。之后,日期、时间以及最重要的外围设备被从CMOS(基于电池的存储器,允许系统在断电之后继续记录日期和时间)加载到系统。 在Linux中有很多引导程序;最常见的就是GRUB(统一引导程序)和ISOLINUX(从可移动介质上启动)。大多数的Linux 引导程序能提供用户界面来选择选项引导Linux,甚至其他可能安装着的操作系统。当引导Linux时,引导程序负责加载内核映象和初始化RAM磁盘(包含了一些用来启动系统的关键文件和设备驱动)到内存。

活动中的引导程序

引导程序分为两个不同的阶段

第一阶段:

对于使用BIOS/MBR技术的系统,其引导程序位于硬盘的第一个扇区,又被成为主引导扇区(MBR)。MBR的大小仅仅为512字节。在这个阶段,引导程序检查分区表寻找一个可启动的分区。一旦找到,就开始寻找第二阶段的引导程序,例如GRUB,并把它加载到RAM(随机存取存储器)。 当系统使用EFI/UEFI技术时,UEFI固件读取它的启动管理程序来决定哪一个UEFI程序和哪里开始(例如在哪个磁盘或分区可以找到EFI分区)启动。固件随后启动UEFI程序——比如说GRUB——它被定义为固件启动管理程序的入口。这个步骤非常复杂但是它的灵活性远远超过了旧的MBR技术。

第二阶段:

第二阶段的引导程序位于/boot下。一个启动画面会被显示用来让我们选择一个操作系统(OS)启动。在选择完OS之后,引导程序加载被选择的操作系统的内核到内存中并将控制权移交给它。引导程序加载被选择的内核映像(在这里是Linux)并将控制权移交给它。内核基本上都是被压缩的,所以它首先得解压自己。在这之后,它将检查并分析系统硬件并初始化硬件设备驱动到内核中

Linux内核

引导程序同时加载内核和初始化文件系统(initramfs)到内存,以使initramfs可以直接被内核使用。 当内核被加载到RAM中,它将立即初始化和配置计算机内存,同时也配置所有依赖于系统的硬件。包括所有的处理器、I/O子系统、存储设备等等。内核同时也加载一些必须的用户空间应用程序。

RAM的初始化

initramfs包含了用来加载正确的根文件系统所需要的程序和二进制文件,像是为文件系统提供内核函数以及为一个叫做udev(面向USB设备)的被用来确认设备是否存在和定位适合的驱动并加载它们的大容量存储控制器提供设备驱动)。当发现根文件系统后,将会进行错误检测并加载。 mount程序通知操作系统有一个文件系统已经准备好被使用了,并协助它挂载在整个文件系统的最顶层(挂载点)。如果成功了,initramfs将会被从内存清除,然后根文件系统 下的init程序(/sbin/init)将会被执行。 init处理挂载并转到最终的、也是真正的根文件系统下。如果在大容量存储设备可以存取之前需要特殊的硬件驱动,它们必须被包含在initramfs映像中。

一旦内核设置好了所有硬件并被挂载到根文件系统之后将会开始运行/sbin/init程序。这个初始进程将会启动其他进程来让系统开始运行。系统中的绝大多数其他进程归根结底都是来源于init;例外的是内核进程,直接由内核启动来管理操作系统的内部细节。 传统上,(这个进程的启动是使用System V UNIX的数据返回约定来完成的,在系统经过一系列的包括各种开启和关闭服务的脚本时。)???每种运行级别提供不同的系统运行模式。在不同的级别,每个单独的服务都能被运行或者在运行时被关闭。较新的发行版已经开始抛弃the System V 标准了,但为了兼容性的目的还是通常支持the System V约定。 除了启动系统之外,init也负责保持系统运行和完全关闭系统。它表现为所有非内核进程的最终管理者,当需要时会在进程结束之后进行清理。同时在用户登入登出时重启用户登录进程。

字符界面登录

在引导过程结束之前,init启动会一些字符界面的登录提示符(使用一个叫getty的程序)。它能允许你输入用户名和密码,最后转到命令解释器。默认的命令解释器通常是bash(Bourne Shell的后继,叫GNU Bourne Again Shell),但也有许多其他的高级命令解释器。shell输出一个字符提示符,预示它已经准备好接受命令。在用户输入命令并按下回车键之后,命令就会被执行。在命令执行完之后将会显示另一个提示符。 在你学完后面的‘命令行操作’之后,终端将可以使用ALT键作为一个额外的功能键。大多数发行版启动六个终端和用F1和F2启动的图形终端。如果图形终端已经启动了,切换到字符需要按下CRTL-ALT+功能键(F1到F7).如果你处在纯字符模式,你可能需要使用startx命令来启动或重启你的图形桌面。

X Window System

通常,在一个Linux桌面系统中,加载X Window System是引导过程的最后一步。一个被称为显示管理器的服务被提供用来追踪显示过程和加载X server(这样叫是因为它提供应用程序的图形服务,有时也叫做X clients)。这个显示管理器也处理图形化的登陆界面以及在一个用户登录后开启合适的桌面环境。 一个桌面环境包含一个启动和维护图形会话组件的会话管理器、一个控制和摆放窗口、标题栏以及一系列控件的窗口管理器。不过它们都是一同呈现的。通常这些程序、会话管理器和窗口管理器会被作为一个整体同时使用以提供一个无缝的桌面环境。如果显示管理器没有在默认运行级别启动,你可以通过另一种方法启动X,在通过字符界面登录后,从命令行运行 startx 命令。

转载请注明来源