跳转到内容

LPI Linux 认证/启动系统

来自 Wikibooks,开放世界中的开放书籍

101.2 启动系统

[编辑 | 编辑源代码]

(LPIC-1 版本 5.0)

权重:3

描述
考生应该能够引导系统完成启动过程。

关键知识领域

  • 提供引导加载程序的常用命令和启动时内核的选项
  • 演示从 BIOS/UEFI 到启动完成的启动序列的知识
  • 理解 SysVinit 和 systemd。
  • 了解 Upstart。
  • 检查日志文件中的启动事件


以下是使用的文件、术语和实用程序的列表

  • dmesg
  • journalctl
  • BIOS
  • UEFI
  • 引导加载程序
  • 内核
  • initramfs
  • init
  • SysVinit
  • systemd


启动过程概述

[编辑 | 编辑源代码]

当典型的 PC 开机时,BIOS (基本输入输出系统) 检测硬件设备,包括硬盘驱动器,并通过引导优先级列表进行检查。假设我们从硬盘驱动器启动,它将执行第一个启动磁盘的 MBR (阶段 1 引导加载程序) 中的前 512 字节代码。阶段 1 引导加载程序非常基本,其功能是加载阶段 2 (或某些情况下为阶段 1.5) 引导加载程序。下一步取决于使用的引导加载程序类型。Linux 中有 2 个流行的引导加载程序:LILOGRUB

LILO (LInux LOader) 是一个较旧的引导加载程序,现代 Linux 发行版使用 GRUB 而不是 LILO,但它可能仍在较旧的系统上使用。当 LILO 阶段 2 引导加载程序加载时,根据配置,它可能会显示一个菜单,允许用户指定内核选项。一旦内核选项被指定,GRUB 就会加载内核和 initrd 并执行内核,并将用户指定的任何参数传递给它。重要的是要记住,LILO 不是文件系统感知的,因此内核和 initrd 是从硬盘驱动器上的预定义位置加载的。

GRUB (GRand Unified Bootloader) 是一个更新、更灵活的引导加载程序。当阶段 1.5 加载时,它会读取 /boot 分区并从那里加载阶段 2 引导加载程序。阶段 2 引导加载程序从 /boot/grub/grub.conf (RedHat 基于发行版) 或 menu.lst (Debian 基于发行版) 读取配置,并向用户提供选项(如果配置为这样做)。当做出选择时,它会从 /boot/ 分区加载内核和 initrd 并执行它,将用户传递的任何选项传递给它。

当内核加载时,它会检测设备。它必须执行的任务之一是挂载根分区。如果内核中内置了所需的硬件和文件系统支持,则可以立即完成,并且 /sbin/init 程序将被加载。这种情况非常罕见,大多数现代系统将需要将动态加载的模块加载到内核中才能挂载根分区。这些模块包含在初始 RAM 磁盘 (initrd) 中。一旦根分区准备就绪,内核就会运行 /sbin/init 程序,该程序继续加载操作系统。

/sbin/init 是内核启动的第一个进程,它成为所有其他进程的父进程。通常它会读取 /etc/inittab 配置文件,但是,一些更新的替代方案,例如 upstart,不再使用此文件。在 RedHat 基于系统中,init 将执行 /etc/rc.d/rc.sysinit,而在 Debian 基于系统中,则执行 /etc/init.d/rcS。此脚本将挂载分区并执行基本系统设置。接下来,它将运行位于 /etc/rcX.d/ 中的所有脚本,其中 X 是运行级别编号。这可能是 /etc/inittab 文件中指定的默认值,或者管理员提供的编号作为 内核参数。要运行的最后一个脚本是 /etc/rc.local,它可以用于添加特定于系统的初始化步骤。一旦此脚本执行完毕,启动过程就完成了。


引导加载程序配置

[编辑 | 编辑源代码]

LILO 是一个较旧的引导加载程序,它有一些局限性。其中之一是内核和 initrd 位置硬编码到阶段 2 引导加载程序中。这意味着每次添加新的内核映像时,管理员都必须运行 /sbin/lilo 命令来重新安装 LILO;/sbin/lilo 可执行文件使用的配置文件位于 /etc/lilo.conf 中,可能如下所示


