linuxchina 发表于 2002-12-12 17:18:42

REDHAT System Rescue 系统改错之一:LILO分析

当LILO启动完成时,会在屏幕上显示字符串“LILO”,其实这其中的每个字母背后都对 应着特定的操作。如果LILO在某个部分出了错,我们就可以根据屏幕上当前出现的字母推断
出故障原因。 

  LILO启动分为两个步骤,由第一个步骤将第二个步骤的代码调入内存。 

  如果启动LILO时,磁盘出现瞬间的错误,则在“L”字母后会输出一串二进制数字。此时
如不终止LILO运行,屏幕上会出现无穷的错误代码输出,这种情况可以重新启动LILO试试。
 

  屏幕上什么都没出现:LILO并未被装载。原因可能是LILO还未被安装或者LILO所在的 分
区未被设为active状态。 

  L :LILO启动了到第一步,但在将第二部分调入内存时出现了错误。两位错误代
码指出了错误类型面,具体内容见后面所附的磁盘错误代码。 

  LI:LILO引导程序的第一部分能够将LILO引导装入程序的第二部分装入,但却不能执行
。这可能是因为硬盘参数设置不当或者是因为在移动/boot/boot.b时没有运行map 安装程序
。 

  LIL:引导程序的第二部分已经工作,但它无法从map文件中装载描述符表,原因可能是
介质故障或硬盘参数设置不当。 

  LIL?:第二部分引导程序装入地址不正确,原因是硬盘参数设置不当或移到boot.b文件
后未运行map installer。 

  LIL-:描述符表损坏。原因同上。 

  LILO:LILO的各个部分均已成功装入。 

  1010101010 :分区情况已经改变却没有重新安装LILO。 

  附:磁盘错误代码。 

  0x00:"内部错误"。LILO由扇区读子程序产生,可能是因为被破坏的文件,重建map文件
试试看。另一个原因也许是,当使用linear参数时去访问超出1024的柱面。 

  0x01:"非法命令"。一般不会发生这种问题,如果确实出现了,那就表示LILO访问BIOS
不支持的硬盘。在机器间换硬盘的时候最有可能出现这种情况,所以一定要先在BIOS里把硬
盘参数设好。 

  0x02:"没找到地址标记"。通常由硬盘介质故障问题引起,多试几遍看看。 

  0x03:"写保护错"。仅在写操作时出现。 

  0x04:"扇区未找到"。最典型的原因是硬盘参数设置不正确。 

  0x06:"激活顺序改变"。这应该是瞬间的错误,再试一次,问题有可能就解决了。 

  0x07:"无效的初始化"。BIOS没有适当地初始化硬盘,如果在BIOS里设置的硬盘参数为
auto时可能会产生这种故障,建议在BIOS里将硬盘参数设置为固定的,或热启动一次试试。
 

  0x08:"DMA超出限度"。可以重新启动试试。 

  0x09:"DMA试图越过64k边界"。建议忽略COMPACT参数。 

  0x0C:"无效的介质"。小概率事件,重新启动看看。 

  0x10:"CRC错误"。检测到硬盘介质故障,建议多启动几次或运行map安装程序把map文件
从坏块写到正常的介质上。 

  0x11:"ECC校正成功"。读错误发生然后被校正了,但是LILO并不知道这个情况,终止了
启动过程。 

  0x20:"控制器错误"。可能由IDE控制器故障引起。 

  ox40:"定位失败"。这可能是介质问题,重新启动试试。 

  0x80:"磁盘超时"。磁盘或驱动器没有准备好。 

  0xBB:"BIOS错误"。由BIOS参数引起,发生概率极小,如果反复发生,则考虑移去COMP

备份和修复Linux LILO指南
作者: Jephe Wu (2002-01-08 08:10:00)
一. 本文目的

本文旨在如何给工作的系统做LILO和内核的软盘备份,因为大多数Linux服务器使用
LILO进行引导,同时也给出紧急修复办法。

二. 测试环境

Redhat Linux ,IDE和SCSI启动硬盘。

三. 备份措施

当我们设置完新的服务器后,除了常规的服务器重要配置文件和系统备份之外,最好
也要做LILO和内核的软盘备份,万一由于某种原因导致LILO不能引导系统。

1. 第一种方法

适用范围: 自己编译的内核,所有的支持模块已经编译进内核,如果有SCSI硬盘,必
须编译进SCSI支持进内 核,也就是说内核已经包含了所有引导需要的东西。

步骤:

格式化一张空白软盘,不要生成文件系统,直接写内核到软盘,然后改变内核文件中
的根文件系统分区定义

fdformat /dev/fd0h1440
  dd if=/boot/vmlinuz of=/dev/fd0 (用你自己的内核文件名替代vmlinuz)

