跳转到内容

从菜鸟到黑客/Linux

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

本节解释了 Linux 系统启动和关闭时发生的情况,以及如何正确地执行这些操作。如果未遵循正确的程序,文件可能会损坏或丢失。

启动和关闭概述

[编辑 | 编辑源代码]

打开计算机系统并加载其操作系统的行为称为启动。这个名字来源于计算机“自力更生”的形象,但实际操作略微现实一些。

在引导过程中,计算机首先加载一小段称为引导加载程序的代码,该代码依次加载并启动操作系统。引导加载程序通常存储在硬盘或软盘上的固定位置。采用这种两步过程的原因是,操作系统庞大而复杂,但计算机加载的第一段代码必须非常小(几百字节),以避免使固件不必要地复杂化。

不同的计算机以不同的方式进行引导。对于 PC,计算机(其 BIOS)读取软盘或硬盘上的第一个扇区(称为引导扇区)。引导加载程序包含在此扇区中。它从磁盘上的其他位置(或其他位置)加载操作系统。

Linux 加载后,它会初始化硬件和设备驱动程序,然后运行 init。init 启动其他进程以允许用户登录并执行操作。这部分的细节将在下面讨论。

为了关闭 Linux 系统,首先会通知所有进程终止(这使它们关闭所有文件并执行其他必要的操作以保持整洁),然后卸载文件系统和交换区,最后向控制台打印一条消息,指示可以关闭电源。如果不遵循正确的程序,将会发生可怕的事情;最重要的是,文件系统缓冲区缓存可能不会被刷新,这意味着其中的所有数据都会丢失,并且磁盘上的文件系统不一致,因此可能无法使用。

更深入地了解启动过程

[编辑 | 编辑源代码]

当 PC 启动时,BIOS 将执行各种测试以检查一切是否正常,然后开始实际的启动。此过程称为开机自检,简称 POST。它将选择一个磁盘驱动器(通常是第一个软盘驱动器,如果插入了软盘,否则是第一个硬盘,如果计算机中安装了硬盘;但是,顺序可能是可配置的),然后读取其第一个扇区。这称为引导扇区;对于硬盘,也称为主引导记录,因为硬盘可以包含多个分区,每个分区都有自己的引导扇区。

引导扇区包含一个小程序(足够小,可以放入一个扇区),其职责是从磁盘读取实际的操作系统并启动它。从软盘启动 Linux 时,引导扇区包含的代码仅将前几百个块(当然,取决于实际内核的大小)读取到内存中的预定位置。在 Linux 启动软盘上,没有文件系统,内核只是存储在连续的扇区中,因为这简化了启动过程。但是,可以通过使用 LILO(Linux 加载程序)或 GRUB(Grand Unifying Bootloader)从带有文件系统的软盘启动。

从硬盘启动时,主引导记录中的代码将检查分区表(也在主引导记录中),识别活动分区(标记为可引导的分区),从该分区读取引导扇区,然后启动该引导扇区中的代码。分区引导扇区中的代码执行软盘引导扇区执行的操作:它将从分区读取内核并启动它。但是,细节有所不同,因为通常没有必要为内核映像单独设置一个分区,因此分区引导扇区中的代码不能只是按顺序读取磁盘,它必须找到文件系统将它们放在任何地方的扇区。有几种方法可以解决此问题,但最常见的方法是使用像 LILO 或 GRUB 这样的引导加载程序。(但是,有关如何执行此操作的详细信息与本次讨论无关;有关更多信息,请参阅 LILO 或 GRUB 文档;它是最全面的。)

启动时,引导加载程序通常会继续读取并启动默认内核。也可以配置引导加载程序以能够启动多个内核中的一个,甚至启动 Linux 之外的其他操作系统,并且用户可以在启动时选择要启动的内核或操作系统。例如,可以配置 LILO,以便如果在启动时(加载 LILO 时)按住 Alt、Shift 或 Ctrl 键,LILO 将询问要启动的内容,而不是立即启动默认值。或者,可以配置引导加载程序,使其始终询问,并带有一个可选的超时,这将导致启动默认内核。

也可以在内核或操作系统的名称之后提供内核命令行参数。有关可能选项的列表,您可以阅读http://www.tldp.org/HOWTO/BootPrompt-HOWTO.html

从软盘和硬盘启动都有其优点,但通常从硬盘启动更好,因为它避免了使用软盘的麻烦。它也更快。大多数 Linux 发行版将在安装过程中为您设置引导加载程序。

