当 PC 启动时,BIOS 将进行各种测试以检查一切是否正常,然后开始实际启动。此过程称为 power on self test,或简称 POST(加电自检)。它将选择一个磁盘驱动器(通常是第一个软盘驱动器,如果插入了软盘;否则是第一个硬盘,如果计算机中安装了硬盘;顺序可能是可配置的),然后读取它的第一个扇区。这称为引导扇区;对于硬盘,它也称为 主引导记录,因为硬盘可以包含多个分区,每个分区都有自己的引导扇区。
引导扇区包含一个小程序(足够小以放入一个扇区),其职责是从磁盘读取实际的操作系统并启动它。当从软盘启动 Linux 时,引导扇区包含的代码只需将前几百个块(当然,取决于实际的内核大小)读取到内存中的预定位置。在 Linux 启动软盘上,没有文件系统,内核只是存储在连续的扇区中,因为这简化了启动过程。但是,也可以通过使用 LILO(LInux LOader,Linux 加载器)或 GRUB(GRand Unifying Bootloader,GRand 统一引导加载器)从带有文件系统的软盘启动。
当从硬盘启动时,主引导记录中的代码将检查分区表(也在主引导记录中),识别活动分区(标记为可启动的分区),从该分区读取引导扇区,然后启动该引导扇区中的代码。分区引导扇区中的代码执行软盘引导扇区所做的操作:它将从分区中读取内核并启动它。但是,细节有所不同,因为为内核镜像单独设置一个分区通常没有用,因此分区引导扇区中的代码不能只是按顺序读取磁盘,它必须找到文件系统放置扇区的位置。有几种方法可以解决这个问题,但最常见的方法是使用像 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 列 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 |
然后内核将尝试挂载根文件系统。该位置可以在编译时配置,也可以随时使用 rdev 或引导加载器配置。文件系统类型是自动检测的。如果根文件系统的挂载失败,例如因为您忘记在内核中包含相应的文件系统驱动程序,则内核会 panic 并停止系统(无论如何它也做不了什么)。
根文件系统通常以只读方式挂载(这可以以与位置相同的方式设置)。这使得在文件系统挂载时检查文件系统成为可能;检查以读写方式挂载的文件系统不是一个好主意。
之后,内核启动程序 init(位于/sbin/init)在后台(这将始终成为进程号 1)。 init 执行各种启动杂务。它执行的确切操作取决于它的配置方式;有关更多信息,请参阅 第 2.3.1 节(尚未编写)。它至少会启动一些必要的后台守护进程。
init 然后切换到多用户模式,并为虚拟控制台和串行线路启动 getty。getty 是允许人们通过虚拟控制台和串行终端登录的程序。 init 也可能启动其他一些程序,具体取决于它的配置方式。
此后,启动完成,系统正常运行。
待添加
本节将概述 GRUB 和 LILO 之间的区别。
有关 LILO 的更多信息,您可以阅读 http://www.tldp.org/HOWTO/LILO.html
有关 GRUB 的更多信息,您可以访问 https://gnu.ac.cn/software/grub/grub.html