#begin LILO global section
boot=/dev/hda
bitmap=/boot/image.bmp
bmp-colors=255,0,255,0,255,0
append="vt.default_utf8=0"
map=/boot/System.map
install=/boot/boot.b
prompt
timeout=50
#VESA framebuffer console @ 1246x768x256
vga=773
#end LILO global section
#Linux bootable partition config begins
image=/boot/vmlinuz-2.0.36
	label=linux
	root=/dev/hda2
	read-only
#Linux bootable partition config ends
#second bootable partition config begins...
  • boot - 此参数指定 LILO 将安装的位置。在上面的示例中,它将是 /dev/hda 磁盘的 MBR (或在某些情况下为 /dev/sda)。
  • bitmap - 它将为您的发行版附加一个自定义背景图像。
  • bmp-colors - 它将设置加载程序的其他背景颜色方案。
  • append - 将在启动期间为特定设置向内核提供任何其他命令,添加或删除内核功能或模块。
  • map - 地图文件由 LILO 自动生成,并在内部使用。建议不要更改此选项。
  • install - 指定要用于引导扇区的映像。同样,建议不要更改此参数。
  • prompt - 此选项允许管理员在系统启动时附加内核命令行选项。
  • timeout - 指定提示超时(以十分之一秒为单位),因此在上面的示例中,超时设置为 5 秒。
  • vga - 在某些系统中,这将指示启动过程将处于什么视频分辨率。
  • image - 内核位置。(对于单独的引导部分,使用不同的内核名称)
  • label - 启动期间在 LILO 菜单中显示的名称。
  • root - 根文件系统位置。
  • read-only - 请参见下面的 内核参数 部分


Grub 在 LILO 上提供了许多优势。其中之一是它提供了类似 bash 的命令行,该命令行可用于动态更改使用的内核或 initrd 映像。下面列出了示例配置文件

default         0
timeout         5
title           Debian GNU/Linux, kernel 2.6.26-2-686
root            (hd0,0)
kernel          /vmlinuz-2.6.26-2-686 root=/dev/mapper/Disk-root ro quiet
initrd          /initrd.img-2.6.26-2-686

第一行指定默认映像,在本例中为映像编号 0,这是唯一配置的映像。第二行指定提示超时(以秒为单位)。如果将其设置为 0,grub 将立即启动默认映像,没有任何提示。接下来的 4 行定义菜单项

  • title - 菜单项的名称
  • root - 要查找内核和 initrd 的分区。在上面的示例中,(hd0,0) 是第一个磁盘上的第一个分区
  • kernel - 要加载的内核映像以及 内核参数。内核的位置相对于 root 分区的顶部,通常为 /boot (不要与 linux 根分区或 / 混淆)
  • initrd - 初始 RAM 磁盘映像。

grub 通常包含许多用于不同内核版本的 title/root/kernel/initrd 集。

内核参数

[编辑 | 编辑源代码]

如上所述,内核需要一些参数,这些参数可以在 grub、LILO 中配置,或者在系统启动期间由用户动态附加。以下是常见内核参数的列表

  • root=<disk> - 指定将被挂载为 / 的根文件系统。它可以是分区 (例如 root=/dev/sda2)、磁盘标签 (root=LABEL=root_partition) 或逻辑卷 (root=/dev/mapper/vg_root-root)
  • roread-only - 指示内核将根文件系统以只读方式挂载。这允许在分区以读写方式重新挂载之前检查文件系统。此选项几乎在所有情况下使用
  • quiet - 不要将诊断消息打印到屏幕上
  • single - 将系统引导到单用户模式 (运行级别 1)
  • console= - 告诉内核将输出发送到控制台。例如,要将其发送到串行端口,请使用 console=/dev/ttyS0
  • init=/ - 可用于指定 /sbin/init 进程的替代品,例如,要获取没有密码的 root shell,请使用 init=/bin/bash

检查日志

[编辑 | 编辑源代码]

所有内核消息诊断消息都被发送到内核环形缓冲区。可以使用 dmesg 命令查看其内容,但是输出可能很繁琐,最好使用 dmesg | less,使用箭头键垂直滚动,使用 Q 退出 dmesg。请记住,此缓冲区具有有限的容量,当出现新消息时,最旧的消息可能会被删除。一旦所有分区被挂载,其中一个 init 脚本将把内核缓冲区的内容写入日志文件,通常为 /var/log/messages,以便在需要时可以获得诊断消息。

[编辑 | 编辑源代码]
华夏公益教科书