关于PC的启动引导器(Bootloader)
关于PC的启动引导器Bootloader
作者:febird, 转载请注明出处
启动引导器就是就是提供给BIOS的一个用于装载磁盘(或者其他存储介质)上的操作系统的一个程序。
通常放在硬 盘的MBR(Main Boot Record主引导记录),它位于磁盘的0柱面0磁道1扇区,在文件系统之外(当然高级的引导加载器可以放置在文件系统里面作为多级引导,也有的可以放在物理分区的引导块), 但是每一个可启动设备通常都有一个MBR,里 面包含了从该设备启动系统的可执行代码,通常作用有:初始化内存,解释文件系统,加载操作系统内核等等作用。
因为MBR引导代码大小有限制,高级的引导器通常还有其他部分,例如Grub 阶段1.5 阶段2 的stage文件,grub4Dos的 grldr、grub.exe,NTLoader的ntldr等等。
高级的引导器还有启动配置文件,例如grub的menu.ls,NTloaer的 boot.ini 、syslinux的syslinux.cfg,lilo的lilo.conf,这些都方便我们配置启动引导器。
下面分别一下常见的几种引导加载器
一. 用于DOS或Win98的引导代码
必须放在MBR,需要IO.SYS,如果需要引导进入DOS Shell 则必须有command.com
如果使用了CONFIG.SYS 配置文件,则command.com可以为其他文件名
DOS的启动代码不支持多重启动,除非你进入 command.com之前在AUTOEXEC.BAT或者CONFIG.SYS 中 执行了grub.exe 或者 DEVICE=grub.exe 命令,这样就会进入Grub4Dos的管辖(Grub4Dos里会有详细说明)。
如下面的CONFIG.SYS写就可以实现用(路径可能有变化):
REM 下面的一行用来切换到 GRUB
device=GRUB\grub.exe –bypass –time-out=8 –config-file=grub\menu.lst
DEVICE=FebirdDOS\ECHO.SYS W/e/l/c/o/m/e /t/o MS-DOS 7.10…
DEVICE=FebirdDOS\ECHO.SYS C/o/p/y/r/i/g/h/t M/i/c/r/o/s/o/f/t C/o/r/p. A/l/l /r/i/g/h/t/s /r/e/s/e/r/v/e/d.
DEVICE=FebirdDOS\HIMEM.SYS
DEVICE=FebirdDOS\EMM386.EXE NOEMS
DEVICEHIGH=FebirdDOS\SETVER.EXE
DEVICEHIGH=FebirdDOS\POWER.EXE
REM DEVICEHIGH=FebirdDos\VIDE-CDD.SYS /D:IDE-CD
REM COUNTRY=001,437,FebirdDos\COUNTRY.SYS
SHELL=COMMAND.COM /P /E:640
DOS=HIGH,UMB,AUTO
FCBS=4,0
FILES=30
BUFFERS=20,0
LASTDRIVE=26
STACKS=9,256
二.用于WindowsNT/2000/xp的 NTloader 和 Vista 的 bootmgr
必须放在MBR , 需要 ntldr, ntdetect文件 (如果需要Bootloader的其他语言支持,需要相应的bootfont文件)
NTLoader在MBR中的那段代码,可以使用 fdisk /mbr 来给第一块硬盘增加 (fdisk 好像没有选择硬盘 写入mbr的命令开关)
如果Windows的引导被其他 引导程序覆盖,例如被Grub覆盖,或者被DOS的覆盖,那么你需要通过可启动软盘,光盘,移动硬盘等附带FDISK工具的微型系统盘来执行fdisk /mbr
如果磁盘MBR原来是写的DOS/WIN98的,安装NT系统(包括XP,2000等)后,Windows会将原来的MBR保存为 BOOTSECT.SYS. 然后再在Boot.ini中配置多重启动,例如可以用NTLoader加载Grub4DOS的grldr来进入 Grub4DOS具体配置请看“Boot.ini详解”
值得注意的是,如果使用NTLoader,NTLDR文件(包括需要的NTDETECT,boot.ini,bootfont) 可以和WINDOWS分开 放在不同的磁盘分区,并且WINDOWS可以放在逻辑分区,但是NTLDR文件必须放在”主分区”,并且该分区为”激活”(因为NTLoader的MBR 部分代码会查找 磁盘“活动分区”上的 ntldr文件)。
还有就是multi(0)disk(0)rdisk(0)partition(1)\WINDOWS 这句中的 partition 是从1开始的,先编号主分区,然后再编号逻辑分区,并且忽略扩展分区。这个和Linux和Grub的计算方法不一样,Grub是扩展分区当成一个主分区也进行编号,但是并没有实际意义。
例如 有一块硬盘,第一个分区是主分区,第二个分区是扩展分区(里面包含若干个逻辑分区),第三个分区又是主分区而且在这个分区里面有我们需要启动的Windows,那么partition的()里面应该填2, 然而 grub里面这个分区从0开始应该是2 (hd0,2).
关于Vista的Bootmgr,没有太多的感受,主要还是我自己的电脑没有使用这个的原因。通过BCEdit等工具可以方便的修改Vista的多重启动。
三.GNU Grub/ LILO/ SysLinux
GNU Grub是一个相当强大的启动管理器,下面简单做一下说明,Grub可以安装在MBR,Linux的根分区,以及其他介质上面(比如软盘,光盘等),通常情况安装在MBR上比较方便,因为这样不需要安装其他的引导加载器,但是这会覆盖原来的MBR,不过好在安装Linux的时候会直接分析原来安装过的启动项(例如Windows),Grub Bootloader分为几个部分,第一部分为stage0,通常是放在MBR中或者根分区的 引导块中。stage1,stage1.5,stage2等等都分别放在文件系统中的,而且stage1.5 还有相应的不同的版本以适应不同的文件系统。
GNU Grub就是文件太多,不够简洁(当然也有它的好处),关于Grub能够讲很多,这里看详细介绍与使用: Grub详解
SysLinux, LILO也是一个比较常、主流的引导装载器,配置起来和 Grub大同小异,也可以用来引导诸多系统,由于平时我没有怎么使用,可以看这个关于LILO的详细的使用说明
四.Grub4Dos
上面讲到的Grub适合使用在Linux,BSD,Unix里,Grub4Dos吸取了GNU Grub的所有优点之后,最大的特点就是他还可以运行在 DOS平台,Grub4Dos是在Grub源码基础之上开发的,Grub4Dos青出于蓝胜于蓝,应用范围相当广泛,功能更加强大。
下载的 Grub4Dos通常包含 下面几个文件,grldr,grub.exe, bootlace.com menu.lst等。
Grub4Dos可以被其他的Bootloader二次引导
1.被 DOS 引导,就是上面写DOS引导程序的提到时候的,使用Device命令或者直接执行grub.exe。
2. 被NTLoader引导,这时grldr就相当于ntldr,只要在boot.ini中加入 一行 例如 C:\grldr=”BOOT GRUB ” (文件系统可以是 FAT32或者NTFS)
另外,grldr还可以通过 Vista的 bootmgr来加载
3. 被GNU Grub 引导
可以在Grub的menu.lst里面通过类似下面的代码。这时候 grub.exe作为内核加载,IMG是可启动软盘镜像
kernel (hd0,0)/grub.exe –config-file=”map (rd) (fd0); map –hook; chainloader (fd0)+1; rootnoverify (fd0)”
initrd (hd0,0)/DOS.IMG
boot
也可以不加任何参数加载:
kernel (hd0,0)/grub.exe
boot
4.从已经启动运行的Linux中转到 grub
kexec -l grub.exe
kexec -e
5.被LILO中引导
image=/boot/grub.exe
label=grub.exe
6. 被 SysLinux引导
label grub.exe
kernel grub.exe
Grub4Dos可以作为主引导程序,写入MBR,用来加载,grldr
将Grub4Dos写入MBR的方法是使用 bootlace.com,该程序运行于DOS环境和Linux环境,
bootlace.com [OPTIONS] DEVICE_OR_FILE
在Linux下写入硬盘MBR,类似:
bootlace.com /dev/hda
在DOS下类似 :
bootlace.com 0×80
Grub4Dos使用扩展的 kernel, chainloader 和 map 命令可以实现更多更强大的功能,具体请看Grub4Dos的README。
关于Grub4Dos网络上有一个教程,我的Live Skydrive有下载 : grub4dos.chm
五.MacOS Darwin BootLoader
尽管 Mac OS X 可以通过 EFI启动,Mac OS X的”达尔文 ” Bootloader 在PC上面 也是可以发挥得很好 ,Darwin BootLoader也是既可以写入 MBR,也可以写入 分区的”启动扇区”
Darwin的 standalone 文件夹提供了基本上所有的 引导相关文件:
BOOT0 , BOOT1h, BOOT1u, BOOT ,BOOTEFI, CDBOOT ,BOOT.cat,CHAIN0,BOOTHELP.TXT
BOOT0用于写入MBR, BOOT1h BOOT1u 和 BOOT 共同构成了DARWIN的启动 其中BOOT1h写入HFS+文件系统的Mac的启动扇区,BOOT1U写入UFS文件系统的Mac,BOOT则写在不为人知的地方。 BOOTEFI 是EFI方式启动的启动文件, CDBOOT 和 BOOT.cat 用于光盘启动, CHAIN0 用于 GRUB等 链式启动。
后来有人做的的tboot是用来启动逻辑盘里的Mac。
大多数在普通PC机上面安装破解版的MacOS的一般都会是多系统,所以不会将Darwin Bootloader安装在MBR,都会选择安装在分区“引导块”,所以我这里只说一下我总结的一些,很多都是积累了很多前人的经验,我使用的是 uphuck 和 iTOAK.
如果启动代码写在 MBR ,必须保证 MacOS 分区是活动分区并且 Mac应安装在比较靠前的分区(1024之前)柱面,”活动分区” 可以通过分区工具 PM来做,或者是用Mac 启动盘提供的 fdisk
>fdisk -e /dev/rdisk0 #rdisk0指第一个硬盘
>flag X #将X分区激活
>update #更新分区表
>write #更改生效
>quit
想想要自己的MacOS分区(ufs,hfs)系统被其他Bootloader启动,Darwin的启动代码最好写在分区“引导块”上,同时Mac应安装
在比较靠前的分区(1024之前)柱面,这样才可以通过 chain0,tboot或者 grub 的 chainloader +1
等方式来启动。如果引导块没有写入这个引导代码,则可以通过光盘自带的工具startfiletool来解决.Mac OSX 的分区可以通过光盘进入
命令行,然后执行下面的命令
> unmount /Volumes/MacDriveName
> dd if=/usr/standalone/i386/boot1h of=/dev/rdisk0s1 bs=446 count=1
>starupfiletool /dev/rdisk0s1 /usr/standalone/i386/boot
>bless -drive /disk0s1 -setboot -verbose
Mac OSX 启动时,可按F8进入交互模式,输入:
[device]
其中
device: rd=
rd=*
kernel: kernel name (e.g. “mach_kernel” – must be in “/” )
例如:
mach_kernel rd=disk0s1 -v “Graphics Mode”=”4096x4096x32@85″
========
The End
相关日志
本文发表于星期三, 一月 9th, 2008 at 下午 6:22 文章归类于 Linux, 软件应用.
标签: bootloader, Linux.
你可以去 留下评论, 或者
我有话说
没有自己的个性头像?去搞一个吧,很简单的,只要去Gravtar登记一下就OK啦,绑定Email后就可以在全球使用的。
标注有 黑体 的域是必填的. 你的电子邮件地址是 永远 不会公开或者转交给第三方.
下面的HTML标记可用:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>URIs 必须书写完整 (例如: http://www.febird.net) 并且所有的标签都应该正确关闭.
换行符与段落标记将自动产生.
大家要注意了,XX言论 可能 会被和谐哦.