概述

在加载操作系统之前的引导过程会有以下六个阶段执行:

  1. 基本输入/输出系统(BIOS)
  2. 主引导记录(MBR)
  3. GRand 统一引导加载程序(GRUB)
  4. LInux 内核
  5. Init
  6. 运行级别

在第一步中,也有也有可能是UEFI,引导加载程序的功能都是类似的。

基本输入/输出系统(BIOS)

BIOS是在系统通电时执行硬件初始化的固件。Bios将会初始化和测试系统硬件。它包含足够的信息来加载键盘、鼠标的驱动程序。进入BIOS设置时,可以使用键盘和鼠标将特定的设置保存在CMOS中。

BIOS设置(CMOS)中包含引导设备顺序。空间全会安装优先级顺序传递给每个引导设备。这将检查每个设备的主引导记录(MBR)。当找到MBR时,BIOS会将控制权传递给设备MBR。

主引导记录(MBR)

主引导记录y在某些情况下,技术上不需要主引导记录(MBR),但是MBR是放置在固定或可移动磁盘开头的引导扇区。MBR包含加载程序(Boot Loader)的可执行代码来让系统知道磁盘分区的数据。并非所有分区都包含Boot Loader,如果未找到Boot Loader,则不会加载操作系统。MBR是在没有可执行代码或BootLoader的情况下存在的,不要混淆MBR和Boot Loader。

GRand 统一引导加载程序 (GRUB)

Boot Loader的第一阶段放置在 MBR 中,该 MBR 调用安装在引导分区 (/boot) 上的主引导加载程序(Main Boot Loader)。如果这样配置GRUB的话,会在启动设备时显示一个菜单来选择内核,这项功能允许系统安装多个操作系统。

GRUB配置文件存储在 "/boot/grub/grub.conf"中。

内核

当选择了某一项内核后,初始RAM磁盘(initrd)将被用作临时跟文件系统,知道内核启动。启动内核之后才会安装真正的跟文件系统。

ROOT文件系统的位置是从GRUB传递的,有一个选项"root="。内核作为驱动程序包括用于访问硬盘驱动器分区及其他一些硬件。编译到内核中的驱动程序允许它挂载其他文件系统

然后内核将执行"/sbin/init"

Init

Init是内核加载的第一个程序,它的PID位1。

Init程序将检查'/etc/inittab'文件以确定Linux运行级别。一点选定,程序就会在制定的运行级别加载。

运行级别

运行级别如下:

  • 0 - 停止
  • 1 - 单用户模式
  • 2 - 多用户,无NFS
  • 3 - 完全多用户模式
  • 4 - 未使用
  • 5 - X11
  • 6 - 重新启动

设置位在引导时自动启动的程序可以在以下之一找到:

  • 运行级别 0 - /etc/rc.d/rc0.d/
  • 运行级别 1 - /etc/rc.d/rc1.d/
  • 运行级别 2 - /etc/rc.d/rc2.d/
  • 运行级别 3 - /etc/rc.d/rc3.d/
  • 运行级别 4 - /etc/rc.d/rc4.d/
  • 运行级别 5 - /etc/rc.d/rc5.d/
  • 运行级别 6 - /etc/rc.d/rc6.d/

想要查看默认运行级别,可以在终端执行以下操作:runlevel

关于内核

一旦系统运行,内核就可以控制软件和硬件。应用程序不会直接访问硬件,否则会发生冲突(如果两个应用程序正在访问硬盘驱动器并且一个将其锁定位独占权限,那么其他应用程序就无法访问该硬盘驱动器)。

应用程序从OS库调用函数。库是一组指令,通常用C语言编写,用于管理程序的必要功能,例如一个函数可以从硬盘驱动器请求一个文件。

然后库函数将进行系统调用。对内核进行系统调用,然后内核提供所请求的信息。例如,如果函数需要一个文件,那么库将进行系统调用以打开文件、读取文件并在完成之后关闭文件。内核将执行文件操作并返回从文件中读取的数据。

内核还跟踪系统中所有硬件或与之连接的硬件。即使没有设备的驱动程序,该设备仍可以由内核列出。

使用命令'lshw',即可列出所有硬件,为了更好的视觉效果,可以使用'lshw -html > hardware.html',然后再浏览器中打开新文件查看。

并非所有命令都可以输出HTML格式。大多数程序智慧输出标准文本。使用某些命令可以通过选项 '-v' 来提供更多详细信息。

初始 RamDisk(initrd)

“initrd”文件位于文件夹“/boot”中,名称以“initrd.img-”开头,名字的剩余部分为版本号。如果您执行命令“ls /boot/initrd.img-*”,您将看到系统上所有“initrd”文件的列表。当然,只使用一个。列出的其他文件可能是已更新到较新版本的先前版本。如果有多个文件的列表,那么您可以使用命令“uname -r”确定正在使用哪个文件。列出的版本是内核的版本。'uname -r' 命令的结果将是文件名的其余部分。

如果您想查看“initrd”文件的内容,可以使用文件名运行命令"lsinitramfs"。一个例子是"lsinitramfs /boot/initrd.img-4.4.0-79-generic"。"initrd"文件是已被压缩的,因此可以更快地读取。

注意:请勿修改或删除“initrd”文件,否则系统可能无法启动。

内核文件与“initrd”位于同一文件夹中,并以“vmlinuz-”开头。文件名的结尾是命令“uname -r”给出的内核版本号。

例如,从上面命令“uname-r”的结果是“4.4.0-79-generic”。内核文件名为“vmlinuz- 4.4.0-79-generic” 要查看有关内核文件的信息,您可以执行命令“ls -l vmlinuz-*”。找到您当前运行版本的文件,您可以看到文件大小。

请勿在不知道做什么的情况下删除或修改内核,否则系统可能无法启动。