rdev /dev/fd0 /dev/sda3 (用你的根分区设备名称替代/dev/sda3)
  rdev -R /dev/fd0 1 (安装根文件系统成只读模式)

作用: 这样当系统LILO失败时,可用该软盘引导系统且安装硬盘根文件系统。

2. 第二种方法

适用范围: 内核需要一系列模块帮助引导,如SCSI硬盘驱动程序,则需要用下面的方
法生成带LILO的引导软盘

步骤: 放一张新的软盘,不要格式化和分区,直接用mkbootdisk创建引导盘

mkbootdisk --device /dev/fd0 2.2.12-20 (用你的内核版本代替2.2.12-20,可用
uname -a查看)

3. 第三种方法

适用范围: mkbootdisk命令不可用,或者无论什么理由你想手动创建一张带LILO的
引导软盘。

步骤:

fdformat /dev/fd0h1440 (低级格式化软盘)
  /sbin/mkfs.minix /dev/fd0 1440 (在软盘上创建minix文件系统)
  /bin/mount /dev/fd0 /mnt/floppy (安装软盘到/mnt/floppy目录)
  cd /mnt/floppy
  mkdir boot etc dev
  cp -a /boot/vmlinuz /boot/initrd.img /boot/boot.b boot/
  注:用你的内核文件名代替vmlinuz 用你的initrd映像文件名代替initrd.img
  cp -a /dev/fd0 /dev/null /dev/zero /dev/hd* /dev/sd* dev/
  注: 如果你没有SCSI设备,可不用拷贝/dev/sd*
  创建/mnt/floppy/etc/lilo.conf如下
  boot=/dev/fd0
  read-only
  prompt
  image = /boot/vmlinuz
  initrd=/boot/initrd.img
  root = /dev/sda1 # 把/dev/sda1换成你的根文件系统设备名称
  label = linux

最后运行 lilo -r /mnt/floppy 在软盘上安装LILO (将自动生成/boot/map文件包括内
核的物理映像位置) 。

4. 剖析initrd.img

如果你是用SCSI硬盘启动,内核必须能装入SCSI驱动程序才能转入你的硬盘根文件系统
引导系统。

如果你的内核没有编译进SCSI驱动程序,则需要用mkinitrd创建RAM驱动映像想知道你的
initrd.img中包含了哪些驱动程序吗?

cat initrd.img | gunzip > /tmp/myinitrdfs
  mkdir /mnt/tmp
  mount -o loop -t ext2 /tmp/myinitrdfs /mnt/tmp

然后查看/mnt/tmp中的文件linuxrc中的内容即可知道启动时会装入哪些驱动程序。你
也可以更改其中的内容,假设我们想加另一种SCSI驱动aic7xxx.o进入你的initrd.img

cd /mnt/tmp
  vi linuxrc 加上一行 insmod /lib/aic7xxx.o
  cp /lib/modules/`uname -r`/scsi/aic7xxx.o lib/
  cd /
  umount /mnt/tmp
  dd if=/tmp/myinitrdfs | gzip > /boot/initrd2.img

至此,新的initrd文件initrd2.img就包含了aic7xxx的驱动程序了。

四. 紧急修复

许多情况能导致LILO引导失败,象升级内核,忘记运行lilo更新MBR,克隆硬盘,缺少
SCSI驱动程序引导根文件系统等等,当我们遇到这些情况而手边又没有备份的引导软盘
时,你仍然有许多其它途径去修复。

1. 查看周围有没有类似的其它机器和系统在运行,如另一台服务器上有相同版本或同系
列的内核在运行。则在另一台系统上生成引导软盘(带LILO或者不带LILO),如果需要添
加initrd.img中的SCSI驱动文件。

2. 用CDROM安装盘启动,CDROM会载入SCSI驱动,到分区界面时用ALT+F2转入字符界面,
可mount硬盘根分区,运行lilo 和做相关的修复。

3. 下载包含boot/root文件系统在一张软盘上的文件,如www.toms.net/rb/ 可完全从一
张软盘启动系统,完全不需要硬盘,然后再安装硬盘,修复系统(例如万一你的/etc/fstab
中的根文件分区指定错误 ,可用此方法修复)。

4. 最后如果都不可行,你可以下载与你的服务器相同版本或者同系列中最新版本的内核,
在另一台机器上编 译需要的SCSI和网卡等相关驱动程序直接进入内核,不需要任何模块,
然后用本文的方法拷贝至软盘,去引导系统。


实例讲解 LILO 的配置和使用
作者: 徐永久([email protected]) (2001-08-27 09:00:00)
Linux 加载程序或者说 LILO 是引导Linux 操作系统最常用的程序,本文将以实例详细叙述Lilo 的配置。
如果你第一次安装Linux ,那么可能就需要用到双重启动。
LILO(LInux LOader)就是实现这种功能的最简单但是最
具有伸缩性的程序。

