当 Lilo 启动系统时,它使用 BIOS 调用从磁盘(IDE 驱动器、软盘或其他)加载 Linux 内核。因此,内核必须位于 BIOS 可以访问的位置。
在启动时,Lilo 无法读取文件系统数据,并且您在 /etc/lilo.conf
中输入的任何路径名都在安装时(当您调用 /sbin/lilo 时)解析。安装时是程序构建表的时刻,这些表列出了用于加载操作系统的文件所使用的扇区。因此,所有这些文件必须位于 BIOS 可以访问的分区中(这些文件通常位于 /boot
目录中,这意味着只有您的 Linux 系统的根分区需要通过 BIOS 访问)。
基于 BIOS 的另一个结果是,每当您修改 Lilo 设置时,都必须重新安装引导加载程序(即,您必须重新调用 /sbin/lilo)。每当您重新编译内核并覆盖旧镜像时,都必须重新安装 Lilo。
boot=
指令在 /etc/lilo.conf
中告诉 Lilo 它应该将其主引导加载程序放在哪里。一般来说,您可以指定主引导记录 (/dev/hda
) 或 Linux 安装的根分区(通常是 /dev/hda1
或 /dev/hda2
)。
如果您的硬盘驱动器中安装了另一个操作系统,您最好将 Lilo 安装到根分区而不是 MBR。在这种情况下,您必须使用 fdisk 的 ``a'' 命令或 cfdisk 的 ``b'' 命令将分区标记为“可引导”。如果您不覆盖主引导扇区,您会发现如果需要卸载 Linux 和 Lilo 会更容易。
当然,您总是有办法避免像上面这样的一些“规则”。好吧,即使您已经在那里安装了另一个操作系统,您也可以将 Lilo 安装到 MBR。例如,如果您在您的机器上安装了 Windows NT 4.0 作为第一个操作系统,那么 NT 的引导加载程序被放置在 MBR 中,因此您可以毫无问题地启动 NT。在您安装 Linux 并选择将 Lilo 安装到 MBR 之后,Lilo 重写了 NT 的引导加载程序。下次您启动您的机器时,您将无法启动 NT。但是,这没问题。您应该编辑您的 /etc/lilo.conf
并为 NT 添加一个新条目。下次您重新启动系统时,Lilo 菜单下将会有新添加的 NT 条目。当我安装 Windows 2000 而不是 Windows NT 时,也发生了同样的事情。
我个人在 BIOS 中不使用 LBA 或 LARGE 设置(但我只运行 Linux);它们是 PC 世界设计缺陷迫使使用的可怕的权宜之计。这要求内核位于前 1024 个柱面中,但这不成问题,只要您对硬盘驱动器进行分区并保持根分区较小(无论如何您都应该这样做)。
如果您的硬盘已经承载了另一个操作系统,您将无法修改 BIOS 设置,否则旧系统将不再工作。所有最新的 Lilo 发行版都能够处理 LBA 和 LARGE 磁盘设置。
请注意,/etc/lilo.conf
中的 "linear"
关键字可以帮助处理几何问题。该关键字指示 Lilo 使用线性扇区地址而不是扇区/磁头/柱面元组。到 3D 地址的转换延迟到运行时,因此使设置更能抵抗几何问题。
如果您有多个硬盘,并且其中一些仅供 Linux 使用且不参与启动过程,您可以告诉您的 BIOS 它们未安装。您的系统将启动得更快,并且 Linux 将立即自动检测所有磁盘。我经常在我的计算机中切换磁盘,但我从不触碰 BIOS 配置。
当您看到 Lilo 提示符时,您可以按 <Tab> 键来显示可能的选项列表。如果 Lilo 未配置为交互式,请在 ``LILO'' 消息出现之前按住 <Alt> 或 <Shift> 键。
如果您选择启动 Linux 内核,您可以在您选择的系统名称后添加命令行参数。内核接受许多命令行参数。所有参数都列在 Paul Gortmaker 的 ``BootPrompt-HOWTO'' 中,我不会在此处重复。但是,一些命令行参数特别重要,值得在此处描述
root=
:您可以告诉 Linux 内核将与 /lilo.conf
中显示的分区不同的分区挂载为根分区。例如,我的系统有一个很小的分区,托管着一个最小的 Linux 安装,并且在错误地破坏了我的根分区后,我仍然能够启动系统。init=
:Linux 内核的 1.3.43 及更高版本可以执行另一个命令,而不是 /sbin/init,如命令行中指定的那样。如果您在启动过程中遇到严重问题,您可以通过指定 init=/bin/sh
来访问裸系统(当您在 shell 提示符下时,您很可能需要挂载您的磁盘:尝试 ``mount -w -n -o remount /; mount -a'',并记得在关闭计算机之前 ``umount -a'')。/etc/inittab
和 /etc/rc*.d
以进一步探究。当 Lilo 覆盖引导扇区时,它会在 /boot/boot.
xxyy 中保存一个备份副本,其中 xxyy 是设备的major 和 minor 号,以十六进制表示。您可以通过运行 ``ls -l /dev//device'' 来查看您的磁盘或分区的主设备号和次设备号。例如,/dev/hda
的第一个扇区(主设备号 3,次设备号 0)将被保存在 /boot/boot.0300
中,在 /dev/fd0
上安装 Lilo 会创建 /boot/boot.0200
,而在 /dev/sdb3
上安装(主设备号 8,次设备号 19)会创建 /boot/boot.0813
。请注意,如果文件已存在,Lilo 不会创建该文件,因此当您重新安装 Lilo 时(例如,在重新编译内核之后),您无需担心备份副本。在 /boot/
中找到的备份副本始终是安装任何 Lilo 之前的状态快照。
如果您需要卸载 Lilo(例如,在您需要卸载 Linux 的不幸情况下),您只需要恢复原始引导扇区。如果 Lilo 安装在 /dev/hda
中,只需执行 ``dd if=/boot/boot.0300 of=/dev/hda bs=446 count=1'' (我个人只是执行 ``cat /boot/boot.0300 > /dev/hda'',但这并不安全,因为这也会恢复原始分区表,您可能在此期间修改了分区表)。此命令比尝试从 DOS shell 中执行 ``fdisk /mbr'' 更容易运行:它允许您从磁盘上干净地删除 Linux,而无需启动任何除 Linux 之外的东西。卸载 Lilo 后,请记住运行 Linux 的 fdisk 来销毁任何 Linux 分区(DOS 的 fdisk 无法删除非 DOS 分区)。
如果您将 Lilo 安装在您的根分区上(例如,/dev/hda2
),则无需执行任何特殊操作来卸载 Lilo。只需运行 Linux 的 fdisk 从分区表中删除 Linux 分区。您还必须将 DOS 分区标记为可引导。
注意:如果您发现下一节难以阅读,您也可以查找网页:http://surfer.nmr.mgh.harvard.edu/partition/ramdisk.html
您可以在那里找到此贡献的“原文”……
作者:Tony Harris
2000 年 10 月 16 日
ram 磁盘迷你 HOWTO
如果您的根文件系统位于内核没有内置驱动程序的设备上,您将需要在启动周期的早期使用 lilo
将该驱动程序作为模块加载。只有两个简单的步骤
lilo.conf
以指向该镜像首先,我 cd 到 /boot
System.map chain.b module-info-2.2.16-3ext3 System.map-2.2.16-3 initrd-2.2.16-3.img vmlinux-2.2.16-3 System.map-2.2.16-3ext3 vmlinux-2.2.16-3ext3 vmlinuz kernel.h boot.b map vmlinuz-2.2.16-3 bz.2.2.15.juke.Image module-info vmlinuz-2.2.16-3ext3 bzImage-2.2.14 module-info-2.2.16-3
在这里您可以看到我有一个 2.2.16-3 内核,并且我添加了第二个支持 ext3 的内核 (vmlinuz-2.2.16-3ext3
)。我的第一个内核已经有一个 ram 磁盘镜像 (initrd-2.2.16-3.img
)
为了为第二个内核制作新镜像,我输入以下内容(我输入的内容以粗体显示)
boot# mkinitrd initrd-2.2-16-3ext3.img 2.2.16-3ext3
mkinitrd
是一个 shell 脚本,它查看我的内核所需的模块,然后创建一个包含它们的 ext2 文件系统。如果我们查看镜像内部,我们会看到情况确实如此
boot# cat initrd-2.2.16-3ext3.img | gunzip > /tmp/myimage
boot# file /tmp/myimage
/tmp/myimage:Linux/i386 ext2 文件系统/
您不必查看镜像内部。只有制作镜像和修改 lilo.conf
是必要的步骤。然而,为了教学目的,提供了关于 ramdisk 镜像的讨论。
为了查看内部,我需要像挂载文件系统一样挂载该镜像
boot# mount /tmp/myimage /mnt/tmp -t ext2 -o loop=/dev/loop3
boot# ls /mnt/tmp
bin dev etc lib linuxrc
boot# find /mnt/tmp
mnt/tmp/
mnt/tmp/lib/
mnt/tmp/lib/aic7xxx.o/
mnt/tmp/bin/
mnt/tmp/bin/sh/
mnt/tmp/bin/insmod/
mnt/tmp/etc/
mnt/tmp/dev/
mnt/tmp/dev/console/
mnt/tmp/dev/null/
mnt/tmp/dev/ram/
mnt/tmp/dev/systty/
mnt/tmp/dev/tty1/
mnt/tmp/dev/tty2/
mnt/tmp/dev/tty3/
mnt/tmp/dev/tty4/
mnt/tmp/linuxrc/
这个 ram 磁盘镜像最重要的部分是 aic7xxx.o
,这是我的 scsi 模块。
最后,我继续最后一步,修改 /etc/lilo.conf
这是我在 lilo.conf
中对应于我刚刚创建的内核和镜像的条目
image=
boot/vmlinuz-2.2.16-3ext3/
label=linux.ext3
initrd=
boot/initrd-2.2.16-3ext3.img/
read-only
root=
dev/hdb3/
就是这样。以 root 身份运行 /lilo 并重新启动。
如果您遇到问题,请查看内核 HOWTO
。您需要涵盖几件事:您需要编译您的内核模块并使其位于 /etc/conf.modules
中。