zhy2111314 发表于 2005-4-4 23:04:40

针对硬盘安装系统而写的系统引导过程硬盘结构和错误解决办法

首先发现大家在用硬盘安装linux时(无论通过网络或者下载安装文件),经常出现硬盘分区表错误,轻的把分区表搞坏,重的硬盘搞坏,而且到头来根本不知道是哪里出了问题,所以我通过书本动手写了下面的系统引导过程及硬盘结构,并且附上根据我的经验在出现错误时的补救方法,希望能有所帮助

系统引导过程简介

系统引导过程主要由以下几个步骤组成(以硬盘启动为例)
(1) 开机;
(2) BIOS加电自检(POST---Power On Self Test),内存地址为0fff:0000;
(3) 将硬盘第一个扇区(0头0道1扇区,也就是Boot Sector)读入内存地址0000:7c00处;
(4) 检查(WORD)0000:7dfe是否等于0xaa55.若不等于则转去尝试其他介质;如果没有其他启动介质,则显示 ”No ROM BASIC” ,然后死机;
(5) 跳转到0000:7c00处执行MBR中的程序;
(6) MBR先将自己复制到0000:0600处,然后继续执行;
(7) 在主分区表中搜索标志为活动的分区.如果发现没有活动分区或者不止一个活动分区,则停止;
(8) 将活动分区的第一个扇区读入内存地址0000:7c00处;
(9) 检查(WORD)0000:7dfe是否等于0xaa55,若不等于则显示 “Missing Operating System”,然后停止,或尝试软盘启动;
(10) 跳转到0000:7c00处继续执行特定系统的启动程序;
(11) 启动系统.
以上步骤中(2),(3),(4),(5)步由BIOS的引导程序完成;(6),(7),(8),(9),(10)步由MBR中的引导程序完成.
一般多系统引导程序(如Smart Boot Manager, BootStar, PQBoot等)都是将标准主引导记录替换成自己的引导程序,在运行系统启动程序之前让用户选择想要启动的分区.而某些系统自带的多系统引导程序(如LILO,NT Loader等)则可以将自己的引导程序放在系统所处分区的第一个扇区中,在Linux中即为两个扇区的SuperBlock.
注:以上步骤中使用的是标准的MBR,多系统引导程序的引导过程与此不同.


硬盘结构
硬盘参数
3D参数(Disk Geometry):CHS(Cylinder/Head/Sector) C-Cylinder柱面数表示硬盘每面盘片上有几条磁道,最大为1024(用10个二进制位存储);H-Head磁头数表示硬盘总共有几个磁头,也就是几面盘片,最大为256(用8个二进制位存储);S-Sector扇区数表示每条磁道上有几个扇区,最大为63(用6个二进制位存储).

引导扇区
Boot Sector组成
Boot Sector也就是硬盘的第一个扇区,它由MBR(Master Boot Record), DPT(Disk Partition Table) 和 Boot Record ID三部分组成. MBR又称为主引导记录,占用Boot Sector的前446个字节(0~0x1BD),存放系统主引导程序(它负责从活动分区中装载并且运行系统引导程序). DPT即主分区表占用64个字节(0x1BE~0x1FD),记录磁盘的基本分区信息.主分区表分为四个分区项,每项16个字节,分别记录每个主分区的信息(因此最多可以有四个主分区). Boot Record ID即引导区标记占用两个字节(0x1FE~0x1FF),对于合法引导区,它等于0xaa55,这是判别引导区是否合法的标志). Boot Secor具体结构如图一
分区表结构简介
分区表由四个分区项构成,每一项结构如下:
BYTE State:分区状态,0=未激活,0x80=激活(注意此项);
BYTE StartHead:分区起始磁头号;
WORD StartSC:分区起始扇区和柱面号,底字节的底6位为扇区号,高2位为柱面号的第9,10位,高字节为柱面号的低8位;
BYTE Type:分区类型,如0x0B=FAT32,0x83=Linux等,00表示此项未用;
BYTE EndHead:分区结束磁头号;
WORD EndSC:分区结束扇区和柱面号,定义同前;
DWORD Relative:在线性寻址方式下的分区相对扇区地址(对于基本分区即为绝对地址);
DWORD Sectors:分区大小(总扇区数).
在DOS或Windows系统下,基本分区必须以柱面为单位划分(Sectors*Heads个扇区),如对于CHS为764/256/63的硬盘,分区的最小尺寸为256*63*512/1048576=7.875MB.
由于硬盘的第一个扇区已经被引导扇区占用,所以一般来说,硬盘的第一个磁道(0头0道)的其余62个扇区是不会被分区占用的.某些分区软件甚至将第一个柱面全部空出来.

扩展分区结构如图二

zhy2111314 发表于 2005-4-4 23:05:31