计算机启动时,BIOS 会执行位于硬盘主引导记录(MBR)
或者软盘上的一段引导程序,这段程序的作用就是定位并
加载操作系统。如果是引导Linux 的话,引导程序会把Linux 内核调入内存。LILO 就是干这种活儿的程序。

首先遇到LILO,估计应该在你安装Linux 的时候,你会被要求选择LILO 的安装处,是MBR 还是Linux 的根分区。
如果你有其他的启动管理程序例如Boot Magic 或者 System Commander 等,并且想使用他们,那么你应该把LILO
安装到Linux 的根分区。如果你选择使用LILO 作为启动管理程序,就可以选择MBR。如果你想在启动时传递参数给
内核,也应该使用MBR。

使用LILO 作为启动程序后,机器启动后就会有LILO:的提示符,按下 TAB 键,可以看到可以选择的操作系统列表。
输入其中的操作系统标签名就可以启动到对应的操作系统,或者直接输入回车启动到缺省的操作系统。

我们来看一个LILO 启动的配置文件(/etc/lilo.conf)实例:

boot = /dev/hda
vga = normal
read-only
prompt
default = dos
timeout = 30
append="hdc=ide-scsi"

image = /boot/vmlinuz
label = linux
root = /dev/hda2
initrd = /boot/initrd

第一个选项是 boot ,定义了LILO 的安装位置,
'/dev/hda' 就是把LILO 安装到 MBR,所以你如果要把
LILO 作为启动管理程序,就必须这样写哦!反之,你要把他定位到具体的Linux 根分区例如 /dev/hda3。

vga 是一个显示启动菜单的配置选项,可以有:

'normal' (80x25 文本模式),
'extended' (80x50 文本模式)
以及 'ask' (提示你选择文本模式)。

采用read-only 选项时,系统会把根分区挂接为只读方式,
推荐采用这个选项,因为 fsck 程序要求文件系统只读。
但不用担心你的根分区会不能写入了,相反,系统一旦
启动就会把根分区挂接为读写方式。

prompt 是一个必须放入的选项,否则就没有LILO 的提示符了。但是按住 shift 键可以看到提示。

default 指定缺省的引导映像,如果没有指定,那么第一个
定义的映像就成为缺省值。

timeout 是提示显示的时间,单位是 0.1 秒。

append 是一个十分有用的选项,他允许你把额外的参数传递给内核,例子中的 /dev/hdc 是一个可擦写CD驱动器,
传递的参数就是用来让内核认识这个驱动器,另外这个选项在个别不认识内存的机器上十分有用。需要注意的是,
你需要使用双引号来引入想要传递的参数,不要使用单引号。

LILO 也可以让你手工在LILO 提示符下传递这些参数。例如:

LILO: linux single

就是告诉Linux 启动Linux 进入单用户模式。在引导区损坏时,可以从软盘启动,然后指定硬盘的根来修复硬盘引
导扇区。

LILO: linux root=/dev/hda3

image 指定需要启动的内核映像。每个映像还包括一个 label 选项定义启动时你需要输入的标签。

还可以为某一个 image 指定口令:

password='password'

添加 restricted 选项后,系统就会在你传递额外的参数时提示口令。这就防止有人采用“linux single” 来直接
引导到提示符,而不需要验证系统口令。这在采用主机托管的服务器上十分有用,如果碰到别有用心的主机托管机房
的管理人员时,这一招还是管用的。

LILO 引导其他类型的操作系统和引导Linux 一样配置,但是更加简单:

other = /dev/hda3
label = dos
table = /dev/hda

other 指明操作系统所在的分区,同样的和Linux 下的image 一样也需要给定一个标签(label),table 选项指向
包含分区表的设备,这个选项必不可少,因为LILO 会从这个这个分区表寻找对应的分区信息,然后把他传递给
要启动的操作系统。

对lilo.conf 的任何改变都要求重新运行 /sbin/lilo ,保证最新的改变能写入分区。
另外,如果你升级内核或者重构了 initrd 映像,也需要重新运行 /sbin/lilo。

运行/sbin/lilo 后,可以看到如下信息:

Added linux *
Added suse
Added windows

表示各种映像已经写入分区,带有 * 的分区是目前的缺省引导分区。
可以用 -D 参数改变缺省引导分区:

/sbin/lilo -D windows

Added linux
Added suse
Added windows *

可以看到缺省分区已经成为 windows了。

深入解剖 LILO 作者: 徐永久
前面的文章我们讲述了 LILO 的配置,本文我们将深入底层来讲述LILO 的技术细节,也将告诉读者怎样
去掉LILO 以及重新安装LILO。
前文我们讲述了LILO 配置的灵活性,本文我们将讲述LILO 的内部技术细节以及启动时的主要操作及其功
能,以帮助我们调整LILO 的安装。LILO 最大的好处就是它独立于文件系统,可以启动各种操作系统:
从Microsoft、OS/2、SCO Unix、Unixware、PC-DOS到Linux等等。

