LILO是在x86体系下最常用的Linux装入程序;下面我将使用Lilo代替LILO是因为我不喜欢使用大写。这篇文章描述了一些典型的关于Lilo 的安装。作为Lilo用户的使用指南。我认为例子相当有用,即使你的情况与我的不太相同。我希望这可以帮助你解决问题。由于Lilo本身的文档也是非常好的,如果有兴趣,可以/usr/doc/lilo*找到。
---------------------------------------------------
内容列表:
1、介绍
2、背景信息和普通的安装
2.1 我将Lilo装在什么地方?
2.2 我如何设置我的IDE硬盘驱动器。
2.3 如何在启动时交互操作
2.4 如果卸载Lilo
3、简单的设置
3.1 如何处理大内核
3.2 另外的信息源
4、安装hdc像hda一样引导启动,并且使用bios=
5、当BIO不能找到Root分区时,使用Lilo
6、当BIO不能访问巨大磁盘时,如何解决
7、从一张恢复软盘上启动
---------------------------------------------------
1、介绍
尽管在/usr/doc/lilo-version下找到的Lilo的文档是非常完整的,但是一些Linux用户在配置他们的/etc/lilo.conf文件时依然经历一些问题。这个文档则是通过描述5个例子来帮助他们:
第一个例子是经典的"Linux 和 其他系统"的共存安装。
第二个例子是展示了如果将Lilo安装在一个连接为/dev/hdc的硬盘驱动器上,它将作为/dev/hda启动。
这些过程通常在你安装了一个新的内核程序后都要经历。当你的BIOS足够新的情况下,它也会告诉你如果从SCSI磁盘上启动。
第三个例子告诉你如果在BIOS不能访问root分区时如何引导Linux系统。
第四个示例是用来告诉你如何访问容量巨大的磁盘,这是在BIOS和DOS都不能访问的情况下。
最后一个示例是告诉你如果恢复一个损坏的磁盘,如果是由于安装了另一个操作系统而损坏的。
2、背景信息和普通安装
当Lilo启动了系统,它使用BIOS调用从磁盘上装入Linux内核(IDE驱动器,软盘或其它一些)。这样的话,内核就必须存在于某些介质的某个地方,它可以被bios访问。
在启动时,Lilo没有能力读取文件系统的数据,以及在你写入/etc/lilo.conf文件中的任何的路径名。安装的时候,程序建立了什么扇区由什么文件使用的表,从而引导系统。所有的这些文件必须在一个分区,它可以被BIOS访问(这些文件一般情况下定位在/boot目录下,这就意味着只有你的 Linux系统的root分区需要通过BIOS来访问。)
另外的一个基于BIOS的问题就是你需要在每次修改了Lilo设置以后,重新安装装入程序(i.e.你需要调用/sbin/lilo)。当你重新编译你的内核并且覆盖你旧的映像时,你必须重装Lilo。
2.1.我将Lilo装在什么地方?
操作符boot=在/etc/lilo.conf文件中告诉Lilo在什么地方安装了它的主引导器。一般情况下,你可以指定主引导记录(/dev/hda)或你的Linux安装的root分区(通常是/dev/hda1或/dev/hda2)。
如果你有另一个操作系统安装在你的硬盘上的话,你最好将Lilo安装在root分区上而不是MBR分区上。因此,你必须将这个分区标记为 "bootable",可以使用fdisk的"a"命令和cfdisk的"b"。如果你不覆盖主引导扇区,你将发现如果必要,可以轻易地卸下Linux和 Lilo。
2.2. 如何设置我的IDE硬盘?
我个人不使用BIOS中的LBA和LARGE的设置(但是我运行Linux);在PC世界中,这是设计中的一个非常讨厌的约束。
这就要求内核存放在第一个1024柱面之中,但是在你为你的硬盘分区并且将root分区作地很小时这并不是一个问题。
如果你的硬盘已经有了另一个操作系统,请不要修改BIOS的设置,否则旧的系统将不会工作。最近的Lilo的版本都能处理LBA和LARGE的磁盘设置。
注意在/etc/lilo.conf中的"linear"关键字可以处理一些问题。这个关键字使得Lilo使用线性的扇区编址而代替扇区/磁头/柱面的寻址方式。转换成3维的地址的方式虽然延迟了运行的时间,但是却解决了这个磁盘寻址的几何问题。
如果你有不只一个硬盘,并且只用于Linux而且不参与启动过程,你可以告诉BIOS,它们没有被安装。你的系统将会较快地启动并且Linux将立刻地自动检测所有的硬盘。我经常在自己的计算机上切换硬盘,但不是通过BIOS的设置。
2.3 如何在启动时交互操作
当你看见Lilo提示符时,你可以敲击<Tab>键来查看可以选择的项目。如果Lilo没有被设置成可交互的,在"LILO"信息出现前,按下<Alt>或<Shift>键。
如果你选择启动一个Linux内核,在你可以在你选择的系统名称后加入命令行参数。内核接受许多命令行参数。所以的这些参数在“BootPrompt-HOWTO”中可以找到。一些命令行是非常重要的,所以这里不得不提一下:
root=:你可以告诉Linux内核t挂起一个不同的分区作为root分区。比如,我的系统有一个小分区,安装了一个最小化的Linux,并且我没有能力在错误地损坏了root分区之后再启动系统。
init=:1.3.43以后的Linux内核能够运行另一种命令,而代替/sbin/init,就是在命令行指定。如果你在启动时遇到了问题,你可以通过指定init=/bin/sh来访问一个裸系统(当你使用最喜欢的shell的提示符下,你需要挂起你的磁盘:"mount -w -n -o remount /: mount -a "并且记住在关机前"umount -a"。
一个数:在内核的命令行中指定一个数,你的操作将会进入一个特别的运行级别(默认值通过是3或2,根据你选择的发布版本的不同)。建议看一个init的文档。
2.4 我如何卸载Lilo?
当Lilo覆盖了一个启动扇区,它保存了一个备份在/boot/boot.xxyy,xxyy是设备的主与次的号码,是用十六进制的。你可以看一看你的磁盘或分区的主次号码:"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 状态正的"fisk/mbr",容易得多了:它允许你不需要启动除Linux以外的任何系统就可以干净地把Linux从磁盘上清楚。在删除了Lilo之后,记住需要运行Linux的fdisk来除去每一个Linux分区(dos的fdisk有时不灵)。
如果你将Lilo安装到你的root分区上(比如/dev/hda2),没有什么其它的特别需要做。只要运行Linux的fdisk来删除Linux分区。你必须将Dos分区设置成可启动的。
3、简单的设置
大多数Lilo安装过程都使用一个设置文件:
boot = /dev/hda # 或者你的root分区
delay = 10 # 启动时延迟多少时间,以秒记
vga = 0 # 可选取。使用vag=1设置成80x50
#linear # 尝试"linear",由于以上提到的磁盘寻址问题。
image = /boot/vmlinux # 你的zImage文件
root = /dev/hda1 # 你的root分区
label = Linux # 标志
read-only # 将root挂起,并只读
other = /dev/hda4 # 你的dos分区y
table = /dev/hda # 当前的分区表
label = dos # 标志
如果需要,你可以有好几个"image"和"other"的选项。有几个内核的images在lilo.conf文件中并非不正常,至少对于经常开发内核的人来讲。
3.1.如果处理大内核
如果你编译一个"zImage"内核并且它大得超过512K,你需要建立一个“大内核”来代替它,使用:make bzImage 。启动一个大的内核映像不需要指定其它特别的需要,但最好使用一个新版本的Lilo。如果你的安装过程是旧的,你必须升级你的Lilo程序包。
3.2 另外的信息源
除了Lilo的文档,这里有许多mini-howto可以帮助你。这些都就做:“Linux+foobarOS”,这些当中,都是讲一些关于其它系统与Linux共存的内容。
4、安装hdc像hda一样引导启动,并且使用bios=
Lilo允许从一个磁盘上映射内核映像文件,并指定BIOS从另一个磁盘上调用它。比如,经常在一个磁盘上安装Linux,并将其连接为hdc(第二控制器的主盘)这样将另一台计算机上的主IDE控制器作为一个独立的系统启动。我将安装软盘复制到一个小分区上,所以我可以在虚拟控制台上运行并安装hdc。这个文件可能是这样的:
# This file must be used from a system running off /dev/hdc
boot = /dev/hdc # 覆盖hdc的MBR
disk = /dev/hdc # 告之hdc是什么:
bios = 0x80 # bios将其视为快速驱动器
delay = 0
vga = 0
image = /boot/vmlinux # 这是在/dev/hdc1上
root = /dev/hda1 # 但是当启动时它就在hda1
label = Linux
read-only
这个配置文件必须通过Lilo读出的/dev/hdc1而被读取。Lilo的映像写入启动扇区(/dev/hdc)时涉及在/boot(当前安装的作为hdc)的这个文件;当这个磁盘被作为单独的系统启动时,这个文件将在hda之后被访问。
我调用这个配置文件/mnt/etc/lilo.conf.hdc(/mnt是由于hdc在安装的过程中被挂起。我通过调用"cd/mnt; chroot.sbin/lilo -C /etc/lilo.conf"安装Lilo。如果你觉得这非常神奇,请查阅chroot的手册。
在lilo.conf中的"bios="操作符被用来告诉Lilo,BIOS把你的设备认作什么。BIOS通过一个数调用定义好的软盘和硬盘:0x00和 0x01是软盘驱动器,0x80和以下这些数是硬盘控制器(旧的BIOS只能访问两个硬盘)。bios=0x80的意思是,使用BIOS中的0x80作为 /dev/hdc。
这个操作符可以非常简单地在其它情况下使用,比如,当你的BIOS从SCSI磁盘启动,而不是IDE设备。当IDE和SCSI设备共存时,Lilo不能确定是否0x80指出了其中的一个,因为用户可以在BIOS选择菜单里选择它,并且BIOS在运行Linux时不能被访问。
默认情况下,Lilo假定IDE磁盘被BIOS映射成第一个,但是这可以通过lilo.conf中指令:
disk = /dev/sda
bios = 0x80
而改变。
5、当BIO不能找到Root分区时,使用Lilo
我有两个IDE磁盘,和一个SCSI磁盘。而SCSI设备不能被BIOS看见。Linux引导器,Lilo,使用BIOS调用,只能看见BIOS可以看见的。我的BIOS只能从A: C:启动,我的root文件系统是在SCSI磁盘上的分区上的。
解决的方法需要内核,映象文件,和在第一个IDE驱动器上的Linux分区中的装入程序。注意并不一定需要将你的kernel放在你的root分区上。
在我的第一IDE上的第二个分区(/dev/hda2,Linux用来启动系统的分区)被挂起在/u2。这里是我使用的lilo.conf
# 将Lilo装在第一个IDE的MBR上
boot = /dev/hda
# /sbin/lilo (the installer) 从以下文件复制Lilo的启动记录到MBR
install = /u2/etc/lilo/boot.b
#
# 我写了一个详细的启动菜单。
message = /u2/etc/lilo/message
#Lilo将建立以下文件。它告诉启动程序哪里是内核的块。
map = /u2/etc/lilo/map
compact
prompt
# 等10秒
timeout = 100
# 内核被存放在BIOS可以看见的地方:
# cp -p /usr/src/linux/arch/i386/boot/zImage /u2/z1.2.1
image = /u2/z1.2.1
label = 1.2.1
# Lilo 告诉内核挂起第一个SCSI分区作为root。BIOS不能看见它。
root = /dev/sda1
#这个分区将被检查并且通过/etc/rc.d/rc.S被重新挂起
read-only
# 另一个内核
image = /u2/z1.0.9
label = 1.0.9
root = /dev/sda1
read-only
#DOS分区
other = /dev/hda1
loader=/u2/etc/lilo/chain.b
label = dos
alias = m
6、当BIO不能访问巨大磁盘时,如何解决
在我的办公室里的系统有一个1GB的IDE驱器。BIOS只能看见其中的504MB。(这里MB是指2**10字节,而不是10**6字节。)所以我有在一个350MB/dev/hda1 并且我的Linux的root在一个120MB的分区上/dev/hda2 的分区上有一个MS-DOS。
当驱动器被刷新后,MS-DOS不能被正常安装了。Novell DOS 7也有这个问题。
所以我使用Linux的fdisk做个分区表。MSDOS-6.2拒绝将其自己安装到/dev/hda1下。它可能会显示出:
“this release of MS-DOS is for new installations.
Your computer already has MS-DOS so you need to get an upgrade release from your dealer.”
所以我再一次运行Linux的fdisk并且将分区1从表中删除。这样就保证了MS-DOS 6.2可以精确地建立相同于刚才我已经删除的分区1,并且正常安装。MS-DOS 6.2在这个驱动器的写上了MBR,但它不能启动。
所幸我有一张有Slackware内核的软盘(由Slackware的安装程序做的),所以我启动了Linux并且由Lilo覆盖了MS-DOS的MBR。这个工作,这是我使用的lilo.conf文件。
boot = /dev/hda
map = /lilo-map
delay = 100
ramdisk = 0 # 在Slackware内核中关闭内存盘。
timeout = 100
prompt
disk = /dev/hda # BIOS只能看见500MB
bios = 0x80 # 指定第一个IDE
sectors = 63 # 你的扇区数(从你的磁盘说明书上找)
heads = 16
cylinders = 2100
image = /vmlinuz
append = "hd=2100,16,63"
root = /dev/hda2
label = linux
read-only
vga = extended
other = /dev/hda1
label = msdos
table = /dev/hda
loader = /boot/chain.b
在我安装了这些系统之后,我检查到这些分区包括zImage,boot.b,map,chain.b并且信息文件在没有"stackered或 doublespaced.”时,可以使用msdos文件系统,所以我可以作一个在/dev/hda1上的500MB的DOS分区。
7、从一张恢复软盘上启动
接下来,我在办公室的机器上安装Windows-95。它也损坏了我的Lilo MBR,但是它将我的Linux分区分开了。从软盘上引导内核花费了很长时间,所以我使一个可工作的Lilo安放在软盘上,它可以从IDE上启动我的内核。我使用这个lilo软盘:
fdformat /dev/fd0H1440 # lay tracks on virgin diskette
mkfs -t minix /dev/fd0 1440 # make file system of type minix
mount /dev/fd0 /mnt # mount in the standard tmp mount point
cp -p /boot/chain.b /mnt # copy the chain loader over
lilo -C /etc/lilo.flop # install Lilo and the map on the diskette.
umount /mnt
注意,当你运行这个安装过程时,软盘必须被挂起,所以Lilo可能写入它的map文件。这个文件是/etc/lilo.flop:
# Makes a floppy that can boot kernels from HD.
boot = /dev/fd0
map = /mnt/lilo-map
delay = 100
ramdisk = 0
timeout = 100
prompt
disk = /dev/hda # 1 GB 的硬盘, BIOS只能见到500 MB.
bios=0x80
sectors = 63
heads = 16
cylinders = 2100
image = /vmlinuz
append = "hd=2100,16,63"
root = /dev/hda2
label = linux
read-only
vga = extended
other = /dev/hda1
label = msdos
table = /dev/hda
loader = /mnt/chain.b
需要在办公室的机器上安装msdos 6.2,但我不想碰第一个驱动器。我加入了一个SCSI控制器和驱动器,使用Linux的mkdosfs加入一个msdos的文件系统,并且win95将其作为D:。当然msdos不能从D:启动。当然如果你有Lilo这不是一个问题。我将以下内容加入lilo.conf:
other = /dev/sda1
label = d6.2
table = /dev/sda
loader = /boot/any_d.b
通过这个修改,msdos 6.2可以运行了,但是它把它认为在C:并且windows-95认为在D: