 |
教程: Linux教程-软件教程-GRUB for DOS 磁盘仿真命令简介 |
 |
|
|
| 教程: Linux教程-软件教程-GRUB for DOS 磁盘仿真命令简介 |
|
|
|
|
法。
1。把硬盘上某个盘符(例如 C:)仿真为 A:,并从 C: 盘引导 win98:
map --read-only (hd0,0) 1 (fd0)
chainloader (hd0,0) 1
rootnoverify (hd0)
boot
上述 (hd0,0) 是 Win98 下的 C: 盘。进入 Win98 后可以发现,现在 A: 盘的内容跟 C: 盘完全一样。这时,如果随意在 A: 盘上删除文件,会导致 C: 盘也删除该文件,因而有可能引起故障(例如死机)。
在 map 命令中,(hdm,n) 1 被解释为代表整个 (hdm,n) 分区,而不仅仅是代表分区的第一个扇区。相比之下,在其它地方,(hdm,n) 1 仍然只代表分区的第一扇区。
2。把硬盘上某个盘符(例如 C:)仿真为 A:,并从 A: 盘引导 win98:
map --read-only (hd0,0) 1 (fd0)
map --hook
chainloader (fd0) 1
rootnoverify (fd0)
boot
此处需要用 map --hook 命令激活 A: 盘的就地仿真。如果没有 map --hook 命令,那么后续的 chainloader (fd0) 1 命令就要寻找真实软驱的软盘介质上的内容,而不是我们想要的虚拟软盘上的内容。
最后一条 rootnoverify (fd0) 告诉引导程序说,我们是从软盘启动机器的。
3。把硬盘上某个 img 文件仿真为 A:,并从 C: 盘引导 win98
map --read-only (hd0,0)/file.img (fd0)
chainloader (hd0,0) 1
rootnoverify (hd0)
boot
4。把硬盘上某个软盘 img 文件仿真为 A:,并用该 img 映象里面的文件 dos.img 来引导机器:
map --read-only (hd0,0)/file.img (fd0)
map --hook
chainloader (fd0)/dos.img
rootnoverify (fd0)
boot
此处,file.img 是 C: 盘上的一个软盘映像文件,在这个映象文件中,包含了一个叫做 dos.img 的文件。如果不用 map --hook 命令(该命令启用了就地仿真功能),则无法在后续的 grub 命令行中访问 dos.img 文件。这个例子只是说明 map --hook 命令的作用,我们通常是不会用到这个例子中的方法的。
上述命令中,软盘可以是任意的规格,任意的大小。
下面举一个硬盘仿真的例子,但是最好不要启动 win98,而应当只限于启动 DOS:
map --read-only (hd2,6) 1 (hd0)
map --hook
chainloader (hd0,0) 1
rootnoverify (hd0)
boot
这里,(hd2,6) 1 是第三块硬盘上的某个逻辑 DOS 分区。“map (hd2,6) 1 (hd0)”命令将扩展 DOS 分区仿真为 BIOS 的 0x80 号硬盘。激活就地仿真【map --hook】之后,“chainloader (hd0,0) 1”中的 (hd0,0) 1 就是仿真之后的虚拟 0x80 硬盘分区,而不是仿真之前的 0x80 号硬盘分区了。【此处的 (hd0,0) 1 实际上就是仿真之前的 (hd2,6) 1】。您应当保证这时在该分区中存在着 DOS,否则引导会失败。如果您不启动 win98,可以不用 --read-only 参数。如果试图启动 win98,通常会引导失败。
因为 MS-DOS 的逻辑分区之前的 63 个扇区处,都存放了一个“扩展分区的分区表”,所以有可能用它来仿真一个硬盘。“扩展分区表”中的引导记录全都是 00 字节。GRUB for DOS 0.2.x 在读取这个分区表的时候,作了一些修改,使得这个表看起来像是一个合法的硬盘主分区表。GRUB for DOS 并不写入该扇区,因为默认的 safeboot 在起作用。这是安全的。在这种情况下不应当加入 --unsafe-boot 选项,因为 win98 会随意写入虚拟磁盘的引导扇区,这将导致该分区表信息的错位,造成扩展分区不可访问的后果【内容还在,只是扩展分区表错误导致不可访问。手动修改扩展分区表可以解决这个问题,但需要计算准确】。
上述硬盘仿真的例子,如果改成下面的方式,这将是失败的:
map --read-only (hd2,6) 1 (hd0)
chainloader (hd2,6) 1
rootnoverify (hd0)
boot
分区 (hd2,6) 的 DOS 引导记录中有一个“隐含扇区”的字段,这个字段必须修改。如果没有 map --hook 命令,该字段不会被正确修改,因而将导致引导失败。修改该字段的程序,是在 int13 的中断处理程序中,所以需要 map --hook 之后再读出该扇区的内容【此时所读出的该扇区内容已经经过恰当修改了】。在 map --hook 之后,应当使用 chainloader (hd0,0) 1 来装入仿真之前的 (hd2,6) 1,直接用 chainloader (hd2,6) 1 是错误的【直接用 chainloader (hd2,6) 1 结果,使得该扇区不能利用 int13 的中断处理程序进行必要的修改,这将导致引导失败】。注意,int13 仅对磁盘 (hd0) 起作用,对 (hd2) 不起作用,这是因为 map --read-only (hd2,6) 1 (hd0) 命令只对 (hd0) 进行了仿真,而对其它磁盘【包括(hd2)】都没有进行仿真。所以,int13 程序会修改 (hd0,0) 1 但不修改 (hd2,6) 1。
又,上述“修改”并不发生在磁盘上,而是发生在内存中。所以,磁盘上的扇区内容不会改变。也就是说,当读取该扇区的时候,要对读出的扇区进行修改,从而保证扇区内容可用;而当写入扇区的时候,由于默认的 safeboot 在起作用,所以,不会有写入的动作,直接返回虚假的“写入成功”的消息。
前面已经解释过了,safeboot 只保护硬盘 MBR 主引导扇区以及硬盘第一个主分区的第一个扇区(通常是 DOS 的引导扇区)——只保护这两个扇区,不保护其它扇区。
GRUB for DOS 0.2.0 还包括了 BOOTGRUB 和 GRLDR 文件【它们叫做“GRUB for NTLDR”】。这两个文件用于从 Windows NT/2000/XP/2003 的引导菜单中直接启动 GRUB。用法是,将 BOOTGRUB 和 GRLDR 拷贝到 Windows NT/2000/XP/2003 的 C: 盘根目录【C:盘根目录下应当有隐藏的 NTLDR 和 BOOT.INI 文件】,然后修改 BOOT.INI 文件,一般是在 BOOT.INI 文件尾部添加类似如下的一行:
C:\BOOTGRUB="启动GRUB"
重新启动机器,选择相应的菜单项就进入 GRUB 了。
安全建议(这是以前写的,现在还保留它,或许这是引起注意的一个好办法):
1。如果您用 GRUB for DOS,请尽量用版本 0.0.x 的,不要用更高的。
2。如果您不用 0.0.x 的,请尽量用版本 0.1.x 的,不要用更高的。
3。如果您不用 0.1.x 的,请尽量用版本 0.2.x 的,不要用更高的。
4。如果您用 0.2.x 的版本,请尽量不要用 map 等磁盘仿真命令。
5。如果您用 0.2.x 的版本,也用了 map 命令,请尽量先在虚拟机中测试运行。
6。版本 0.2.x 在您的虚拟机中测试过了之后,在真实机器中尽量用 --read-only 等参数运行。
7。尽管已经把 map 命令加上了 --read-only 等参数,但也请尽量不要启动 Windows。
8。如果要启动 Windows,请尽量不要把用来仿真的 img 映像安置在 (hd0) 驱动器上。
9。如果启动了 Windows,即便仿真磁盘的映像不在 (hd0) 驱动器上,您也得做好最坏的打算:其一,如果仿真映像被毁,您不要感到出乎意料;其二,如果某个真实磁盘全部被毁,您不要感到难以接受;其三,如果您的所有的、全部的硬盘都报废了,您也不要感到太奇怪。
10。版本 0.2.x 以后的仿真技术是给熟练的电脑玩家作为研究的目的来使用的,不是给普通用户使用的。
11。玩家们最好互相交流经验,研究别人在使用过程中失败的情况,详细阅读说明文档,避免使自己遭受不必要的损失。
在初期的测试中暴露出很多问题,也损坏过很多硬盘,所以在这里特别通报一下,并写出了上述注意事项。
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.2.x 将要对各种规格的软盘映像给以支持。由于硬盘的仿真也很类似,所以,也要对硬盘的 img 给以支持。另外,GRUB for DOS 0.2.x 也要开放写入虚拟磁盘的操作(写入虚拟盘是一种危险的操作,因为实际上我们写入了硬盘的 img 文件中,万一 GRUB for DOS 0.2.x 的仿真程序有 BUG,写入硬盘其它扇区中,可能造成数据毁损、无法启动等严重问题!)。
对软盘规格:需要解决的技术问题是如何恰当地处理三维的几何地址,也就是平常所说的 CHS(C——磁道柱面号;H——磁头号;S——扇区号)。对于真实的软驱(和软盘),都有这些规格的。然而,我们仿真之后的 img 文件,却无法表示这些规格。例如,一个 1.44M 的没有格式化的 img 文件,里面的数据全部是 00,怎么确定其 CHS 值呢?
当 img 文件已经经过 DOS 的格式化时,就用软盘第一扇区的 BPB 表来确定 CHS 值。如果没有经过 DOS 的格式化,或者发现其 BPB 表是错误的,那么就根据 img 文件的大小来确定 CHS 值。如果是标准的(或者常用的)软盘 img 尺寸,如 1.44M,1.2M,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 ?br />
上一页 [1] [2] [3] [4] [5] 下一页
|
|
| 教程录入:admin 责任编辑:admin |
|
|
上一篇教程: 教程: Linux教程-软件教程-能让Linux运行Windows软件的Wine
下一篇教程: 教程: Linux教程-软件教程-kingate代理服务器指南 |
|
|
|
|
|
|
|
| 【字体:小 大】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口】 |
|
|
|
|
|