LILO 能处理最多16个不同的映像,LILO 写入MBR 时就作为主引导程序,写入扩展分区的引导扇区时就是
第二引导程序。采用LILO,可以有多种组合方式启动系统。

我们先来看看引导过程,硬盘上的数据被准确的分配到对应的“磁道”和“扇区”,硬盘上的数据分布首
先是引导扇区,然后是文件分配表(FAT),接下来就是数据区。

硬盘分区时,被分为基本分区和扩展分区。基本分区可以作为引导分区,可以通过任何引导程序标记为可
引导。扩展分区可以分成好几个逻辑分区,很多的BIOS 不允许从逻辑分区启动。

Linux 最多支持4个基本分区,如果需要额外的分区,那么就要其中的一个基本分区变成扩展分区,然后在
扩展分区里面,划分逻辑分区。很重要的一点是有些逻辑分区的分区表不能被识别为设备的第一块。分区
表通常存放于分区的引导扇区,而且,通常只有整个盘的分区启动扇区用作引导扇区,称为主引导记录(MBR)。

LILO 可以用于以下情形:

1、第一硬盘的引导扇区。
2、软盘的引导扇区。
3、位于第一硬盘的Linux 文件系统分区上的引导扇区。

LILO 不能用于以下情形:

1、交换分区。
2、扩展分区中的逻辑分区的引导扇区。

所以,如果你在第二硬盘上安装了Linux ,而不能启动的话,可以采取在第一硬盘上建立 /boot 的办法来解决。

引导加载过程由很多程序组成,我们先来看看LILO 安装
时的各种不同程序:

MAP 安装程序:这个程序把LILO 的文件放到合适的位置
并记录这些信息(会在LILO 启动时用到),这个程序就是
/sbin/lilo ,每次配置文件有改动或者有新内核时,需要重新运行一遍。

/boot/*.*:其他LILO 启动时需要的文件存放在 /boot 目录下,map 文件是十分重要的,map 安装程序把新内
核的位置记录到这个文件。

引导加载程序:这个程序无需多言是最重要的部件了。它被
BIOS 调入内存,然后调用内核或者其他操作系统的引导扇区。

包含引导加载程序第一部分的引导扇区被调入内存,然后调用引导加载程序的第二部分,一般位于文件
/boot/boot.b,接下来就启动内核。

如果从可引导软盘启动的话,BIOS 把软盘的第一个扇区调入内存,一般,这个扇区包含一段程序来启动对应的
操作系统。和软盘一样,如果LILO 写入MBR ,那么,MBR 就被调入内存,执行对应的操作,给用户提示选择需
要引导的操作系统。具体地说,MBR 的头 446 个字节由引导加载程序利用,剩余的64 字节是分区表信息。还剩
下的两个字节就是分区激活标志“55 AA” 了。

在软盘上备份 MBR 信息:

bash# dd if=/dev/hda of=/dev/fd0 bs=512 count=1

恢复:(万一的情况下)

bash# dd if=/dev/fd0 of=/dev/hda bs=446 count=1

删除 LILO:

c:> fdisk /mbr

恢复 LILO:

重新安装 Windows 以后,就会把LILO 干掉。无论什么原因
我们都应该知道怎样恢复LILO。

最好手头有一张安装 CD ,这年头,干净并且确实好用的
软盘太少了。所以不推荐你使用软盘。当然,如果你认为
你的软盘质量可靠,那么可以从CD-ROM
上建立应急启动盘:

dd if=/cdrom/disks/rescue of=/dev/fd0

在 DOS 下面,采用:

rawrite image-name a:

也可以在 www.bootdisk.com上下载一个,按照说明制作一张启动磁盘。

如果从 CD 启动的话,各个不同的Linux 版本有不同的方法进入应急状态。Red Hat 启动后有一个应急模式,
SuSE 的话,需要先进入安装界面,然后按Ctrl+Alt+Fn 键找到shell 提示符,可以在这个提示符下来恢复。

下面介绍恢复步骤:

首先建立挂接点:
mkdir mount

然后把丢失的 Linux 挂接到这里:
mount /dev/hda6 mount

如果 /boot 位于另外的分区,
需要把他挂接到 mount/boot 目录下,例如:
mount /dev/hda1 mount/boot

使用 chroot 命令,把 mount 作为根目录,cd /boot
命令实际上进入的是 "mount/boot" 目录:

chroot mount

运行 /sbin/lilo ,这样就把 LILO 安装回了 MBR,重新启动就会看到 LILO 提示符回来了。

easypp 发表于 2002-12-18 16:44:59

非常不错。理论加实践!强……
呵呵……
页: [1]
查看完整版本: REDHAT System Rescue 系统改错之一:LILO分析