首先在硬盘分区时一定要注意,要搞清楚主分区,扩展分区和逻辑分区之间的关系以及位置,这个分区可以用fdisk或者diskman(diskgen),后面这两个可以修改分区表等,相对来说功能比较全,安全性比较好,如果实在方便期间可以进入windows安装pqmagic分区魔术师,只要你操作正确这个也很安全(我就一直用这个给自己和别人搞分区:)). 一般说来,如果事先装了windows,那么windows的c盘就是hda1,windows剩下的盘(d,e,f...)构成扩展分区总称为hda2,而其中的d,e,f...分别都是逻辑分区,一般分别为hda5,hda6,hda7...,至于为什么,原因在上面都说清楚了,而你要安装的linux分区和swap最好分在hda3,hda4(或者其他的主分区也可以)上,因此要注意不要分在扩展分区,这在pqmagic中可以看的很清楚!!

分好区后就可以安装了,如果在安装的过程中出现错误而导致安装失败,这个时候千万不要着急,首先找到安装windows的光盘进入修复控制台输入下面两个命令:
fixmbr
fixboot c:
重启,看可不可以启动windows,如果不可以,进入dos,输入
fdisk /mbr
再重启,看可以启动windows吗,如果仍然不行,重复一下上面用windows光盘的方法,如果这样后仍然无效,可以用diskman或者diskgen再修复试试,这些方法如果都不行,那就确保c盘没有重要文件后重装windows吧,如果你实在不想重装windows那就再试试linux的安装,如果此时linux安装成功,那么一切问题都解决了,windows也恢复正常:)

另外,如果再双系统中windows你重装了,那么也要修复一下linux,我知道的方法就是用安装光盘重装grub,
进入linux rescue模式后,输入
chroot /mnt/sysimage #改变你的根目录
grub-install /dev/hda #安装grub到mbr

月下刀客 发表于 2005-4-4 23:15:24

总体不错,兄弟辛苦。但好象有些内容有些出入,如:

而你要安装的linux分区和swap一定要分在hda3,hda4上,因此要注意不要分在扩展分区,这在pqmagic中可以看的很清楚!!


这是啥意思呀?那里看到的有这种限制啊

:roll:

zhy2111314 发表于 2005-4-4 23:23:21

总体不错,兄弟辛苦。但好象有些内容有些出入,如:

而你要安装的linux分区和swap一定要分在hda3,hda4上,因此要注意不要分在扩展分区,这在pqmagic中可以看的很清楚!!


这是啥意思呀?那里看到的有这种限制啊

:roll:

说的是有些绝对,但是我觉得这样比较安全,不容易搞坏分区表,当然了装在逻辑分区里也是可以的,但是那样感觉不太好,也容易出问题,这样说行吗? :P

月下刀客 发表于 2005-4-4 23:34:34

建议对文章再稍作梳理,有时间再加入装入mbr的grub、lilo后的启动过程简析如何?

然后帮你加精 :-D

zhy2111314 发表于 2005-4-4 23:43:07

建议对文章再稍作梳理,有时间再加入装入mbr的grub、lilo后的启动过程简析如何?

然后帮你加精 :-D
ok,不过要等明天了,今天太晚了,要回去了:(

jetair 发表于 2005-4-5 08:27:17

总体不错,兄弟辛苦。但好象有些内容有些出入,如:

而你要安装的linux分区和swap一定要分在hda3,hda4上,因此要注意不要分在扩展分区,这在pqmagic中可以看的很清楚!!


这是啥意思呀?那里看到的有这种限制啊

:roll:

说的是有些绝对,但是我觉得这样比较安全,不容易搞坏分区表,当然了装在逻辑分区里也是可以的,但是那样感觉不太好,也容易出问题,这样说行吗? :P
  应该说如果windoz占用第一块IDE PATA硬盘的前两个主分区,那么linux和swap分区可以分在hda3,hda4上。
   例外情况还有很多:如果只安装linux在第一块硬盘,就是hda1,hda2.....;如果安装在第二块硬盘,则是hdb1,hdb2....;如果是IDE SATA硬盘,应该是sda1,sda2.....;如果是sata raid0,则是md0,md1......等等。
  比如我的Fedora就分在hda2,hda3上(因为windows就一个主分区)

zhy2111314 发表于 2005-4-5 09:17:53

呵呵。没考虑那么多,明白意思就行了,主要是引导分区的问题搞清楚,多谢jetair兄补充:)

zhy2111314 发表于 2005-4-5 09:39:18

