• 最新动态
  • Grub4dos是如何引导系统的

    作者:upzxt 文章来源:u盘装系统 发布时间:2012-07-09 08:53点击:

    Grub4dos是如何引导系统的

      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”都无法解决,报无法识别。留点缺陷美才是完美!!!!!

    (责任编辑:一键u盘装系统)