Linux 系统启动

作者:Rick Mann

如今,您可以购买 Linux 发行版,安装并使用它,而无需真正了解操作系统本身。对于那些可能刚接触 Linux 并想更多了解其操作系统的新手来说,本文将深入探讨 PC 上 Linux 的启动顺序。

启动计算机的专业术语是“引导”(bootstrapping),简称是“booting”或“boot”。此引导过程的初始部分由存储在 ROM 中的代码执行。这段代码本质上是通用的,并非 Linux 特有。它的任务是加载特定于 Linux 的引导加载程序,并将系统控制权交给它。

引导加载程序

引导加载程序是由 ROM 加载的程序。它可以是主板上的 BIOS(基本输入/输出系统),也可以是特定于设备的代碼,例如在 SCSI 磁盘控制器板上找到的代码。PC 上有两种流行的引导加载程序。LILO(Linux loader 的缩写)是传统的加载程序,而 GRUB(grand unified bootloader 的缩写)是较新的加载程序。每个程序都负责获取一些配置信息,加载 Linux(或其他)内核,并将控制权交给操作系统。

LILO 和 GRUB 之间最显著的区别在于它们获取配置信息的方式。LILO 的配置通过运行 lilo 命令以静态形式保存。此信息被写入磁盘的主引导记录(MBR)或 Linux 根分区引导记录。lilo 命令使用的配置信息通常存储在 /etc/lilo.conf 中。这是一个示例配置文件

boot=/dev/hda   # boot loader to MBR
root=/dev/hda1  # root partition
install=/boot/boot.b
map=/boot/map
delay=50        # 5 second delay before auto-boot
image=/vmlinuz  # kernel
  label=linux   # name to refer to entry
  read-only
image=/vmlinuz.old      # backup entry
  label=old
  read-only

在此示例中,可以引导两个可能的内核:vmlinuz 和 vmlinuz.old。在 LILO 提示符下,您可以通过输入以下内容来选择您想要的内核linux来选择当前内核,或者old来选择备份内核。在 LILO 提示符下按 TAB 键会列出这些选项。如果您重建内核或想要进行任何其他更改,您需要重新运行 lilo 命令以重新读取配置文件,然后使用此新配置信息重新安装 LILO。

GRUB 在启动时读取配置文件。GRUB 的 MBR 只有 512 字节。安装在 MBR 中的 GRUB 部分执行一些系统的基本初始化,确定如何访问引导驱动器,然后从驱动器加载 GRUB 的其余部分。

GRUB 由 grub-install 程序安装。有关更多详细信息,请参阅 GRUB 手册页。GRUB 信息页也很有帮助。配置文件通常位于 /boot/grub 目录中,尽管 SUSE 将其放在 menu.lst 中,而 Red Hat 将其存储在 grub.conf 中。这是一个示例配置文件

default 0
timeout 8
gfxmenu (hd0,1)/boot/message

title Linux
    kernel (hd0,1)/boot/vmlinuz root=/dev/hda2 desktop showopts
    initrd (hd0,1)/boot/initrd

title Failsafe
    kernel (hd0,1)/boot/vmlinuz root=/dev/hda2 showopts ide=nodma apm=off acpi=o
ff vga=normal nosmp noapic maxcpus=0 3
    initrd (hd0,1)/boot/initrd

title Memory Test
    kernel (hd0,1)/boot/memtest.bin

如果您与来自 Redmond 的专有操作系统共享计算机,请注意,该专有系统不会意识到还有其他操作系统可用。因此,当您在 Linux 之后安装该系统时,它会简单地覆盖整个 MBR。如果您先安装专有操作系统软件,然后再安装 Linux,一切都应该没问题,并且您应该能够引导任一操作系统。

运行级别

运行级别为您提供一系列系统配置。除非另有说明,否则系统以默认运行级别启动,通常是级别 3 或级别 5。您可以通过在 LILO 中输入标签名称来更改此行为。在 GRUB 中,您可以输入单词boot,然后是单词single在引导加载程序提示符下。

有七个标准运行级别,0 到 6。级别 0 表示关机,级别 1 是单用户模式,级别 6 表示重启。其他级别可供您自行设置各种系统配置。最典型的是使用运行级别 3,这是一个完全可操作的系统,但没有运行 GUI (X)。级别 5 类似于级别 3,只是它运行 GUI。许多系统还有一个名为 S 的运行级别,它类似于运行级别 1,但需要输入 root 密码。这是出于安全原因提供的。

文件 /etc/inittab 的内容决定了在每个运行级别采取的操作,并且它还指定了默认运行级别。以下是 /etc/inittab 中可能出现的一个示例

#
# /etc/inittab
#
# This is the main configuration file of /sbin/init, which
# is executed by the kernel on startup.
#

# The default runlevel
id:5:initdefault:

# /etc/init.d/rc takes care of runlevel handling
#
# runlevel 0  is  System halt   (Do not use this for initdefault!)
# runlevel 1  is  Single user mode
# runlevel 2  is  Local multiuser without remote network (e.g. NFS)
# runlevel 3  is  Full multiuser with network
# runlevel 4  is  Not used
# runlevel 5  is  Full multiuser with network and xdm
# runlevel 6  is  System reboot
#
l0:0:wait:/etc/init.d/rc 0
l1:1:wait:/etc/init.d/rc 1
l2:2:wait:/etc/init.d/rc 2
l3:3:wait:/etc/init.d/rc 3
l5:5:wait:/etc/init.d/rc 5
l6:6:wait:/etc/init.d/rc 6

# what to do in single-user mode
ls:S:wait:/etc/init.d/rc S
~~:S:respawn:/sbin/sulogin

# what to do when CTRL-ALT-DEL is pressed
ca::ctrlaltdel:/sbin/shutdown -r -t 4 now

# getty-programs for the normal runlevels
# :::
# The "id" field  MUST be the same as the last
# characters of the device (after "tty").
1:2345:respawn:/sbin/mingetty --noclear 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

这一行id:5:initdefault将默认运行级别设置为 5。以下形式的行调用脚本 /etc/init.d/rc,并将运行级别作为参数传递给它。然后,此脚本启动与特定运行级别关联的进程,并停止其他进程。用于控制每个进程的所有脚本也位于 /etc/init.d 目录中。

通常,应在每个运行级别启动和停止哪些进程的详细信息位于 /etc/init.d 的子目录中,例如,运行级别 5 的 rc5.d。在这些特定于运行级别的目录中的每一个中,都使用符号链接来标识进程。以“K”开头的链接名称指的是要停止(kill)的进程,而以“S”开头的链接名称指的是要启动的进程。链接按字母顺序访问,这意味着 kill 脚本首先运行。kill 和 start 列表中的脚本顺序通过在 K 或 S 之后立即使用两位数字来控制。

我说过,这些进程启动/停止详细信息通常以这种方式处理,因为这是处理此信息的标准方式。但是,一些供应商使用略有不同的方案,但在所有情况下,generainit 程序都是控制整个过程的程序。如果您熟悉 UNIX 如何处理启动,generainit 类似于 System V Init。

如果在整个过程中没有遇到任何问题,您的系统现在应该处于您选择的运行级别。一旦系统启动并运行,您可以通过以 root 用户身份登录并使用 init 命令来更改运行级别。例如,要更改为运行级别 3,您将输入init 3.

版权所有 (c) 2004, Rick Mann。最初发表于 Linux Gazette 第 98 期。版权所有 (c) 2004, Specialized Systems Consultants, Inc.

Rick Mann 从事 C 编程和使用符合 POSIX 标准的操作系统已有 12 年以上。

加载 Disqus 评论