下一页 上一页 目录

5. 启动

当系统启动时,BIOS 从第一个磁盘(或软盘或 CDROM)读取 0 扇区(称为 MBR - 主引导记录),并跳转到那里找到的代码 - 通常是一些引导加载程序。这些在那里找到的小型引导程序通常没有自己的磁盘驱动程序,而是使用 BIOS 服务。这意味着,除非您同时拥有现代 BIOS(支持扩展 INT13 功能的 BIOS)和现代引导加载程序(在可用时使用这些功能的引导加载程序),否则只有当 Linux 内核完全位于前 1024 个柱面内时才能启动。

这个问题(如果它是一个问题)很容易解决:确保内核(以及启动期间使用的其他文件,例如 LILO 映射文件)位于 BIOS 可以访问的磁盘的前 1024 个柱面内完全包含的分区上 - 这可能意味着第一个或第二个磁盘。

因此:创建一个小的分区,比如 10 MB 大小,以便有空间容纳一些内核,并确保它完全包含在第一个或第二个磁盘的前 1024 个柱面内。将其挂载到 /boot,以便 LILO 将其内容放在那里。

大多数 1998 年或以后的系统都将拥有现代 BIOS。

5.1 LILO 以及 `lba32' 和 `linear' 选项

概要总结:如果您使用 LILO 作为引导加载程序,请确保您拥有 LILO 21.4 或更高版本。(可以在 ftp://metalab.unc.edu/pub/Linux/system/boot/lilo/ 找到。)始终使用 lba32 选项。

调用 /sbin/lilo(引导映射安装程序)会在引导映射中存储地址列表,以便 LILO(引导加载程序)知道从哪里读取内核映像。默认情况下,这些地址以 (c,h,s) 格式存储,并且在启动时使用普通的 INT13 调用。

当配置文件指定 lba32linear 时,将存储线性地址。使用 lba32 时,如果 BIOS 支持扩展 INT13,则在启动时也使用线性地址。使用 linear 或旧 BIOS 时,这些线性地址会被转换回 (c,h,s) 格式,并使用普通的 INT13 调用。

因此,使用 lba32 时,没有几何结构问题,也没有 1024 柱面限制。不使用它时,则存在 1024 柱面限制。那么几何结构呢?

引导加载程序和 BIOS 必须就磁盘几何结构达成一致。/sbin/lilo 向内核询问几何结构,但不能保证 Linux 内核几何结构与 BIOS 将使用的几何结构一致。因此,内核提供的几何结构通常是无价值的。在这种情况下,给 LILO `linear' 选项会有所帮助。优点是 Linux 内核对几何结构的理解不再起作用。缺点是当内核的一部分存储在 1024 柱面限制之上时,lilo 无法警告您,您最终可能会得到一个无法启动的系统。

5.2 LILO 的一个错误

对于低于 v21 的 LILO 版本,还有另一个缺点:启动时完成的地址转换存在一个错误:当 c*H 为 65536 或更大时,计算中会发生溢出。对于大于 64 的 H,这会导致对 c 的更严格限制,比众所周知的 c < 1024 更严格;例如,对于 H=255 和旧 LILO,必须有 c < 258。(c=内核映像所在的柱面,H=磁盘磁头数)

5.3 1024 柱面并非真的是 1024 柱面

Tim Williams 写道:“我的 Linux 分区位于前 1024 个柱面内,但仍然无法启动。直到我将其移动到 1 GB 以下,事情才开始正常工作。” 这怎么可能呢?好吧,这是一个带有 AHA2940UW 控制器的 SCSI 磁盘,它使用 H=64,S=32(即,1 MiB = 1.05 MB 的柱面),或 H=255,S=63(即,8.2 MB 的柱面),具体取决于固件和 BIOS 中的设置选项。毫无疑问,BIOS 假定为前者,因此 1024 柱面限制位于 1 GiB,而 Linux 使用后者,LILO 认为此限制位于 8.4 GB。

5.4 在使用 IDE 的旧机器上没有 1024 柱面限制

nuni 引导加载程序不使用 BIOS 服务,而是直接访问 IDE 驱动器。因此,可以将其放在软盘或 MBR 中,并从任何 IDE 驱动器上的任何位置启动(不仅限于前两个)。在 //metalab.unc.edu/pub/Linux/system/boot/loaders/ 可以找到它。

5.5 其他引导加载程序

LILO 有点脆弱,每次安装新内核时都需要运行 /sbin/lilo。其他一些引导加载程序没有这个缺点。特别是 grub 现在很流行;一个主要的缺点是它不支持 lilo -R label 功能。


下一页 上一页 目录