Grub4dos是如何引导系统的

来源:https://www.uweishi.com/ 时间:2013-07-23 15:06:19 责任编辑:admin

  Grub是Linux的一个系统载入启动程序,正如NTLDR之于Windows NT/2K/XP。它就是为多重引导而生,而且适用于多种平台,这里所说的Windows下的Grub就是Grub4dos。

在NTFS格式下,在boot.ini里添加一个grldr的选项,然后编辑它的启动菜单把类似DOS.IMG之类的文件加载进去,就算不是 FAT32 也没问题了。

  可能是介于DOS不能与时俱进,微软在2002年发布了WinPE(Windows PreInstallation Environment)预安装环境,相当于迷你的急救WinXP系统。目前市面上流传较广的有萝卜U盘撒手不管版、深山红叶工具箱等……,其实五花八门的,虽各有见长,但基本都是大同小异。要么你多个工具软件,要么我多个驱动程序。最主要的应用当然是市面那些DIY的系统安装光盘,例如什么番茄花园什么猪猪猫什么深度技术等。

  之前用的是Grub/DOS(grldr),后来装了萝卜U盘WinPE带加密功能的硬盘版(mtldr),但是折腾了很久还是无法识别NVIDIA的网卡驱动,而且一些功能报错(例如 MMC),外挂又是打包无法直接编辑;后来发现最帅的菜鸟专用启动光盘(RXPE.LDR)竟然能够识别NVIDIA网卡,但这个版本的其他功能却是非常简陋;所以最后通过深山红叶WinPE(drldr)的外挂包把NVIDIA的驱动包加载到萝卜U盘的硬盘版里。

  不管那个版本的WinPE,光盘版也好,硬盘版也好,启动菜单几乎都是用grub做的;而且多个版本都是指定了各自的Loader,像什么mtldr、avldr、pxldr等,特别是很多都在C盘根目录放置了很多根本可以不用放到根目录的东东,容易出错且一但有问题难排错。既然都是用Grub来做,那或许应该可以用 Grub来统一引导启动?

  先说说萝卜U盘WinPE默认的安装目录为C:\MiniPE,默认启动文件为C:\mtldr。DIY开始:首先,在 C:\boot.ini里加上一行:C:\grldr="Start WinPE with Grub4DOS",然后,下载最新版的 grub4dos,把解压缩出来的grldr放到C盘根目录。用grldr内置菜单编辑工具,把grldr的启动菜单读取出来,其代码为:

default 0
timeout 1
fallback 1
 
title find /menu.lst
 find --set-root --ignore-floppies /menu.lst
 configfile /menu.lst
 
title find /boot/grub/menu.lst
 fallback 2
 find --set-root --ignore-floppies /boot/grub/menu.lst
 configfile /boot/grub/menu.lst
 
title find /grub/menu.lst
 fallback 3
 find --set-root --ignore-floppies /grub/menu.lst
 configfile /grub/menu.lst
 
title commandline
 commandline
 
title reboot
 reboot
 
title halt
 halt

  可以看出grldr会去几个位置找menu.lst,优先查找根目录,若根目录没找到menu.lst,就会去旧版本的位置/boot/grub/menu.lst查找。用GRUB菜单密码MD5工具得到某密码如:123456的MD5 = $1$8$pSqK8hjjgmdb73MJlsrnj1,将上面这段内容修改为下面的代码并保存到刚刚的grldr中:

default 0
timeout 0
fallback 1
title WinPE with Grub4DOS
 password --md5 $1$8$pSqK8hjjgmdb73MJlsrnj1
 find --set-root --ignore-floppies /menu.lst
 configfile /menu.lst
title Back
 rootnoverify (hd0,0)
 makeactive
 chainloader +1

  这样,ntldr加载boot.ini后,当我们选择“Start WinPE with Grub4DOS”时,grldr就会出现上面我们编辑好的菜单(因为延时0秒所以基本不可见),因为默认是第0个选项,所以来到输入密码的界面;如果密码输入错误或菜单文件放置有误,则会fallback回第1个选项(即回到第一块硬盘的第一个分区也就是C盘)。当正确输入123456密码并菜单放置正确后,grldr会自动找到并加载我们编辑好的新的菜单/menu.lst:

