跳转到内容

Ict-创新/LPI/101.2

来自维基教科书,开放世界中的开放书籍

101.2 启动系统

[编辑 | 编辑源代码]

候选人应该能够为 Linux 系统设计磁盘分区方案。候选人应该能够选择、安装和配置引导管理器。

关键知识领域

  • 在启动时向引导加载程序和内核提供通用命令和选项。
  • 展示从 BIOS 到启动完成的启动顺序知识。
  • 检查日志文件中的启动事件。

当一台 x86 计算机启动时,它会按照一组预定义的步骤来启动操作系统。在启动时,CPU 会跳转到 BIOS 的地址并开始加载它。BIOS 会执行一些检查并初始化硬件,然后找到已配置的启动设备。启动设备是在 BIOS 用户界面中配置的,通过设置连接的存储设备的启动顺序。

一旦找到启动设备,BIOS 就会继续加载启动设备的主引导记录 (MBR)。MBR 是启动设备的第一个扇区(512 字节),它包含第一阶段引导加载程序和分区表。第一阶段引导加载程序可以在 Linux 第一个阶段引导加载程序的情况下直接启动操作系统,但通常第一阶段引导加载程序负责查找和加载第二阶段引导加载程序,在 Linux 引导加载程序的情况下,这允许在选择要启动的内核和操作系统方面具有更大的灵活性。

分区表是第一阶段引导加载程序能够找到第二阶段引导加载程序偏移量的必要条件。由于 MBR 的大小有限,分区表只包含主分区的位置,因此要求第二阶段引导加载程序必须位于主分区上。

第一阶段引导加载程序通过查看标记为活动/可启动的分区的引导扇区来查找第二阶段引导加载程序的分区。(稍后在查看磁盘分区时,我们将介绍将分区(而不是整个设备)标记为可启动。)

第二阶段引导加载程序的任务是为 Linux 加载操作系统;这意味着 Linux 内核和初始 RAM 磁盘。第二个引导加载程序可能会向用户呈现一个菜单来选择要启动的内核,甚至允许用户启动异构操作系统(即双启动)。

一旦第二个引导加载程序加载了内核,它就会将控制权传递给内核。内核启动并配置 CPU 类型、中断处理、内存管理的其余部分(如分页表和内存分页)、设备初始化、驱动程序等。

内核还会将任何可能存在的初始 RAM 磁盘映像加载到内存中,并在 ram 中将其安装为临时根文件系统。初始 RAM 磁盘 (initrd) 包含内核需要访问系统硬件的系统配置文件和模块的映像。正是在这里加载了各种文件系统和磁盘驱动程序,使内核能够找到并挂载真正的根分区。例如,如果真正的根分区位于 RAID 1 设备上,则需要加载 raid1 的模块才能使内核能够挂载和读取根文件系统。一旦内核能够访问真正的根文件系统,临时根文件系统就会被替换。

一旦内核完全运行,它就会启动一个初始程序,默认情况下是 /sbin/init。init 程序设置用户空间并启动登录 shell 和/或图形登录。init 进程完成其初始化后,哪些服务启动以及机器的状态取决于默认运行级别及其配置。


图 101.2.1:启动过程

启动参数

[编辑 | 编辑源代码]

Linux 有两个广泛使用的引导加载程序,分别是 GRUBLILO。这两个引导加载程序至少被分成两个阶段。第一阶段是一个位于 MBR 上的小型机器代码二进制文件。它的唯一工作是查找和加载第二阶段引导加载程序。然后,第二阶段引导加载程序找到并加载 Linux 内核,并将它提供的任何参数传递给它。

当第二阶段引导加载程序运行时,您有机会通过引导加载程序的一部分文本控制台向 Linux 内核传递其他参数。您可能传递给内核的典型参数包括

init
覆盖内核在完成加载后运行的进程。“init=/bin/bash” 用于在忘记 root 密码的情况下绕过登录提示。因为这提供了对 root shell 的访问,这也突出了为什么对计算机控制台进行良好的物理访问控制很重要,以及为什么用密码保护引导加载程序是一个好主意。这将阻止用户修改启动时内核参数。
root
通知内核将哪个设备用作根文件系统。通常在对配置错误的引导加载程序进行故障排除时使用。例如,root = /dev/hda1 告诉内核使用 /dev/hda1 作为根设备文件系统,而不是它已配置为使用的文件系统。
noapic/nolapic
告诉内核不要使用高级可编程中断控制器或本地高级可编程中断控制器来分配 IRQ 和资源。这实际上是在 Linux 内核中关闭了 PnP
noacpi
关闭 Linux 内核的 高级配置和电源接口 功能。在 BIOS 有缺陷的情况下通常需要它。

还有许多其他参数可以在启动时传递给内核。有关更多选项,请参阅内核文档。


Init 进程概述 (SysV init 风格)

内核完成加载后,它会启动 init 进程。Init 负责检查和挂载 文件系统,以及启动配置的服务,例如网络、邮件和 Web 服务器,它通过进入其默认运行级别来完成这些操作。这在 /sbin/init 应用程序配置文件 /etc/inittab 中配置。下面给出了 inittab 文件的一个示例


# inittab This file describes how the INIT process should set up
# the system in a certain run-level.

id:3:initdefault:

# System initialization.
si::sysinit:/etc/rc.d/rc.sysinit

l0:0:wait:/etc/rc.d/rc 0
l1:1:wait:/etc/rc.d/rc 1
l2:2:wait:/etc/rc.d/rc 2
l3:3:wait:/etc/rc.d/rc 3
l4:4:wait:/etc/rc.d/rc 4
l5:5:wait:/etc/rc.d/rc 5
l6:6:wait:/etc/rc.d/rc 6