[补充]
1.lilo(LInux LOader)引导过程
LILO引导扇区包括一个分区表的空间,所以,LILO即可以安装在MBR中,也可以安
装在某个分区的引导扇区。LILO拥有DOS引导扇区的所有功能,而且,它还可以引导
                  逻辑扇区和第二硬盘分区。LILO还可以和另外的引导者合作(例如:NT loader),这样,
                  用户就可以有很多选择。
                  (注:以下几个标题,为防止引起歧义,用原文)
                  1.1 LILO started by MS-DOS MBR
                  如果系统至少有一个linux主分区,(非交换区,且在第一硬盘上),那么LILO就可
                  以安装在这些分区中的一个。当 LILO对应分区被激活后,引导过程如下:
                      BIOS 读入 MBR
                  MBR读入 活跃主分区:LILO所在的分区。
                  LILO 引导Linux或另外的操作系统。
                  要引导其它OS且不用LILO很简单,激活那个分区。Linux分区没有任何变化,非常安全。
                  
                  1.2 LILO started by a boot manager
                  假如用户不想删除老的boot manager,或者某个OS LILO不能引导,可以考虑该途径。
                  1. 假如boot manager可以引导扩展区,那儿是LILO的好去处。
                  2. 假如 boot manager 可以引导第二硬盘分区,linux可以装在第二硬盘上。
                  3 有些 boot manager 甚至可以引导逻辑分区,那LILO就可以装在逻辑分区上。
                  当然,也要注意以下情况:
                  1 某些操作系统直接改写MBR,这会将原来的boot manager破坏。
                  2 重新分区会破坏扩展分区的引导扇区,这时LILO可能要重装。
                      当安装新的系统时,是否要重新安装(linux)依靠新的boot manager,要么LILO引
                  导扇区被注销,要么boot manager 为它提供一个引导项。重新分区或分区格式化会将
                  LILO和linux全部删除。
                  
                  1.3 LILO占据MBR
                  假如整个linux系统都在第二硬盘上,且第一硬盘没有扩展分区,那么,LILO只有装
                  在MBR上。这样,会将老的MBR冲去,所以,在安装LILO前,要将老的MBR(包括分区
                  表)做一个备份。DOS下有很多工具可以完成这个任务。在linux下,这样备份:
                  
                            # dd if=/dev/hda of=/backup/MBR bs=512 count=1
                  
                  写会使用命令:
                      # dd if=/backup/MBR of=/dev/hda bs=446 count=1
                  这样,原来的MBR就被写会但不包括分区表。如果分区表也要恢复,那么bs=512.
                  注意,这样,新的分区表会被破坏!
                  
                  1.4 LILO 文件
                      与LILO有关的文件通常放在/boot/下,配置文件lilo.conf在/etc/下。包含实际
                  引导系统信息的映射文件有/sbin/lilo安装。对于任何LILO安装,配置文件应该被定
                  置以适合个人需要。
                  The configuration file:配置文件
                      基本上,配置文件是一些变量赋值。每一行包含一个标志变量或一个变量赋值.
                  配置文件被特殊的变量赋值分成几个区,每个区引导一个linux或其它OS.
                      下面解释常见的行:
                  
                  boot = device
                  说明那一个设备或哪一个分区包含引导扇区。假如没有给boot赋值,取当前缺省值。
                  
                  compact
                  激活一种模式,在此模式下,LILO一次向BIOS请求读入相邻的几个分区。这极大的
                  缩短了装载时间,特别是从软盘启动。
                  
                  delay=tenths
                  以10秒为单位,规定LILO在引导第一个引导配置前应等待用户的时间。若没有定义,则
                  直接引导。
                  
                  Linear
                  使LILO生成线性地址,而不使用通常的Sector/Head/Cylinder机制。Linux地址机制
                  可以不依赖磁盘的物理结构。
                  
                  install = boot sector
                      使用指定的boot sector写入引导扇区,缺省用/boot/boot.b
                  
                  disktab=disktab
                      使用指定的disktab,缺省使用/boot/disktab.disktab保存了硬盘物理结构信息。
                  
                  map=map file
                  说明映射文件的路径。
                  
                  message=file 指
                  定一个文件,该文件的内容将会在LILO引导是被显示。假如没有说明该文件,那么就
                  只会出现"LILO"。
                  
                  verbose=level
                      说明LILO的调试级别。从0(不显示任何信息)到5(所有的状态信息)。
                  
                  backup = backup file
                      以前引导扇区内容的备份文件。缺省使用/boot/boot.device number
                  
                  force-backup=backup file
                   和backup 相同,当时假如备份文件存在,被覆盖。
                  
                  prompt
                      指定要用户通过键盘选择要引导的内核。不会缺省选择。
                  
                  timeout=tenths
                  设置一个超时值,在此时间内必须有键盘输入,否则用第一个配置。类似,假如超
                  时,就不能再输入密码。一般情况下,该取缺省值,无穷大。
                      注:delay 与 timeout的区别(joe 认为),delay 是"LILO"出现后用户必须有
                        输入的最长时间。timeout 是用户在按了任意键后,系统等待选择,用户
                        两次击键的最大间隔时间。
                  
                  serial=port,    bps parity bits
                      设置串口参数。如果LILO会从该文件获取串口参数的话。如果其中之一无效,
                  那所有三个参数都无效。Port从四个标准串口选择一个:0对应COM1 或者
                  /dev/ttyS0.。支持的波特率范围为:100-9600。所有校验设置都支持
                  (n:none,e:even,o:odd)
                  bits为7或者8。缺省为serial=0,2400n8.
                  
                  Ignore-table
                      让LILO忽略被破坏的分区表。
                  
                  fix-table
                      允许LILO将每个分区的(sector/head/cylinder)地址转化为线性地址。通常,
                  分区地址从cylinder boudary开始。某些操作系统,会改变这一点。由于LILO只能
                  将它的启动扇区写于两种地址都一致的分区上,不正确的3D地址可以用fix-table
                  来纠正。但是,这种纠正不能被保证是永远的,所以重分区以保证对齐cylinder
                  boudary 是最好的选择。
                  
                  password=password
                      为引导配置设置password
                  
                  restricted
                      放松对password的限制。只有用户想传附加的启动参数给内核时才需要password
                  
                  optional
                      允许配置的几个内核有错误的,或者不存在,如果不说明optional,LILO遇到这种
                  情况就会打印一些错误信息然后退出。
                  
                      每个从LILO引导的配置从image行开始。
                        Image = kernel
                              Label = name
                   Image包含要引导的内核。Label是给用户选择用的。Image行通常指向一个设备,
                   例如/dev/fd0,可以找到内核的范围用range来注明。
                        range = range
                  range可以用start sector -end sector 或者 start sector + length 表示。例如:
                        image = /dev/fd0
                              label = floppy
                              range = 1+512
                  以下变量赋值有可能出现:
                  append=string
                      将string作为引导参数传给内核。例如,硬件参数。
                  literal=string
                      和append查不多。但是,他会冲掉原来的设置。所以不能被全局说明。
                  ramdisk=size
                      设置RAM disk的大小。
                  read-only
                  read-write
                      设置根文件系统的访问方式。
                  root=device
                      设置根文件系统存在的设备。
                  vga=mode
                      屏幕设置。可能模式为:normal,extended 和ask. 。
                  以下设置是针对别的操作系统的:
                  loader=loader
                      说名用来引导操作系统的文件。缺省为 /boot/chain.b . 另外,LILO包含以
                  下的loader:
                  os2_d.b 可以从第二硬盘上引导os/2
                   any_d.b 在引导操作系统之前试图将两个硬盘的次序颠倒,从而可以引导第二硬盘
                  上的os.
                  table=device
                      说明一个设备,该设备的某个分区上存放要引导的os.假如没有说明table,
                  LILO就不会将该信息传给要引导的osunsafe
                      关掉对要引导的os的检查。只有要从软盘引导时,才使用该设置。没有该设置,
                  每次map installer开始运行时,引导盘都要插入软驱。
                  The disktab file
                  disktab文件包含LILO要引导的设备的物理结构信息。通常,这些信息可以从设备驱
                  动程序获取。所以,只有这种方法不行时才会用到disktab 文件。在此情况下,如
                  果文件不能用,LILO报告错误信息:
                        geo_query_dev HDIO_GETGEO(dev …)
                  或者
                        HDIO_REQ not supported for your SISI controller
                        Please use /boot/disktab
                  然后,物理结构信息就必须手工地输入。
                  # /boot/distab-LILO parameter table
                  #
                  #This table contains the geometry parameters for SCSI and
                  # IDE disks,which can not be recognized automatically
                  # Entries in this table overwrite recognized parameters!
                  #
                      # Dev. BIOS Secs/ Heads/ Cylin - Par.
                  # num. Code track cyLin.Ders. Offset
                                             (optional)
                  #0x800 0x80 32 64 202 0 # /dev/sda
                  各个域含义如下:
                      0x800
                        设备号.由主副设备号组成。
                        设备号.由主副设备号组成。
                      0x80
                        设备的BIOS 码。0x80代码系统的第一个硬盘。0x81第二个,。。。。
                        所有同一硬盘上的分区该值相同。
                      32,64,203
                        sector 数目(每个track)
                        heads 数目
                        cylinders 数目
                      0
                        分区的开始。也可以从分区表中读,所以可以不说明。
                  
                  1.5 LILO 启动信息
                  在启动过程中,LILO会显示'LILO',如果LILO出错退出,可以根据显示来判断系统的
                  出错原因。
                  没有信息:LILO根本就没有被读入,没安装LILO,或LILO驻留的分区没被激活。
                      Lnumber : LILO的第一部分被读入并开始执行。但第二部分不能被读入。后面
                  的数字表明出错原因。这可能是由于硬盘的物理错误或不正确的物理结构信息。
                      LI: LILO的第一部分可以读入第二部分,第二部分执行时出错。这可能是不正
                  确的物理结构信息或重装了boot.b而没有运行LILO重新安装。
                      LIL:LILO的第二部分启动起来了,但是不能从map文件读入descriptor tables.
                  这说明不正确的物理结构信息或物理错误。
                      LIL?: LILO的第二部分被读到不正确的地址。原因同LI
                      LIL-: descriptor tables有错。这可能是不正确的物理结构信息或重装了
                  map file而没有运行LILO重新安装。

