当系统启动时,BIOS 从第一个磁盘(或软盘或 CDROM)读取 0 扇区(称为 MBR - 主引导记录),并跳转到那里找到的代码 - 通常是一些引导加载程序。这些在那里找到的小型引导程序通常没有自己的磁盘驱动程序,而是使用 BIOS 服务。这意味着,除非您同时拥有现代 BIOS(支持扩展 INT13 功能的 BIOS)和现代引导加载程序(在可用时使用这些功能的引导加载程序),否则只有当 Linux 内核完全位于前 1024 个柱面内时才能启动。
这个问题(如果它是一个问题)很容易解决:确保内核(以及启动期间使用的其他文件,例如 LILO 映射文件)位于 BIOS 可以访问的磁盘的前 1024 个柱面内完全包含的分区上 - 这可能意味着第一个或第二个磁盘。
因此:创建一个小的分区,比如 10 MB 大小,以便有空间容纳一些内核,并确保它完全包含在第一个或第二个磁盘的前 1024 个柱面内。将其挂载到 /boot
,以便 LILO 将其内容放在那里。
大多数 1998 年或以后的系统都将拥有现代 BIOS。
概要总结:如果您使用 LILO 作为引导加载程序,请确保您拥有 LILO 21.4 或更高版本。(可以在 ftp://metalab.unc.edu/pub/Linux/system/boot/lilo/ 找到。)始终使用 lba32
选项。
调用 /sbin/lilo
(引导映射安装程序)会在引导映射中存储地址列表,以便 LILO(引导加载程序)知道从哪里读取内核映像。默认情况下,这些地址以 (c,h,s) 格式存储,并且在启动时使用普通的 INT13 调用。
当配置文件指定 lba32
或 linear
时,将存储线性地址。使用 lba32
时,如果 BIOS 支持扩展 INT13,则在启动时也使用线性地址。使用 linear
或旧 BIOS 时,这些线性地址会被转换回 (c,h,s) 格式,并使用普通的 INT13 调用。
因此,使用 lba32
时,没有几何结构问题,也没有 1024 柱面限制。不使用它时,则存在 1024 柱面限制。那么几何结构呢?
引导加载程序和 BIOS 必须就磁盘几何结构达成一致。/sbin/lilo
向内核询问几何结构,但不能保证 Linux 内核几何结构与 BIOS 将使用的几何结构一致。因此,内核提供的几何结构通常是无价值的。在这种情况下,给 LILO `linear
' 选项会有所帮助。优点是 Linux 内核对几何结构的理解不再起作用。缺点是当内核的一部分存储在 1024 柱面限制之上时,lilo
无法警告您,您最终可能会得到一个无法启动的系统。
对于低于 v21 的 LILO 版本,还有另一个缺点:启动时完成的地址转换存在一个错误:当 c*H 为 65536 或更大时,计算中会发生溢出。对于大于 64 的 H,这会导致对 c 的更严格限制,比众所周知的 c < 1024 更严格;例如,对于 H=255 和旧 LILO,必须有 c < 258。(c=内核映像所在的柱面,H=磁盘磁头数)
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。
nuni
引导加载程序不使用 BIOS 服务,而是直接访问 IDE 驱动器。因此,可以将其放在软盘或 MBR 中,并从任何 IDE 驱动器上的任何位置启动(不仅限于前两个)。在 //metalab.unc.edu/pub/Linux/system/boot/loaders/ 可以找到它。
LILO 有点脆弱,每次安装新内核时都需要运行 /sbin/lilo
。其他一些引导加载程序没有这个缺点。特别是 grub
现在很流行;一个主要的缺点是它不支持 lilo -R label
功能。