color black/cyan yellow/cyan
timeout 20
default 0
 
title 00. Start WinPE (LaoMaoTao)
find --set-root /boot/winpe.iso
map --mem /boot/winpe.iso (hd32)
map --hook
chainloader (hd32)
boot
 
title 01. Start Power WinPE (Data/File)
find --set-root /boot/powerpe.iso
map --mem /boot/powerpe.iso (hd32)
map --hook
chainloader (hd32)
boot
 
title 02. Start WinPE (Network/Kaspersky)
find --set-root /boot/reboot.iso
map --mem /boot/reboot.iso (hd32)
map --hook
chainloader (hd32)
boot
 
title 03. Start Rescue DOS (MSDOS v7.1)
find --set-root /boot/rdos.img
map --mem /boot/rdos.img (fd0)
map --hook
chainloader (fd0)+1
rootnoverify (fd0)
 
title 04. Start Recovery DOS (Ghost/DishGenis)
find --set-root /boot/ghost.img
map --mem /boot/ghost.img (fd0)
map --hook
chainloader (fd0)+1
rootnoverify (fd0)
 
title 05. Start Ram Windows XP
find --set-root --ignore-floppies /boot/ramxp/ramxp.dsk
kernel /boot/ramxp/memdisk raw
initrd /boot/ramxp/ramxp.dsk
 
title 06. Load MemTest-86 Program
kernel (hd0,8)/boot/memtest.bin
 
title 07. Load from other Menu.lst
find --set-root /grldr
configfile /boot/menu.lst
 
title 08. Find/Load Windows NT/2K/XP (NTLDR)
find --set-root /ntldr
chainloader /ntldr
 
#title Find/Load Windows 9x/Me (IO.SYS)
#find --set-root /io.sys
#chainloader /io.sys
 
title 09. Boot from CDROM
find --set-root /boot/sbootmgr.dsk
map --mem /boot/sbootmgr.dsk (fd0)
map --hook
chainloader (fd0)+1
rootnoverify (fd0)
 
title 10. Boot from HardDisk #1 (HD0,0)
root (hd0,0)
chainloader +1
 
title 11. Boot from HardDisk #2 (HD1,0)
root (hd1,0)
chainloader (hd1,0)+1
 
#title (?) Grub Command Line
#commandline
 
title (!) Reboot
reboot
 
title (x) Shutdown
halt
 
title <=== Back ====
rootnoverify (hd0,0)
makeactive
chainloader +1

更新一下:

  1、把boot目录放到其他盘(C盘根目录就只有grldr和menu.lst两个文件了)。预防万一,若C盘被误格等,辛苦制作的硬盘版启动文件还在。

  2、把萝卜U盘和深山红叶和最帅菜鸟的ISO直接加载;他们的外置程序则是放置在ISO所在分区:/MiniPE、/BOOT、/RXPF 目录下 —— 经过多次测试能完美解决grub加载ISO无法使用外置程序(其实无论外置还是内置,现在都是OK的)的问题。

  3、加了个RamXP,哈哈,目录任意,效果挺不错。其实没什么用,就试下效果。dsk格式的文件挺不错。但找不到有什么编辑工具。

菜单的样子大概如下图(VMware下的调试状态,未一一对应以上菜单代码): 

  高级DIY应用:在这个界面,高亮你要选择的选项后:按“b”键或回车启动;按“e”键可以进入编辑状态;按“c”键进入命令行模式。进入选项编辑状态后,还可以继续“e”进入内容编辑状态,按“Esc”取消修改;按“Enter”应用修改 —— 其实这些已经是相当于Linux/Ubuntu的启动了。

  还有一个问题:在boot.ini菜单可以添加C:\bootsect.cdr="Boot from CDROM",利用512字节的光驱引导文件bootsect.cdr来启动光驱,但这个文件在grub4dos无法应用。甚至用“scdrom --install”和“scdrom --bootcd”都无法解决,报无法识别。留点缺陷美才是完美!!!!!