zhy2111314 发表于 2005-4-5 10:02:58

2.GRUB (GRand Unified Boot loader)
2.1GRUB基础
    2.1.1. 什么是 GRUB?
  GRUB 是引导装入器 -- 它负责装入内核并引导 Linux 系统。GRUB 还可以引导其它操作系统,如 FreeBSD、NetBSD、OpenBSD、GNU HURD 和 DOS,以及 Windows 95、98、NT 和 2000。尽管引导操作系统看上去是件平凡且琐碎的任务,但它实际上很重要。如果引导装入器不能很好地完成工作或者不具有弹性,那么就可能锁住系统,而无法引导计算机。另外,好的引导装入器可以给您灵活性,让您可以在计算机上安装多个操作系统,而不必处理不必要的麻烦。
    2.1.2 GRUB 很棒
  幸好,GRUB 是一个很棒的引导装入器。它有许多功能,可以使引导过程变得非常可靠。例如,它可以直接从 FAT、minix、FFS、ext2 或 ReiserFS 分区读取 Linux 内核。这就意味着无论怎样它总能找到内核。另外,GRUB 有一个特殊的交互式控制台方式,可以让您手工装入内核并选择引导分区。这个功能是无价的:假设 GRUB 菜单配置不正确,但仍可以引导系统。哦,对了 -- GRUB 还有一个彩色引导菜单。我们只是刚开始。
    2.1.3. 为什么使用 GRUB?
  您也许会奇怪,为什么全世界都需要 GRUB -- 毕竟,Linux 世界在很长一段时间里一直使用 LILO 引导装入器,而且它可以让上百万的 Linux 用户引导系统。是的,的确是这样,LILO 很有效。但是,LILO 的维修率很高,而且很不灵活。与其花很多时间来描述 GRUB 的优点,还不如演示如何创建自己的 GRUB 引导盘以及如何使用它来引导系统。然后,我将说明 GRUB 的一些很“酷”的技术细节,并指导您完成将 GRUB 安装到 MBR(主引导记录)的过程,以使它成为缺省引导装入器。
  如果您有点胆小,不必害怕。可以学习本教程的前半部分,创建 GRUB 引导盘,尝试使用 GRUB 而不必弄乱现有的引导装入器。或者,可以用其安全的“驻留”方式来熟悉 GRUB。那么,让我们立即开始吧。

