作者zxvc (zxvc)
看板Linux
标题grub教学
时间Tue Jul 25 23:26:06 2006
如果有多台硬碟,我通常会建议把grub优先灌在IDE硬碟上的MBR。为什麽?
先解释一些东西。『MBR』是什麽?
MBR就是每台硬碟第一个磁区(Sector,它的大小是512bytes)。
当我们一启动电脑,BIOS作完一些基本的测试、初始化之後,
就会查询你之前所设定的开机顺序,
从开机顺序决定要去哪个装置读取程式来载入作业系统。
比如说今天设定从一台硬碟机启动,那麽BIOS就会去读取这台硬碟上的第一个磁区,
也就是所谓的MBR。MBR里通常存放者一些多重开机程式,例如grub、SPFdisk。
这些多重开机程式可以去硬碟上『装有作业系统』的
『不同的分割区』上的第一个磁区(称作boot sector,不要与MBR搞混)
启动作业系统核心loader(例如:Windows XP的NT kernel loader)。
作业系统核心被成功启动後,就可以使用作业系统了。
至於Linux的核心的loader就是grub。grub不能启动Windows的kernel,
所以必须要去分割区上的第一个磁区找到Windows kernel的loader。
所以grub中会有一个指令叫作『chainloader +1』
就是去读取一个Partition(分割区)的boot sector,
那个『+1』代表该Partiton的第一个Sector,『+2』代表第二个Sector、...依此类推。
但grub是一个功能强大的多重开机程式,
根本不可能把那麽多功能塞在一个512bytes的MBR上。
所以这个程式被切割成几个部份:Stage 1、Stage 1.5、Stage 2。
这三个档案可以在/boot/grub/底下找到。
Stage1大小为512bytes,所以刚好可以存在MBR上。
当电脑一开机,BIOS启动MBR上的grub Stage1,Stage 1会去启动硬碟上的Stage 1.5。
可是有一个问题出现了,Stage 1是如何找到Stage 1.5的?
Stage 1只有区区的512bytes,是没有多余的能力可以操纵分割区上的档案系统,
所以没有办法用这个方法找到Stage 1.5。
而Stage 1其实是用一个方法找到Stage 1.5的档案,就是当初在安装grub到MBR时
Stage 1.5所在硬碟上的那一个磁区的位置会被纪录到MBR中,
所以Stage 1就会去指定的磁区位置找到Stage 1.5执行它。
那麽Stage 1.5是作什麽用的呢?Stage 1.5有很多个档案,
分别是用来处理档案系统(File System)用的。
像『fat_stage1_5』就是用来处理FAT Partition上面的档案用的、
『e2fs_stage1_5』是用来处理Ext2、3的档案系统用的。
所以grub到了Stage 1.5就可以由File System处理许多Partition上的档案。
那麽接下来Stage 1.5会去启动Stage 2。
Stage 2就是grub的主要核心,几乎大部分的功能都在里面。
可是又有一个问题出现了,Stage 1.5是如何找到Stage 2的?
答案是:因为Stage 1.5已经可以辨识Partition上的File System,
所以自然有办法找到Stage 2的档案。
Stage 2启动後会去读取menu.lst,然後grub的开机选单就呈献在我们眼前。
还有一件事要注意的,就是我们开机启动grub後,
grub会对电脑上的每一台硬碟机命名。
BIOS一开机时会在主记忆体初使化BIOS中断服务(BIOS interrupts)。
grub似乎是从BIOS的中断服务得知电脑上的硬碟数量。
可是BIOS对每台硬碟机给的排序有一个特色(这一句话我不是很肯定),
就是可以用来开机的那一个硬碟机比较特殊,都是『第一个』硬碟机。
不管是用SATA、IDE、USB或SCSI硬碟开机,那一台硬碟就是『第一个』硬碟机。
其余的硬碟机分别会依
Primary IDE Master→Primary IDE Slave→Secondary IDE Master→
Secondary IDE Slave→SCSI、USB或SATA
作排序。如果该插槽的硬碟机不存在就跳过排序。(光碟机不算在内)
然後grub会依照BIOS所给定的排序,分别给每一台硬碟机一个名称--BIOS drive。
这个名称的命名是从数字『0』开始
(据说grub 2会改成从『1』开始。Partition的命名也是从『0』开始。),
第一台硬碟机就命名为『hd0』、第二台硬碟机就命名为『hd1』、
第三台『hd2』、...依此类推。
例如以下组合:
[1] (『Primary IDE Slave HDD with grub』 + 『SATA HDD』),
从『Primary IDE Slave HDD with grub』开机
→ 『Primary IDE Slave HDD with grub=hd0』,『SATA HDD=hd1』
[2] (『Primary IDE Master HDD』 + 『SATA HDD with grub』),
从『SATA HDD with grub』开机
→ 『Primary IDE Slave HDD=hd1』,『SATA HDD with grub=hd0』
[3] (『Primary IDE Master HDD』 + 『Secondary IDE Master CDROM』 +
『Secondary IDE Slave HDD with grub』),
从『Secondary IDE Slave HDD with grub』开机 → 『Primary IDE Master HDD=hd1』
,『Secondary IDE Slave HDD with grub=hd0』
现在大概清楚grub的命名原理了吧。
那为什麽我会建议把grub灌到IDE硬碟上呢?
举个例子:假设我们把Linux、grub灌在一台电脑的IDE HDD上的第3个分割区,
这台电脑还有一台SATA HDD。如果说今天改变主意,我们从IDE HDD启动Linux,
然後我们在Linux中想把grub灌在SATA HDD上。
我们会执行以下指令:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# grub
>> root (hd0,2)
>> setup (hd1)
>> quit
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
这样grub Stage1是会被灌到SATA HDD上的MBR没错,
可是我们个Stage 1.5与Stage 2却是在『(hd0)』的硬碟上,
也就是说『Stage 1.5』所在的硬碟hd0上某个磁区的位置会被纪录到MBR中,
这样才可以给Stage 1找到。被纪录到MBR的不是只有Stage 1.5所在的磁区位置,
还有所在的硬碟代号--hd0。
如果现在就重新开机,并调整BIOS为从SATA HDD开机,就会出现失败。
为什麽?因为之前说过,用来启动grub的那一台硬碟是第一台硬碟,
本来我们从IDE HDD开机进Linux,那个时候的hd0指的是IDE HDD。
可是灌好grub到SATA HDD後,重新开机、调整BIOS开机顺序後,
hd0变为SATA HDD那一台。在开机的时候,
SATA HDD上grub会去找hd0上某一处磁区的Stage 1.5。
可是我们知道Stage 1.5应该是在IDE HDD上才是,
并不存在SATA HDD上,所以会产生错误。
诸如此类的问题还有不少,所以我是建议把grub灌在IDE硬碟上。
如果没有IDE硬碟,就不用担心这个问题,就把它灌在SATA、SCSI、USB硬碟上。
其实上面的讲法不够好,更一般的说法是:
请按照
Primary IDE Master→Primary IDE Slave→Secondary IDE Master→
Secondary IDE Slave→SATA 1→SATA 2→....
的顺序安装在以上第一个出现的硬碟机上。
不过上面那个失败的范例也是有解决的方法,
就是手动指定装置档对应到BIOS drive。可以使用grub的『device』指令。
指令如下,请自行意会:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# grub
>> device (hd1) /dev/hda
>> device (hd0) /dev/sda
>> root (hd1,2)
>> setup (hd0)
>> quit
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
还有一个grub的问题就是装置档的问题。现在许多Linux Distribution使用
udev来管理装置档(也就是/dev底下的那些档案)。
可是udev在Linux核心开机後才会动态制作那些装置档,例如/dev/hda、/dev/sda。
我们常用Live CD去救援的时候,在chroot到我们要被救援的Linux partition後,
会发现grub抓不到任何硬碟。这是为什麽?
这是因为似乎grub在作业系统中执行的时候(就是不是在开机的时候执行),
是去/dev底下搜寻硬碟机的。
可是那个被救援的Linux partition的Linux核心并没有被启动,udev也没有正常执行,
所以在chroot後的/dev底下没有任何有关硬碟的装置档,
所以此时grub会找不到任何硬碟机。
解决的方法是用『mknod』这个指令手动创造装置档。
例如:
# mknod /dev/hdc b 22 0
是用来创造hdc这个装置档到/dev底下。
那个『22』不是乱打的,它可以在Linux kernel Document查到
/usr/src/linux/Documentation/devices.txt
而那个『0』指的就是/dev/hdc本身。
如果要创造/dev/hdc4这个装置档,可以用这个指令。
# mknod /dev/hdc4 b 22 4
以下是一些常用的代号:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
3 block First MFM, RLL and IDE hard disk/CD-ROM interface
0 = /dev/hda Master: whole disk (or CD-ROM)
64 = /dev/hdb Slave: whole disk (or CD-ROM)
22 block Second IDE hard disk/CD-ROM interface
0 = /dev/hdc Master: whole disk (or CD-ROM)
64 = /dev/hdd Slave: whole disk (or CD-ROM)
8 block SCSI disk devices (0-15)
0 = /dev/sda First SCSI disk whole disk
16 = /dev/sdb Second SCSI disk whole disk
32 = /dev/sdc Third SCSI disk whole disk
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
制作好装置档後,再执行grub就可以找到硬碟了。
记得装完grub後要把手动制作的装置档rm掉,让udev来管理装置档。
(不删掉应该也不会有什麽问题)
(如有错误,欢迎指正)
--
《金刚经》
又念过去於五百世,作忍辱仙人,於尔所世,无我相、无人相、无众生相、无寿者相。
http://web.cc.ncu.edu.tw/~93501025/jg.doc
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 140.115.218.133
1F:推 realmax:谢谢大大分享,好完整的解说,转寄回去慢慢研究:)_ 07/26 09:00
2F:推 allen0529:写的真好,我又学到很多知识罗(∩_∩) 07/26 11:03
3F:推 sagek:写的真详细 推 07/26 12:43
4F:推 jeonjh:很用心...推 07/26 14:33
5F:推 nfsong:推 01/18 10:01