当前位置:Linux教程 - Linux - 用 GRUB 来引导软盘映象

用 GRUB 来引导软盘映象



        

    用 GRUB 来引导软盘映象——节约软盘介质了


    GRUB for DOS 下一个版本将在 12 月份提供下载。预计 11 月份开发完成,但主要在我的机器上测试。到 12 月份提供下载时,欢迎大家也参与测试,希望这有助于朝着一个稳定版 0.2.0 迈进。这里事先声明,map 命令的新功能是有某种危险的,建议首先在 VMware 或者 Virtual PC 这类虚拟机中测试。先用 --read-only 或者 --fake-write 参数运行 map 命令,这样是在只读状态下测试,安全一些。只读测试一段时间后,没有问题的话,再进行全面测试。测试时,在 grub 所仿真的虚拟磁盘上安装 DOS/Win9x/Me,不要用别的操作系统。即使全部测试都成功,这个仿真技术也仍然有着它固有的危险性。这是基于 BIOS 的仿真,不是全方位的仿真。例如,当你格式化一个磁盘的时候,你得明白这个磁盘是不是仿真了的? 以及你所用的格式化软件是使用 BIOS 呢? 还是使用磁盘 IO 端口读写? 使用 BIOS 的格式化软件,在仿真之下是安全的。使用磁盘 IO 端口的格式化软件,当它格式化一个仿真了的磁盘时,在最坏的情况下,实际上会格式化你的真实硬盘,至于说这种危险的误操作会发生在哪个硬盘上,取决于使用了什么样的 map 命令集(参考下面的“技术细节和实现方法”一节)。更进一步的测试,请大家报告 DOS 的 format 命令、Windows 资源管理器的格式化命令、磁盘碎块整理命令等等,以及第三方生产的 HD-COPY 等工具软件在进行格式化操作时是否安全。
    --------------------------------------------------------------------------------


    grub_for_dos 版本 0.1.x 是一个开发版的系列,在 GNU GRUB 原有的基础上实现了引导 1.44M floppy.img 的功能。从这里得到这个软件:

    ftp://ftp.cosoft.org.cn/incoming/grub_for_dos-0.1.4.tar.gz

    也可进入目录查看:

    ftp://ftp.cosoft.org.cn/incoming/

    感谢 Wengier 兄在中国DOS联盟成员新DOS时代为 grub_for_dos 建立镜像下载和英文推介网页。〖顺便说:FreeDOS ——GNU/Linux 的一个极好的补充,有着旺盛的生命力。在需要用到实模式的时候(正如运行 GRUB for DOS 所要求的那样),我们就想起来 DOS 的好处了。某个著名的 DOS 公司正在努力让 DOS 消亡,但 DOS 是不会消亡的。那个公司不想要 DOS 了,但是我们还要;DOS 的未来是我们的,不是那个公司的。〗

    下载解压后,在纯 DOS 下运行 grub.exe 文件即可。不要被“for DOS”这个后缀吓坏了,实际上你完全可以在 Linux 下正常编译生成通常的 grub 引导管理器文件,这样,你的 grub 同样可以把软盘映象文件模拟成启动软盘。整个 grub_for_dos 项目就是对 GNU GRUB 的丰富和加强,你可以认为 grub_for_dos 不过就是 GNU GRUB 的补丁而已(源程序就是以补丁的形式出现的)。再次说明,grub_for_dos 是 GNU GRUB 的功能扩展(起初只是让 GRUB 能够从 DOS 运行,所以取了“for dos”这样的名字),不是“只能用于 DOS 环境”的意思。正常编译之后,安装在(例如) MBR 中,当然是可以的。

    0.1.2 修正了一个读取软盘扇区的 BUG;增加了从 menu.lst 菜单安装 GRUB 到 MBR 的菜单项。使用方法是,将解包后的 boot 目录拷贝到 C: 也就是根目录下(于是就有了这个文件 C:ootgrubmenu.lst)。这需要在 Windows 下操作(或者在一个可以创建长文件名的 DOS 下操作),因为在 C:ootgrub 目录下有很多长文件名,而你所用的 DOS 或许不能建立长文件名。拷贝完成后,进入纯 DOS,运行 grub.exe,当看到菜单后,选择“install GRUB on (hd0,0) to MBR (hd0) and reboot”这个菜单项就行了。这里假定你的 C: 盘是 FAT32 格式的,并且分区号是 (hd0,0) 也就是第一块硬盘上的第一个主分区。

    0.1.4 优化了 FreeDOS 的相关代码,可望能够在未来的任何 FreeDOS 版本中运行。谢谢 wengier 兄快速的消息。

    --------------------------------------------------------------------------------


    有关 grub_for_dos 的用法和注意事项,请看里面的 README 和 ChangeLog 文件。这里摘录其主要部分:

    以下命令集可以引导 Windows 98 SE

    map (hd1,0)/dos98se.img (fd0)
    chainloader (hd1,0)/dos98se.img
    rootnoverify (fd0)
    boot

    另外一个例子,用 hd.img 文件引导 Mandrake 的安装程序

    map (hd0,0)/hd.img (fd0)
    chainloader (hd0,0)/hd.img
    rootnoverify (fd0)
    boot

    软盘映象的大小必须是 1440KB, 即 1474560 字节。映象文件必须是连续的磁盘块,不能有碎片。

    如果你用 ext2 之类的分区,恐怕无法生成 1.44M 的连续文件。解决的办法是采用 FAT32 分区。

    在 FAT32 分区中将一个文件拷贝成 10 个或 20 个文件,看看哪个文件是连续的,就采用哪个。

    在 grub 的提示符下敲入

    grub> blocklist (hd0,0)/hd.img

    可以看到该 hd.img 文件是由几个不连续的块组成。如果没有逗号,表示是连续的(只有一块)。逗号越多,表示碎片越多。在敲入 blocklist (hd0,0)/hd.img 命令之后,应当显示出类似下面这样的结果:

    (hd0,0)879328+2880

    879328 是起始扇区号,这个数可以随便,没有任何影响。而那个 2880 就是 1.44M 的意思(2880个扇区就是 1440K)。这说明 hd.img 是硬盘上的一个连续的扇区序列,因此你可以把它仿真成软盘了,好!

    如果显示成类似下面这样的结果:

    (hd0,0)879328+96,880000+2784

    你注意到 96 和 2784 加起来正好等于 2880。但是,这个 hd.img 文件不能用来仿真软盘,因为它在硬盘上是不连续的,它被放置在两个区域,一个区域是连续的 96 个扇区,第二个区域是连续的 2784 个扇区。要想使用 grub_for_dos 的软盘仿真(将来还有硬盘和光盘仿真)功能,必须要求——用来仿真的那个区域——是连续的磁盘块!!我们的实现方法是接管 int 0x13 中断,是用硬盘区域而不是用内存区域来仿真(将来仿真大硬盘,本来就不可能用内存来仿真的),因而不用接管像 int 0x15 这样的调整内存大小的中断。连续的硬盘区域减轻了编程的负担,也使得仿真之后的硬盘 BIOS 底层操作效率不受到影响。


    --------------------------------------------------------------------------------


    grub.exe 文件放在任何目录都一样,无关紧要,只要你能运行它就行。

    hd.img 放在哪里也是无关紧要。但是,如果不是在根目录,你需要在上述命令中指出所在的位置,例如 (hd0,0)/somewhere/else/hd.img


    --------------------------------------------------------------------------------


    如果你的机器没有软驱,而你又需要运行某个 floppy.img 上的安装程序(或者引导程序),那么这个软件正是你所需要的。

    如果你有软驱,但想节约软盘介质(软盘容易坏掉啊!),也可以试试。

    还要说明,map 命令定义了磁盘仿真的映射,如果你不需要从仿真磁盘上引导启动你的操作系统,你当然可以 chainloader 别的某个引导扇区,并非一定得是这个软盘的映像文件。
    --------------------------------------------------------------------------------



    已知的问题:

    正如上面所说,GRUB 对于磁盘的仿真是基于 BIOS 的 int 0x13。那些使用 BIOS 的操作系统,在 GRUB 仿真之下能够很好地运转。这些系统有:各种各样的 DOS;Windows Me 以前的系统(Wengier 说包括 Windows Me)。(Wengier 说)只有 Windows NT 系列才脱离了 BIOS。已知 LINUX 也不使用 BIOS。

    ——那些使用 BIOS 的操作系统都能正常使用 GRUB 的磁盘映射功能吗?

    ——是的。磁盘映射一旦由 map 命令定义,这个映射从操作系统的引导开始就有效,一直持续到操作系统退出为止。如果你在 grub 中用 map 命令定义了软盘的映射,此后你用 chainloader 命令引导了 Windows 98,则在 Windows 98 之下,你访问到的软盘,就是你的 img 文件的内容。相反,如果你用 chainloader 命令引导了 Windows 2000,则在 Windows 2000 中你有可能看不到仿真后的软盘,你可能发现,软盘操作总是指向你的真实软驱。

    ——那些不使用 BIOS 的操作系统就不能用 GRUB 的磁盘映射功能了吗?

    ——在这些操作系统引导的时候,磁盘映射还是起作用的。但是,当这类操作系统的内核引导完毕之后,它就不再使用仿真了。例如,你用一个软盘映象文件引导了 Linux,在 Linux 内核开始运行之后,Linux 就不使用仿真了。假如这时你访问 /dev/fd0 ,可以看到软盘的灯亮了。你要想找回你的软盘映象 img 文件的内容,可以在 Linux 内部通过硬盘文件系统来访问这个 img 文件。设想你可能仅仅就是想用某个软盘映像文件来引导 Linux 或者 Windows 2000 罢了,而你并非想让这个仿真在操作系统引导之后仍然起作用;如果是这个目的,那么用 GRUB for DOS 应当是合适的。
    --------------------------------------------------------------------------------


    技术细节和实现方法:

    GRUB 接下来的几个版本将要对各种规格的软盘映像给以支持。由于硬盘的仿真也很类似,所以,也要对硬盘的 img 给以支持。另外,GRUB 目前没有开放写软盘的操作,最近也要开放(写软盘是一种危险的操作,因为实际上我们写入了硬盘的 img 文件中,万一 GRUB for DOS 的仿真程序有 BUG,写入硬盘其它扇区中,可能造成数据毁损、无法启动等严重问题!)。在这之后,考虑支持在其它 DOS 下运行 GRUB 的问题。

    对软盘规格:需要解决的技术问题是如何恰当地处理三维的几何地址,也就是平常所说的 CHS(C——磁道柱面号;H——磁头号;S——扇区号)。对于真实的软驱(和软盘),都有这些规格的。然而,我们仿真之后的 img 文件,却无法表示这些规格。例如,一个 1.44M 的没有格式化的 img 文件,里面的数据全部是 00,怎么确定其 CHS 值呢?

    目前的思路是这样的:当 img 文件已经经过 DOS 的格式化时,就用软盘第一扇区的 BPB 表来确定 CHS 值。如果没有经过 DOS 的格式化,或者发现其 BPB 表是错误的,那么就根据 img 文件的大小来确定 CHS 值。如果是标准的(或者常用的)软盘 img 尺寸,如 1.44M,1.2M,1.68M,2.88M 等等,就用已知的 CHS 值。我们支持的软盘尺寸甚至可以是任意的(非标准的),如 10M 或 50M 或 500M 的软盘 img 文件。这时候,如果 BPB 表中没有合法的 CHS 值,就需要用 map 命令行参数来手动设置 CHS 值了。如果命令行没有指定 CHS 值,给出一个错误信息,拒绝仿真。当软盘 BPB 表和 map 命令行都有 CHS 的指定时,以命令行的指定为准,如果两者有差别,给出一个警告信息。

    软盘规格列表(不支持扇区大小不等于 512 字节的防拷贝加密软盘):

    软盘容量    每面磁道数    每道扇区数    磁头数或面数
    ----------------------------------------------------------------
    0160K(标准)    40        08        1  
    0180K(标准)    40        09        1  
    0200K       40        05        2  
    0250K       50(暂用)     10(暂用)     1  
    0320K       80        08        1  
    0320K(标准)    40        08        2  
    0360K(标准)    40        09        2  
    0400K(优先)    40        10        2  
    0400K       80        05        2  
    0420K       42        10        2  
    0500K       50(暂用)     10(暂用)     2  
    0640K       80        08        2  
    0720K(标准)    80        09        2  
    0729K       81        09        2  
    0738K       82        09        2  
    0747K       83        09        2  
    0756K       84        09        2  
    0800K       80        10        2  
    0810K       81        10        2  
    0820K       82        10        2  
    0830K       83        10        2  
    0840K       84        10        2  
    1200K(标准)    80        15        2  
    1215K       81        15        2  
    1230K       82        15        2  
    1245K       83        15        2  
    1260K       84        15        2  
    1360K       80        17        2  
    1377K       81        17        2  
    1394K       82        17        2  
    1411K       83        17        2  
    1428K       84        17        2  
    1440K(标准)    80        18        2  
    1458K       81        18        2  
    1476K       82        18        2  
    1494K       83        18        2  
    1512K       84        18        2  
    1600K       80        20        2  
    1620K       81        20        2  
    1640K       82        20        2  
    1660K       83        20        2  
    1680K       84        20        2  
    1680K(优先)    80        21        2  
    1701K       81        21        2  
    1722K       82        21        2  
    1743K       83        21        2  
    1764K       84        21        2  
    2880K(标准)    80        36        2  
    3198K       82        39        2  

    硬盘和软盘是有差别的,也似乎比软盘复杂了一些。硬盘第一扇区不是 DOS 的引导区,而是主引导记录(MBR),在这里没有 BPB 表,而是有一个分区表。所以,对于硬盘的 CHS,准备作如下的处理:

    当没有分区表或者分区表错误时,必须由 map 命令行来指定 CHS,否则拒绝仿真。当分区表存在时,由四个分区表项中的任意一项都可以确定 H 和 S 的值。再用 img 文件长度即可确定 C 的值。大硬盘的 CHS 值也是可以用这种办法来确定的。

    也可能有人不愿意给出命令行 CHS 参数,他们希望 grub for dos 任意选择一个适当的值。map 命令将提供这样一种选项。首先根据上述 BPB 或分区表来确定CHS,如果失败,再用以下的办法来确定。对于软盘,尽量采用具有 2 个磁头的参数,扇区数采用 63(如果 img 尺寸大于 2.88M)/36(如果 img 尺寸小于 2.88M 而大于 1.44M)/18(如果 img 尺寸小于 1.44M 而大于 1.2M)/15(如果 img 尺寸小于 1.2M 而大于 0.72M)/9(如果 img 尺寸小于 0.72M)。对于硬盘 img 文件,如果让 GRUB for DOS 来自动挑选,则总是选择 63个扇区、256 个磁头。

    drive_map_slot 结构:

    字节:FROM_DRIVE——把哪个 BIOS 磁盘号映射到另外一个磁盘号或者映射到另一个 img 文件?
    字节:TO_DRIVE——被映射到的磁盘号。BIOS 磁盘号:0,1,……表示软盘,0x80,0x81,……表示硬盘。
    字节:MAX_HEAD——最大磁头号。取值范围:0 至 255。
    字节:MAX_SECTOR——最大扇区号。取值范围:1 至 63。
    4字节:START_SECTOR——被映射到的 img 文件的起始扇区号。
    4字节:SECTOR_COUNT——被映射到的 img 文件的扇区总数。必须是偶数。

    当 MAX_SECTOR 的取值为 0 时,表示禁止常规磁盘读写中断(例如int13/AH=02)【map 的命令行参数 --disable-chs-mode】。MAX_SECTOR 的最高两位还有用。最高位为 1 表示只读操作【map 的命令行参数 --read-only 或者 --fake-write】,写入仿真软盘的扇区数据统统丢弃。次高位为 1 表示禁止扩展磁盘读写中断(例如 int13/AH=42H)【map 的命令行参数 --disable-lba-mode】。SECTOR_COUNT 是总扇区数。这个数目必须是偶数(当它为奇数时,处在末尾的一个扇区不参加仿真)。因此,SECTOR_COUNT 的最低位还有用。当该位为 1 而且 MAX_SECTOR 的最高位也为 1 时,表示“伪装写入扇区”操作【map 的命令行参数 --fake-write】。“伪装写”和“只读”是类似的,区别在于,“只读”在扔掉写入的扇区之后,告诉调用者程序说:“该盘写保护,不能写入”;而“伪装写”在扔掉写入的扇区之后,欺骗调用者程序说:“成功写入,请继续吧。”【我们有时候确实是需要这个功能的】。当 START_SECTOR 为 0 并且 SECTOR_COUNT 的高 31 位都为 0 时,表示用整个磁盘(而不是其中的一部分扇区段)来仿真【SECTOR_COUNT 的最低位表示“伪装写”】,这样仿真的效率要高一些【GNU GRUB 原来的仿真就是这样的,代码也很简单】。

    map 命令还有两个命令行参数:

    --heads-per-cylinder=NUM_HEADS

    --sectors-per-track=NUM_SECTORS

    NUM_HEADS 的取值范围是 1 至 256;NUM_SECTORS 的取值范围是 1 至 63。但它们也允许是 0,这表示用户允许 grub for dos 任意挑选一个合适的值。如果 map 的命令行没有指定 --heads-per-cylinder 以及 --sectors-per-track,那么,当 grub for dos 不能从 img 文件的第一扇区探测到一个合适的值时,会给出错误信息并拒绝仿真。

    最后在这里指出一点限制。GRUB for DOS 扩展了原来 GNU GRUB 的仿真。GNU GRUB 原来的仿真是一种简单的仿真,只能仿真整个磁盘,不能用一部分扇区来仿真。新的仿真可以用磁盘上的部分扇区序列来仿真,但是,这个功能的实现,利用了新型 BIOS 的逻辑块寻址(LBA)功能,也就是磁盘扩展读写功能。这对于老旧的 BIOS 是无效的。所以,老的 BIOS 无法利用新的仿真功能。但 GRUB for DOS 兼容 GNU GRUB 的仿真,所以,老的 BIOS 仍然可以用 GRUB for DOS 的“用整个磁盘来仿真”的功能,这是原来 GNU GRUB 本来就有的功能,其用法在 grub for dos 中完全没有变化。

    已经有很多人表明对于用 ISO 仿真 CDROM,以及从 ISO 文件来引导机器这类功能的热切期望了。这个功能的实现,存在一定的技术难度(上述磁盘仿真根本没有技术障碍,所有的标准都是现成的,简单的拿来主义就行)。大约需要一两年的时间。有兴趣的人可以在 wengier 的 DOS 论坛 讨论这个问题(最好直接和 wengier 谈;我和 wengier 的相互交流比较多)。如果您有好主意,说不定这个进度会大大加快的。

    --------------------------------------------------------------------------------



    一个很有用的链接地址:


    1.7M 的急救软盘映象倒是容易找到,但 GRUB_for_DOS 目前还没有支持 非1.44M 的软盘映象。所以,找一个 1.44M 的急救盘映像,是很必要的。太好了!下面的 ramf-120.img.bin 软盘映象适用于任意 Linux 系统(不仅仅是某一个发行版的),相关网页在这里:

    http://www.linux.org/docs/ldp/howto/Bootdisk-HOWTO/premade.html
    http://www.tux.org/pub/people/kent-robotti/looplinux/rip/index.html

    以下链接地址就是这个 1.44M 的文件, 可以直接用 dd 命令写入一张空软盘上,也可以用 grub.exe 直接从硬盘启动该软盘映像文件上的 LINUX 急救系统:

    http://www.tux.org/pub/people/kent-robotti/looplinux/rip/ramf-120.img.bin
    http://www.ibiblio.org/pub/Linux/system/recovery/ramf-120.img.bin

    --------------------------------------------------------------------------------



    不点提供的其它文章:

    DOS下用GRUB.EXE修复启动故障及用ISO文件从硬盘直接安装Linux的方法

    数百种 Windows 软件的免费替代品列表
    --------------------------------------------------------------------------------


    同时启用三个 iso 文件,不解包方便安装 Mandrake


    --------------------------------------------------------------------------------


    LG 光驱会被损坏!万勿安装 Mandrake 9.2!!


    根据官方网站的报导:

    http://www.mandrakelinux.com/en/

    LG 光驱会被物理损坏的!!如果你有 LG 光驱,千万别装 Mandrake 9.2!!

    即使你用纯硬盘的安装,也会损坏 LG 光驱!!


    --------------------------------------------------------------------------------

    重要通知: 已经升级 MandrakeISOinstall-9.2.tar,不用修改 iso 文件名即可实施安装了。如果你用的是以前下载的 MandrakeISOinstall-9.2.tar 文件,当然还需要按照下面的说明修改 iso 文件名。

    --------------------------------------------------------------------------------

    重要说明!Mandrake 9.2 正式版 ISO 文件的名字有所变化,这可能使得下面的补丁失效。解决方法是:把这些 ISO 文件更名为:

    MandrakeLinux-9.2-CD1.i586.iso
    MandrakeLinux-9.2-CD2.i586.iso
    MandrakeLinux-9.2-CD3.i586.iso

    或者

    Mandrake9.2-cd1.i586.iso
    Mandrake9.2-cd2.i586.iso
    Mandrake9.2-cd3.i586.iso
    --------------------------------------------------------------------------------


    同时启用三个 ISO 文件,不解包安装 mandrake,无须切换控制台(不再用手工输入命令)。在这里下载:

    ftp://ftp.cosoft.org.cn/incoming/MandrakeISOinstall-9.2.tar(在此说明,解包后有很多文件,但你可以不用那些多余的文件,而只用里面的 hd.img 文件。这个 hd.img 文件已经是打过补丁的了。用它制作软盘,引导机器就行,别的一概都不需要了。)

    或者进入目录看看在不在(该目录下将来会有其它 Mandrake 版本的 ISO 安装补丁):

    ftp://ftp.cosoft.org.cn/incoming/

    解压后,用 hd.img 文件即可。这个 hd.img 适合于 9.2 正式版。你可以用 grub_for_dos 直接启动硬盘上的 hd.img 文件;也可以用 vmlinuz 和 hd.rdz 来启动安装程序(注意看 hd.img 里面的 syslinux.cfg 文件)。这两种办法都是不用软盘的纯硬盘安装。

    如果想在以后的发行版中使用,也有办法:把 sh 和 mix_ISOs 这两个文件拷贝到 hd.rdz 里面的 /tmp 目录就可以了。需要等待发行版发布出来之后才能生成新的 hd.rdz 文件。

    但要强调:改动不多,仅仅增加上述两个程序文件(sh 和 mix_ISOs)而已,别的都不改动。而且这两个程序文件是固定的,不随 mandrake 版本的变化而变化。

    --------------------------------------------------------------------------------


    还要注意有两点限制:

    1。三个 iso 文件必须处在某个分区的“根目录”下,不能处在其它子目录下,而且根目录下不要有多余的 ISO 文件,例如,不要有以前其它版本的 Mandrake iso 文件。

    2。文件名必须是 mandrake 提供的 iso 文件的原始名字,不应当改变文件名(大小写也不要改动)。

    好了,尽情玩耍吧 :-) 程序经过多日调试,应当不会出现失败的。

    安装程序照旧会询问你第一张 ISO 的分区位置和文件名,你仍然需要敲入 CD1 的 ISO 名字全称。在这之后,程序自动在那个分区的根目录下找到其他几个 ISO 文件,并自动 mount 上。这你都不用管,继续安装你会发现,所有三张 ISO 的软件包都在。

    --------------------------------------------------------------------------------


    补充说明(仅对有兴趣的开发者有用,否则不需要):

    解开 hd.rdz 的命令:

    gunzip -c hd.rdz > hd.rd

    或者等价地:

    gzip -cd hd.rdz > hd.rd

    压缩 hd.rd 的命令是:

    gzip -9 -c hd.rd > hd.rdz


    --------------------------------------------------------------------------------

    再补充:两种硬盘安装方法的 grub 命令集(采用任何一种都可以的,随便你喜欢哪个方法):

    1。用 hd.img 安装,这需要用到 grub for dos 的软盘仿真功能:

    grub> map (hd0,0)/hd.img (fd0)
    grub> chainloader (hd0,0)/hd.img
    grub> rootnoverify (fd0)
    grub> boot

    2。用 vmlinuz 和 hd.rdz 两个文件来安装(无需使用 grub for dos,用 GNU 原来的 GRUB 都管用):

    grub> kernel (hd0,0)/vmlinuz ramdisk_size=128000 root=/dev/ram3 automatic=method:disk acpi=ht vga=788
    grub> initrd (hd0,0)/hd.rdz
    grub> boot

    注意 kernel 一行很长,不要截断成两行。还要注意上述命令都假定这些文件位于 (hd0,0) 的根目录,如果你的不同,当然要作适当的修改。上述命令中所涉及到的那些文件,都在 MandrakeISOinstall-9.2.tar 这个软件包中。

    发布人:netbull 来自:Linux伊甸园