2.2安装GRUB
    2.2.1. 下载 GRUB
  要开始探究 GRUB 的精妙之处,首先需要下载、编译和安装它。但不要害怕 -- 根本不会修改您的引导记录 -- 我们只是要编译和安装 GRUB,就像其它程序一样,在此过程中我们可以创建 GRUB 引导盘。请不要担心;在修改引导过程之前,我会告诉您。
  现在开始。访问 ftp://alpha.gnu.org/gnu/grub/ 并下载可以找到的最新版本的 GRUB tar 压缩包。我编写本教程时,最新的 tar 压缩包是 grub-0.5.96.1.tar.gz。下载了最新版本后,就可以安装了。
    2.2.2 安装期
  这里是从 tar 压缩包安装 GRUB 所需输入的命令。我将在 /tmp 中编译源文件,并将所有部分都安装到硬盘的 /usr 目录下。从 root 用户,输入以下命令:
  # cd /tmp
  # tar xzvf /path/to/archive/here/grub-0.5.96.1.tar.gz
  # cd grub-0.5.96.1
  # ./configure --prefix=/usr
  # make
  # make install
  现在已经安装了 GRUB,准备开始使用它。
2.2.3. 制作引导盘
  要制作引导盘,需执行一些简单的步骤。首先,在新的软盘上创建 ext2 文件系统。然后,将其安装,并将一些 GRUB 文件复制到该文件系统,最后运行 "grub" 程序,它将负责设置软盘的引导扇区。准备好了吗?
  好,将一张空盘插入 1.44MB 软驱,输入:
  # mke2fs /dev/fd0
  创建了 ext2 文件系统后,需要安装该文件系统:
  # mount /dev/fd0 /mnt/floppy
  现在,需要创建一些目录,并将一些关键文件(原先安装 GRUB 时已安装了这些文件)复制到软盘:
  # mkdir /mnt/floppy/boot
  # mkdir /mnt/floppy/boot/grub
  # cp /usr/share/grub/i386-pc/stage1 /mnt/floppy/boot/grub
  # cp /usr/share/grub/i386-pc/stage2 /mnt/floppy/boot/grub
  只需要再有一个步骤,就能得到可用的引导盘。
  解压、编译和安装 GRUB 源 tar压缩包时,会将程序 grub 放到 /usr/sbin 中。该程序非常有趣并值得注意,因为它实际上是 GRUB 引导装入器的半功能性版本。是的,尽管 Linux 已经启动并正在运行,您仍可以运行 GRUB 并执行某些任务,而且其界面与使用 GRUB 引导盘或将 GRUB 安装到硬盘 MBR 时看到的界面完全相同。
  这是有趣的设计策略,现在该使用驻留版本的 GRUB 来设置引导盘的引导扇区了。从 root 用户,输入 "grub"。GRUB 控制台将启动,显示如下:
   GRUB version 0.5.96.1 (640K lower / 3072K upper memory)
   [ Minimal BASH-like line editing is supported. For the first word, TAB
   lists possible command completions. Anywhere else TAB lists the possible
  completions of a device/filename. ]
  grub>
  欢迎使用 GRUB 控制台。现在,研究命令。
  在 grub> 提示符处,输入:
  grub> root (fd0)
  grub> setup (fd0)
  grub> quit
  现在,引导盘完成了。在继续下一步骤之前,在看一下刚才输入的命令。第一个 "root" 命令告诉 GRUB 到哪里查找辅助文件 stage1 和 stage2。缺省情况下,GRUB 会在指定的分区或磁盘上的 /boot/grub 目录中进行查找。在安装引导盘时,也就是几分钟以前,我们已将这些文件复制到正确的位置。接着,输入了 setup 命令,它告诉 GRUB 将引导装入器安装到软盘的引导记录上;我们将在以后详细讨论这一过程。然后退出。现在,已经制作好引导盘,可以开始使用 GRUB 了。