无论使用何种方式,在 Linux 内核被读取到内存中并真正启动后,大致会发生以下情况

  • Linux 内核以压缩形式安装,因此它将首先解压缩自身。内核映像的开头包含一个执行此操作的小程序。
  • 如果您有一个 Linux 识别的超级 VGA 卡并且该卡具有一些特殊的文本模式(例如 100 列 x 40 行),Linux 会询问您要使用哪种模式。在内核编译期间,可以预设视频模式,以便永远不会询问。这也可以通过 LILO、GRUB 或 rdev 完成。
  • 之后,内核会检查还有哪些其他硬件(硬盘、软盘、网络适配器等),并相应地配置其一些设备驱动程序;在此过程中,它会输出有关其发现结果的消息。例如,当我启动时,它看起来像这样
LILO boot:
Loading linux.
Console: colour EGA+ 80x25, 8 virtual consoles
Serial driver version 3.94 with no serial options enabled
tty00 at 0x03f8 (irq = 4) is a 16450
tty01 at 0x02f8 (irq = 3) is a 16450
lp_init: lp1 exists (0), using polling driver
Memory: 7332k/8192k available (300k kernel code, 384k reserved, 176k 
data)
Floppy drive(s): fd0 is 1.44M, fd1 is 1.2M
Loopback device init
Warning WD8013 board not found at i/o = 280.
Math coprocessor using irq13 error reporting.
Partition check:
hda: hda1 hda2 hda3
VFS: Mounted root (ext filesystem).
Linux version 0.99.pl9-1 (root@haven) 05/01/93 14:12:20
  • 确切的文本在不同的系统上有所不同,具体取决于硬件、使用的 Linux 版本以及其配置方式。
  • 然后,内核将尝试挂载根文件系统。该位置可以在编译时或任何时候使用 rdev 或引导加载程序进行配置。文件系统类型会自动检测。如果挂载根文件系统失败,例如因为您忘记在内核中包含相应的磁盘文件系统驱动程序,则内核会发生恐慌并停止系统(无论如何它无能为力)。
  • 根文件系统通常以只读方式挂载(这可以通过与位置相同的方式设置)。这使得在挂载文件系统时可以检查文件系统;检查以读写方式挂载的文件系统不是一个好主意。
  • 之后,内核在后台启动程序 init(位于 /sbin/init)(这将始终成为进程号 1)。init 执行各种启动任务。它执行的确切操作取决于它的配置方式;有关更多信息,请参阅第 2.3.1 节(尚未编写)。它至少会启动一些必要的后台守护进程。
  • 然后,init 切换到多用户模式,并为虚拟控制台和串行线路启动 getty。getty 是允许人们通过虚拟控制台和串行终端登录的程序。init 还可以根据其配置方式启动其他一些程序。
  • 此后,启动完成,系统正常运行。

有关 LILO 的更多信息,您可以阅读http://www.tldp.org/HOWTO/LILO.html

有关 GRUB 的更多信息,您可以访问http://www.gnu.org/software/grub/grub.html

关于关闭的更多信息

[编辑 | 编辑源代码]

在关闭 Linux 系统时,遵循正确的步骤非常重要。如果操作不当,您的文件系统可能会损坏,文件可能会变得混乱。这是因为 Linux 拥有一个磁盘缓存,它不会立即将数据写入磁盘,而是在一段时间间隔内写入。这极大地提高了性能,但也意味着如果您随意关闭电源,缓存中可能保存了大量数据,磁盘上的内容可能不是一个完整可用的文件系统(因为只有一部分数据被写入磁盘)。

另一个反对直接断电的理由是,在多任务系统中,后台可能有很多操作正在进行,断电可能会造成灾难性的后果。通过使用正确的关机序列,您可以确保所有后台进程都能保存其数据。

正确关闭 Linux 系统的命令是 shutdown。它通常以两种方式之一使用。

如果您正在运行一个只有您一个用户的系统,则通常使用 shutdown 的方法是:退出所有正在运行的程序,注销所有虚拟控制台,以 root 用户身份登录其中一个控制台(或者如果您已经以 root 用户身份登录,则保持登录状态,但您应该切换到 root 的主目录或根目录,以避免卸载时出现问题),然后执行命令 shutdown -h now(如果您需要延迟,可以将 now 替换为加号和分钟数,不过在单用户系统上通常不需要)。