# Trap CTRL-ALT-DELETE
ca::ctrlaltdel:/sbin/shutdown -t3 -r now

# When our UPS tells us power has failed, assume we have a few minutes
# of power left. Schedule a shutdown for 2 minutes from now.
# This does, of course, assume you have powerd installed and your
# UPS connected and working correctly.
pf::powerfail:/sbin/shutdown -f -h +2 "Power Failure; System Shutting Down"

# If power was restored before the shutdown kicked in, cancel it.
pr:12345:powerokwait:/sbin/shutdown -c "Power Restored; Shutdown Cancelled"

# Run gettys in standard runlevels
1:2345:respawn:/sbin/mingetty tty1
2:2345:respawn:/sbin/mingetty tty2
3:2345:respawn:/sbin/mingetty tty3
4:2345:respawn:/sbin/mingetty tty4
5:2345:respawn:/sbin/mingetty tty5
6:2345:respawn:/sbin/mingetty tty6
# Run xdm in runlevel 5
x:5:respawn:/etc/X11/prefdm -nodaemon

inittab 文件中的一行具有以下格式

id:runlevels:actions:process

id
1-4 个字符,标识函数,
runlevels
将执行 process 的运行级别,
action
定义的事件列表中之一,对于该事件应执行该进程,或者是对 init 的指令,说明在执行该进程时该怎么做。最常用的操作是
wait
init 将等待它启动的进程完成,然后继续,
respawn
告诉 init 每当进程终止时重新启动进程,这对登录进程很有用。
Ctrl-Alt-Del
它捕获 ctrl-alt-delete 键组合,
initdefault
设置默认运行级别
powerfail 和 powerokwait
用于在发生电源故障和恢复时响应连接的 UPS 设备的通知
process
要执行的命令

第 5 行 设置 init 的默认运行级别。为了确定默认运行级别,init 进程会搜索 initdefault 条目,如果没有这样的条目(或者根本没有 /etc/inittab),则必须在系统控制台上输入一个运行级别。有 6 个运行级别。在 RedHat 风格的系统上,服务器的默认运行级别是 3(没有 GUI)或桌面计算机的 5。

第 8 行 用于 sysinit 操作,此进程会针对每个运行级别运行。

第 10-16 行 定义了应为每个运行级别运行的脚本。

第 19、25、28 行 定义了在发生指定操作时要运行的进程。这些操作是

  • 第 19 行 当按下 ctrl-alt-delete 组合键时,计算机将关闭,
  • 第 25 行 当收到电源中断时来自 ups 的信号时,计算机将在 2 分钟后关闭,
  • 第 28 行 当恢复供电且机器没有关闭时,计划的关闭将被取消。

第 32-37 行 生成控制台登录。它们被设置为在进程死亡时自动重启。

第 40 行 - 启动运行级别 5 的图形登录控制台

在生成所有指定的进程后,init 会进入休眠状态,并等待以下三种事件之一发生:- 它启动的进程结束或死亡、电源故障信号或通过 /sbin/telinit 请求进一步更改运行级别。

启动过程故障排除

[编辑 | 编辑源代码]

在启动过程中,内核会加载/探测各种模块以查找其支持的硬件,从而在进程中产生大量日志输出。这些是在系统启动期间飞过的控制台消息。

由于日志服务尚未启动,内核将消息记录到内存中的环形缓冲区。它被称为环形缓冲区,因为一旦日志达到设定的内存大小,较早的消息就会被较新的消息覆盖。

由于环形缓冲区中的信息可能会在重启时或被覆盖时丢失,因此大多数发行版会将环形缓冲区条目写入磁盘,具体位置取决于其日志服务配置,例如 /var/log/dmesg、/var/log/messages 或 /var/log/syslog。

可以使用 dmesg 命令读取环形缓冲区的内容。这通常与分页工具(如 less)结合使用,因为环形缓冲区中包含的数据量通常太大,无法在一屏上显示。

dmesg | less

如果您在启动过程中硬件配置不正确,则环形缓冲区是查找线索的好地方,以确定可能存在的问题,因为通常驱动程序会写入一些错误消息,可以帮助解决问题。

除了环形缓冲区之外,您还可以检查日志服务配置的系统日志文件。这些文件位于 /var/log 目录下,可能是 /var/log/syslog 或 /var/log/messages。

无法启动到命令提示符

在某些情况下,您可能会在启动过程中被转到命令行,并出现消息提示根设备无法找到,或者您可以键入 Template:Key prass 加上根密码以执行维护操作。这通常意味着根设备配置不正确,您可能可以在命令行中解决此问题。

在其他情况下,您可能会收到一条消息,提示“内核恐慌”,并且机器会自动重启,或者在不可用状态下等待,直到重启。这类问题的起因很多,从 initrd 镜像配置不正确到缺少根设备。系统故障前屏幕上的输出可以为您提供有关配置错误的线索。这可能是由于

  • 引导加载程序的配置问题,即它配置为错误的根设备,
  • initrd 镜像中缺少模块,
  • 根文件系统的配置错误。

在引导加载程序配置不正确的情况下,您可以在第二阶段按 e 进入引导加载程序编辑器(适用于 grub 加载程序),或者在 lilo 提示符下输入正确的参数以使计算机启动,并在系统成功启动后编辑配置文件。在其他情况下,可能需要启动一个 live CD,然后在不挂载的情况下对根文件系统进行故障排除。



使用的文件、术语和工具

  • /var/log/messages
  • dmesg
  • BIOS
  • 引导加载程序
  • 内核
  • init


上一章 | 下一章

华夏公益教科书