2.3使用GRUB
    2.3.1. 准备
  使用 GRUB 引导系统之前,需要知道一些信息。首先,应知道哪个分区保存了 Linux 内核,以及 root 文件系统的分区名称。然后,应查看现有 LILO 配置来寻找需要传递给内核的变量,如 "mem=128M"。一旦获取了这些信息,就可以开始了。
    启动GRUB
  要启动 GRUB,需要关闭系统并退出引导盘。如果由于某些原因而不能立即关闭系统(比如上班时在部门的服务器上测试 GRUB),那么只要在提示中输入 "grub" 并继续操作。所有程序的运行情况都不会改变,只是您不能执行引导(因为 Linux 正在运行)。
    2.3.2 首次接触
  装入引导盘时,在屏幕顶部将出现一条消息,告诉您正在装入第一阶段和第二阶段。几秒后,将会出现一个熟悉的屏幕,显示如下:
   GRUB version 0.5.96.1 (640K lower / 3072K upper memory)
   [ Minimal BASH-like line editing is supported. For the first word, TAB
   lists possible command completions. Anywhere else TAB lists the possible
   completions of a device/filename. ]
  grub>
  可以看到,这些内容与在 Linux 中以驻留方式运行 GRUB 时出现的消息完全相同 -- 只不过现在我们是使用 GRUB 来引导 Linux。
    2.3.3. "root"
  在 Linux 中,当谈到 "root" 文件系统时,通常是指主 Linux 分区。但是,GRUB 有它自己的 root 分区定义。GRUB 的 root 分区是保存 Linux 内核的分区。这可能是您的正式 root 文件系统,也可能不是。例如,在 Gentoo Linux 中,有一个单独的小分区专用于保存 Linux 内核与引导信息。大多数情况下,我们不安装这个分区,这样在系统意外崩溃或重新引导时,就不会把它弄乱。
  这些,我们讨论的是 GRUB,需要指定 GRUB 的 root 分区。进入 root 分区时,GRUB 将把这个分区安装成只读型,这样就可以从该分区中装入 Linux 内核。GRUB 的一个很“酷”的功能是它可以读取本机的 FAT、FFS、minix、ext2 和 ReiserFS 分区,我们很快就会讨论这个功能。但现在,让我们输入 root 分区。在提示中输入 root,但不要按 Enter 键:
   grub> root (
  现在,按一次 Tab 键。如果系统中有多个硬盘,GRUB 将显示可能完成的列表,从 "hd0" 开始。如果只有一个硬盘,GRUB 将插入 "hd0,"。如果有多个硬盘,继续进行,在 ("hd2") 中输入名称并在名称后紧跟着输入逗号,但不要按 Enter 键。部分完成的 root 命令看起来如下:
  grub> root (hd0,
  现在,继续操作,再按一次 Tab 键。GRUB 将显示特定硬盘上所有分区的列表,以及它们的文件系统类型。在我的系统中,按 Tab 键时得到以下列表:
   grub> root (hd0, (tab)
   Possible partitions are:
   Partition num: 0, Filesystem type is ext2fs, partition type 0x83
   Partition num: 1, Filesystem type unknown, partition type 0x82
   Partition num: 2, Filesystem type unknown, partition type 0x7
   Partition num: 4, Filesystem type is reiserfs, partition type 0x83
   Partition num: 5, Filesystem type is reiserfs, partition type 0x83
  如您所见,GRUB 的交互式硬盘和分区名称实现功能非常有条理。这些,只需要好好理解 GRUB 新奇的硬盘和分区命名语法,然后就可以继续操作了。
    2.3.4. GRUB 命名约定
  到目前为止,您可能会感到一点困惑,因为 GRUB 所使用的硬盘/分区命名约定与 Linux 使用的命名约定不同。在 Linux 中,第一个硬盘的第五个分区称作 "hda5"。而 GRUB 把这个分区称作 "(hd0,4)"。GRUB 对硬盘和分区的编号都是从 0 开始计算。另外,硬盘和分区都用逗号分隔,整个表达式用括号括起。现在,回来看一下 GRUB 提示,可以发现如果要引导 Linux 硬盘 hda5,应输入 "root (hd0,4)"。如果已经明白了 GRUB 硬盘/分区命名,您也许要调整当前 root 命令行,以使它指向保存 Linux 内核的分区。按以下格式输完命令,然后按 Enter 键:
   grub> root (hd0,4) (hit enter)
   Filesystem type is reiserfs, partition type 0x83
    2.3.5. 装入内核
  现在已安装了 root 文件系统,到装入内核的时候了。在 GRUB 提示中,依次输入 "kernel"、空格、到内核的路径、空格、内核参数,如 root 参数(GRUB 将自动插入适当的 "mem=" 参数)。我在我的系统中输入:
   grub> kernel /boot/bz2.4 root=/dev/hda5
  
  请留意 "root=" 内核参数,它非常重要。它应该指向保存 root 文件系统的 Linux 分区。您也许要写下到目前为止输入的命令,这样在教程后面讲述如何创建 GRUB 引导菜单时,就可以迅速找到它们。
    2.3.6. Root,内核,引导!
  您已经安装了 root 文件系统并装入了内核。现在,可以引导了。只要输入 "boot",Linux 引导过程就将开始。

2.4GRUB内幕
    2.4.1. 重新调查引导软盘
  如果一切正常,就可以使用使用 GRUB 引导盘来引导当前 Linux 发行版。如您所见,GRUB 是功能非常强大的引导装入器,它让您可以随意动态配置以进行引导。我将向您介绍如何创建 GRUB 引导菜单,这样就可以从菜单中进行 OS 选择,而不是输入三行命令来引导 Linux。但在动手之前,现在是深入了解 GRUB 幕后是如何工作的好时机。我将说明引导盘引导过程的工作原理,这样您就可以对 GRUB 有一个更好的评价和了解。
    2.4.2. 两阶段过程
  要制作引导软盘,需要做两件事 -- 将文件复制到软盘的 ext2 文件系统的 /boot/grub 目录中,运行 GRUB 的安装程序。运行 GRUB 安装程序时,GRUB 将 "stage 1" 装入器安装到软盘的引导记录中。它还将 stage 1 装入器配置成从 ext2 文件系统直接装入 stage2。通常,GRUB 通过在包含 stage2 数据的软盘上创建一列块来完成此操作,这样 stage1 装入 stage2 时不必知道 ext2 文件系统的任何情况。
  但是,大多数情况下,GRUB 在安装完 stage1 之后,会立即将 stage1.5 装入器安装到引导记录中。这个特殊的 stage1.5 允许无需使用原始块列表就能从 ext2 文件系统装入 stage2,却要更灵活的标准基于路径的方法。GRUB 理解文件系统结构的这一能力使 GRUB 比 LILO 更强壮。例如,如果正好在整理引导盘文件系统的碎片,stage1 就可以找到 stage2(归功于 ext2 stage1.5)。而 LILO 就不能完成此项操作。因为 LILO 只能依赖于映射文件,每次更新内核或在磁盘上物理移动数据时,即使不更改路径,也需要重新运行它。
    2.4.3. 阶段 1、1.5 和 2
  您也许会想知道:如果使用 FAT 而不是 ext2 文件系统创建引导盘,GRUB 是否可以工作。是的,它可以工作,因为在输入 "setup (fd0)" 时,GRUB 会安装与 root 文件系统类型匹配的 stage1.5。即使没有没有空间可以安装 stage1.5,GRUB 仍可以通过追溯到更原始的块列表,来装入 stage2。
    2.4.4. 搜索和恢复
  在继续讨论之前,先研究一个与引导软盘相关的实用提示。由于 GRUB 的交互式性质,它为恢复软盘生成了一个很好的引导装入器。但是,如果将好的内核复制到引导盘上,那它就更好了。那样,即使硬盘上的内核坏了或者被意外删除了,也可以追溯到引导盘内核,并启动和运行系统。要将备用内核复制到引导盘,执行以下操作:
  # mount /dev/fd0 /mnt/floppy
  # cp /path/to/bzImage /mnt/floppy/boot
  # umount /dev/fd0
  现在,软盘已包含备用内核,可以在 GRUB 中使用它来引导 Linux 发行版,操作如下:
  grub> root (fd0)
  grub> kernel /boot/bzImage root=/dev/hda5 (将 /dev/hda5 更改成想要引导的分区名称)
  grub> boot
    2.4.5. 硬盘引导
  好,现在如何将 GRUB 安装到硬盘上?这个过程几乎与引导盘安装过程一样。首先,需要决定哪个硬盘分区将成为 root GRUB 分区。在这个分区上,创建 /boot/grub 目录,并将 stage1 和 stage2 文件从 /usr/share/grub/i386-pc 复制到该目录中。可以通过重新引导系统并使用引导盘,或者使用驻留版本的 GRUB 来执行后一步操作。在这两种情况下,启动 GRUB,并用 root 命令指定 root 分区。例如,如果将 stage1 和 stage2 文件复制到 hda5 的 /boot/grub 目录中,应输入 "root (hd0,4)"。现在,只差一步。
  接着,决定在哪里安装 GRUB -- 在硬盘的 MBR,或者如果与 GRUB 一起使用另一个“主”引导装入器,则安装在特定分区的引导记录中。如果安装到 MBR,则可以指定整个磁盘而不必指定分区,如下(对于 hda):
   grub> setup (hd0)
  如果要将 GRUB 安装到 /dev/hda5 的引导记录中,应输入:
   grub> setup (hd0,4)
  现在,已安装 GRUB。引导系统时,应该立即以 GRUB 的控制台方式结束(如果安装到 MBR)。现在,应创建引导菜单,这样就不必在每次引导系统时都输入那些命令。
    2.4.6. 引导菜单
  要创建菜单,只需在 /boot/grub 中创建一个简单的文本文件 menu.lst。如果将它放在正确位置,它将在 root GRUB 驱动器的 stage1 和 stage2 文件的旁边。这里是一个样本 menu.lst 文件,可以将它作为一个您的菜单的基础:
   default 0
  timeout 30
  color white/blue blue/green
  title=Boot Linux
  root (hd0,4)
  kernel /boot/bzImage root=/dev/hda5
  title=Boot Linux using initrd
  root (hd0,5)
  kernel /boot/bzImage root=/dev/loop0 init=/initdisk.gz
  initrd /initdisk.gz
  title=Windows NT
  root (hd0,3)
  chainloader +1
  我将在以下的屏面中说明 menu.lst 格式。
    2.4.7. 理解引导菜单
  引导菜单很容易理解。前三行设置缺省菜单项(项目号 0,第一个)、设置超时值(30 秒),并选择整个菜单的一些颜色。
  接着的三行配置 "Boot Linux" 菜单项。要创建手工引导命令系列之外的菜单项,只要添加一行 "title=" 作为第一行,并从最后一行中除去 "boot" 命令(GRUB 会自动添加这个命令)。
  接着的四行显示了如何使用 GRUB 来引导 initrd(初始 root 磁盘),如果您愿意的话。现在,讨论最后三行……
    2.4.8. 链式装入器
  这里是示例 menu.lst 的最后三行……
  title=Windows NT
  root (hd0,3)
  chainloader +1
  这里,我添加了一项来引导 Windows NT。要完成此操作,GRUB 使用了“链式装入器”。链式装入器从分区 (hd0,3) 的引导记录中装入 NT 自己的引导装入器,然后引导它。这就是这种技术叫做链式装入的原因 -- 它创建了一个从引导装入器到另一个的链。这种链式装入技术可以用于引导任何版本的 DOS 或 Windows。

2.6 总结
    2.6.1. GRUB 的弹性
  GRUB 最好的优点之一就是其强健的设计 -- 在不断使用它时请别忘了这点。如果更新内核或更改它在磁盘上的位置,不必重新安装 GRUB。事实上,如有必要,只要更新 menu.lst 文件即可,一切将保持正常。
  只有少数情况下,才需要将 GRUB 引导装入器重新安装到引导记录。首先,如果更改 GRUB root 分区的分区类型(例如,从 ext2 改成 ReiserFS),则需要重新安装。或者,如果更新 /boot/grub 中的 stage1 和 stage2 文件,由于它们来自更新版本的 GRUB,很有可能要重新安装引导装入器。其它情况下,可以不必理睬!
    2.6.2. 优秀的 GRUB 参考资料
  我们在这里只是介绍了 GRUB 的一部分。例如,可以使用 GRUB 来执行网络引导,引导 BSD 文件系统,或更多操作。另外,GRUB 有许多配置和安全性命令也很有用。如需所有 GRUB 功能的完整描述,请阅读 GRUB 出色的 GNU 文档。只要在 bash 提示中输入 "info grub" 就可以阅读该文档。

月下刀客 发表于 2005-4-5 10:48:52

有些内容好象也精华区的一些文章有些重,不过,楼主还是辛苦了。 8)

zhy2111314 发表于 2005-4-5 11:15:02

多谢!
后面两部分基本是拷贝的其他介绍!不过介绍的还可以,可以了解一下!

zhy2111314 发表于 2005-4-6 21:15:26

大家安装系统时要首先把硬盘分区和引导过程搞清楚,以免造成不必要的损失并且浪费时间!
所以自己顶一下呵呵
不要抛砖 啊。。。

mzyemail 发表于 2005-4-6 21:28:56

好文,顶

linky_fan 发表于 2005-4-6 21:32:54

如果不想用win下工具修复, 在linux下的一句命令和fdisk /mbr作用一样

dd if=/dev/zero of=/dev/hdxbs=446 count=1


如果想搞破坏的话就bs=512(446=mbr, 64=分区表, 2=55AA)

:mrgreen:
页: [1] 2
查看完整版本: 针对硬盘安装系统而写的系统引导过程硬盘结构和错误解决办法