或者,如果您的系统有多个用户,请使用命令 shutdown -h +time message,其中 time 是系统停止运行前的分钟数,message 是一个简短的说明,解释系统停止运行的原因。

  1. shutdown -h +10 '我们将安装一个新的

磁盘。* 系统应该在三小时内恢复在线。'

这将警告每个人系统将在十分钟内关闭,他们最好离开或丢失数据。警告将打印到每个人登录的每个终端上,包括所有 xterm。

来自 root (ttyp0) 的广播消息 1995 年 8 月 2 日星期三 01:03:25...

我们将安装一个新的磁盘。* 系统应该在三小时内恢复在线。系统将在 10 分钟内关闭以进行系统停止!!

在启动之前,警告会自动重复几次,随着时间的推移,间隔会越来越短。

在任何延迟之后,当真正的关机开始时,所有文件系统(根文件系统除外)都将被卸载,用户进程(如果有人仍然登录)将被终止,守护进程将被关闭,所有文件系统都将被卸载,并且通常所有内容都将稳定下来。完成后,init 会打印一条消息,提示您可以关闭机器电源。然后,也只有在然后,您才能将手指移向电源开关。

有时,尽管在任何良好的系统上都很少见,但无法正确关机。例如,如果内核出现恐慌并崩溃并烧毁并普遍出现故障,则可能完全无法发出任何新命令,因此正确关机有些困难,您能做的几乎所有事情都希望没有任何东西受到严重损坏并关闭电源。如果问题不那么严重(例如,有人用斧头敲击您的键盘),并且内核和更新程序仍然正常运行,则最好等待几分钟,让更新有机会刷新缓冲区缓存,然后再切断电源。

在过去,有些人喜欢使用 sync 命令三次来关机,等待磁盘 I/O 停止,然后关闭电源。如果没有正在运行的程序,这等同于使用 shutdown。但是,它不会卸载任何文件系统,这会导致 ext2fs“干净文件系统”标志出现问题。不建议使用三次回显的方法。

(如果您想知道:三次回显的原因是在 UNIX 的早期,当命令是单独键入时,这通常提供了足够的时间来完成大多数磁盘 I/O。)

重新启动

[编辑 | 编辑源代码]

重新启动意味着再次启动系统。这可以通过先完全关闭系统,关闭电源,然后重新打开电源来实现。更简单的方法是让 shutdown 重新启动系统,而不是仅仅停止它。这是通过对 shutdown 使用 -r 选项来实现的,例如,通过执行命令 shutdown -r now。

大多数 Linux 系统在按下键盘上的 ctrl-alt-del 时运行 shutdown -r now。这将重新启动系统。但是,ctrl-alt-del 上的操作是可配置的,在多用户机器上,在重新启动之前允许一些延迟可能会更好。在物理上可供任何人访问的系统甚至可以配置为在按下 ctrl-alt-del 时不执行任何操作。

单用户模式

[编辑 | 编辑源代码]

shutdown 命令也可用于将系统降级到单用户模式,在这种模式下,没有人可以登录,但 root 可以使用控制台。这对于在系统正常运行时无法完成的系统管理任务很有用。

紧急启动软盘

[编辑 | 编辑源代码]

并非总是可以从硬盘启动计算机。例如,如果您在配置 LILO 时出错,可能会导致系统无法启动。对于这些情况,您需要一种始终有效的替代启动方式(只要硬件正常工作)。对于典型的 PC,这意味着从软盘驱动器启动。

大多数 Linux 发行版允许在安装期间创建紧急启动软盘。这样做是个好主意。但是,某些此类启动磁盘仅包含内核,并假设您将使用发行版安装磁盘上的程序来修复您遇到的任何问题。有时这些程序不够用;例如,您可能需要从使用安装磁盘上没有的软件创建的备份中恢复某些文件。

因此,可能还需要创建一个自定义根软盘。格雷厄姆·查普曼编写的 Bootdisk HOWTO 包含执行此操作的说明。您可以在 http://www.tldp.org/HOWTO/Bootdisk-HOWTO/index.html 找到此 HOWTO。当然,您必须记住使您的紧急启动和根软盘保持最新。

您不能将用于挂载根软盘的软盘驱动器用于其他任何用途。如果您只有一个软盘驱动器,这可能会造成不便。但是,如果您有足够的内存,可以配置您的启动软盘将根磁盘加载到 ramdisk(启动软盘的内核需要为此进行特殊配置)。将根软盘加载到 ramdisk 后,软盘驱动器就可以挂载其他磁盘了。

华夏公益教科书