分享

vfloppy——让软驱下岗

 pengyan 2006-12-13

vfloppy——让软驱下岗

经常有人提出这样或者类似的问题“我光驱、软驱都坏了,但想在DOS下重装Windows 2000,有什么方法吗?”或者也有人有这样的问题“我只安装了一个Windows 2000/XP,并且C盘是NTFS分区,怎么才能从硬盘直接启动到DOS下呢?”诸如此类的问题,在Windows 2000/XP/2003时代,不少朋友都会遇到。

身处OS Loader时代

现在大家的PC机上一般都安装的是Windows 2000、Windows XP操作系统,并使用OS Loader作为启动管理器。OS Loader这个启动管理器的优点是直接安装在分区的引导扇区上,不影响主引导扇区(Main Boot Record,就是我们常说的MBR),因此不会被误判为病毒。此外,OS Loader可以直接安装在NTFS,而且由于是Windows自带的,用起来比较方便,所以大部分Windows的用户都直接使用OS Loader来实现多系统引导(不少人除Windows 2000/XP系统外没装其他系统)。图一:启动菜单由Boot.ini控制图注 OS Loader的启动菜单由Boot.ini控制

Microsoft前段时间曾经说过,不再准备支持软驱,而现状是目前比较新的PC机一般都取消了软驱,比较老的PC机的软驱很可能也坏了(如我的老机器),而且软盘也容易损毁,所以需要软驱的机会不太多了。由于软盘在PC历史上发挥过比较大的作用,在某些情况下,我们还必须通过它来完成某些工作,比如在没有CDROM的机器上安装新的操作系统、杀毒,或者测试需要启动到DOS下来完成一些数据的备份、维护工作(毕竟不是我们需要的所有软件都已经完美支持了WinPE环境)。

综上两种情形,我们可以通过OS Loader来加载一些需要软盘来进行的启动盘。为什么说要加载其他操作系统的启动盘,而不是启动文件?这是因为OS Loader只能在FAT和NTFS分区上运行,而在软盘上运行的系统大多数又不支持NTFS分区。所以我们可以把软盘做成镜像,然后通过OS Loader来加载镜像文件。

目前OS Loader只支持加载引导扇区或者引导扇区的镜像文件,而不支持直接加载软盘镜像,所以本文需要介绍的vFloppy就应运而生了。

类似的工具

那么有没有其他的引导程序可以完成类似的工作呢?
答案是肯定的,不但有,而且还不少,不过它们的功能不尽相同。

  • 名称及相关网站
  • 支持操作系统
  • 支持文件系统
LILO
Linux
不能虚拟软盘
Diskemu
光盘运行
ISO9660
BootScriptor
光盘运行
ISO9660
ISOLinux
光盘运行
ISO9660
SysLinux
FAT1.6/FAT1.2
GRUB
Linux
通过sysLinux 的Memdisk可以完成类似功能,但memdisk需要镜像文件在硬盘上连续存放

OS Loader的特点

MS的OS Loader除了可以加载WinNT/Win2000/WinXP等等,还可以运行以前安装的Windows98,Windows 98 启动的过程是:

  1. BIOS自检后,加载硬盘的主引导纪录MBR,运行MBR的代码。
  2. MBR的代码检测分区表,然后加载活动分区的引导纪录——DBR,运行DBR的代码。
  3. Windows 98的DBR的代码查找IO.sys,启动Windows 98。

硬盘最基本的组成部分是由坚硬金属材料制成的涂以磁性介质的盘片,盘片被分成许多扇形的区域,每个区域叫一个扇区,大多数情况下每扇区是512字节,老式硬盘使用磁道(或柱面)和磁头数,以及扇区作为硬盘结构的基本参数,目前的硬盘直接使用扇区号来访问硬盘,128G以下的硬盘使用32位整数作为扇区号,而128G以上的硬盘使用48位整数作为扇区号。

MBR(Main Boot Record),即为主引导记录区,位于整个硬盘的第一个扇区,在总共512字节的主引导扇区中,MBR只占用了其中的446个字节另外的64个字节交给了DPT(Disk Partition Table硬盘分区表),主要这两部分构成了硬盘的主引导扇区。DBR(Dos Boot Record)是操作系统引导记录区。它位于硬盘的每个分区的第一个扇区,是操作系统可以直接访问的第一个扇区,它一般包括一个位于该分区的操作系统的引导程序和相关的分区参数记录表。图二:硬盘引导系统访问这些扇区图注:硬盘引导系统访问这些扇区

OS Loader加载Windows 98的原理是,安装Win2000的时候,保存了Windows 98的引导纪录DBR文件——BootSect.dos,然后安装Win2000自己的引导记录DBR,

用OS Loader启动Windows 98的过程是:

  1. BIOS自检后,加载硬盘的主引导纪录——MBR,运行MBR的代码。
  2. MBR的代码检测分区表,然后加载活动分区的引导纪录——DBR,运行DBR的代码,该代码是OS Loader的代码。
  3. OS Loader的DBR的代码加载相关的程序(主要是ntldr和ntdect.com文件),分析boot.ini文件,显示启动菜单,等待接受用户的命令——启动相应的操作系统的启动文件。
  4. 如果用户选择Win98,那么OS Loader的DBR的代码加载保存下来的Windows98的DBR文件——BootSect.dos,运行该DBR的代码。
  5. Windows 98的DBR的代码查找IO.sys,启动Windows 98。

从上面2个过程的对比可以看出,OS Loader在加载Windows98的时候,仅仅是一个传递引导控制的过程,把计算机启动代码运行过程传递到一个文件(BootSect.dos)中,然后由这个文件继续引导操作系统。

从上面的分析过程,可以看出,OS Loader可以加载一个引导文件,然后把控制转移到该引导文件上,平时常见的用OS Loader加载Linux就是类似的原理。

虚拟软盘的使用

vFloppy 1.0由3个文件组成,vfloppy.exe、vLoader.bin和vMemdsk.bin。其中vfloppy.exe是Win32的控制台程序,vLoader.bin是一个512字节的引导代码(由OS Loader来选择加载),vMemdsk.bin则用来在内存中虚拟一个软驱,从而加载并运行软盘镜像。最新的1.5版本,不包括vLoader.bin和vMemdsk.bin,而由主程序vFloppy执行时自动生成和软盘镜像文件同前缀的两个文件来完成同样功能,另外vFloppy 1.5还提供了在DOS下支持NTFS分区的软盘镜像。

另外还需要一个软盘镜像文件,vFloppy目前支持1.44MB或者2.88MB大小的镜像文件,该镜像文件必须可以启动(就是把这个文件写进软盘后,可以从该软盘启动计算机)。我们可以用WinImage来制作软盘镜像。

  1. 安装vFloppy

    假设 vFloppy 放在c:\boot,c盘可以是FAT 16/FAT32和NTFS 分区格式。

    • 如果你手头的是vFloppy 1.0,则可以运行:
      vfloppy -1 vLoader.bin -2 vMemdsk.bin -i anyos.img其中的anyos.img表示你需要在OS Loader下引导的软盘镜像文件。然后在c:\boot.ini中加入一项:
      C:\boot\vLoader.bin ="vFloppy Virtual Floppy Disk "

    • 对于vFloppy 1.5来说,由于重新编写了内核,并增加了GUI引导界面。所以你需要打开vFloppy,指定软盘镜像文件所在的位置即可。图三:vFloppy 1.5安装更简单图注 vFloppy 1.5安装更简单

      重新启动系统后,在OS Loader的菜单上选择:vFloppy Virtual Floppy Disk就会加载 c:\boot\anyos.img 这个镜像,并启动系统——就好像从一个软驱中启动一样。

  2. vFloppy三大优点

    从上面的介绍和操作,我们可以看出,使用vFloppy虚拟软驱启动,至少有三大优点:

    1. 安全。虚拟软盘是只读的,不向引导区写代码,不会破坏系统,更不会破坏MBR。
    2. 方便。可以随时重新启动系统,进入别的操作系统,如DOS 6.22、DOS 7 、Linux和其他系统环境,而不需要独立的分区,更不用管放置启动镜像盘的分区格式是NTFS还是FAT32。
    3. 完全用内存虚拟软盘,加载后可以格式化存放原来的引导镜像的硬盘,或者进行Ghost操作。图四:虚拟软盘让你从NTFS分区启动DOS图注 虚拟软盘让你从NTFS分区启动DOS
  3. 注意事项

    在我们使用vFloppy虚拟软盘引导系统时,还需要注意以下问题。

    1. 如果C:用的NTFS,并且使用了磁盘压缩的请确保C:\Boot目录及其下面的文件没有被压缩。
    2. 运行vFloppy,只是根据你的硬盘情况生成相应的引导文件vLoader.bin和虚拟软盘vMemdsk.bin文件,绝对不会重写MBR。
    3. vMemdsk.bin定位磁盘镜像anyos.img时是直接通过该文件所在的磁盘扇区,而不是通过文件系统来进行的,从而实现对NTFS、FAT32和FAT的支持。即使删除了该文件,只要所在扇区的数据还没有被覆盖,或许仍然能够启动该磁盘镜像,但进行磁盘整理后可能造成无法启动,只需要重新运行一下vfloppy即可。
    4. vfloppy.exe 的参数可以是绝对路径,如:
      vfloppy -1 c:\Boot\vLoader.bin -2 c:\Boot\vMemdsk.bin -i c:\img\dos.img

应用实例

vFloppy的优点介绍了这么多。我们还是通过实例来说明它如何帮我们完成那些很实用的功能。

Ghost

用Ghost 恢复系统的时候,需要一个软盘或者光盘来启动,而使用vFloppy可以在仅有硬盘启动的时候,用备份的ghost文件覆盖当前的系统分区。

Knoppix

vFloppy一个用途就是可以把在光盘上运行的Knoppix 系统方便的放到硬盘上,而不需要对系统重新分区.只需要把Knoppix光盘上的文件直接拷贝到硬盘,然后让OS Loader 通过虚拟软盘的方式加载Knoppix的启动镜像文件就可以了.

如果CD-ROM的盘符是E,我们想在D盘上运行KNOPIX,则

cd E:KNOPPIX
mkdir D:KNOPPIX
copy KNOPPIX D:KNOPPIX

从OS Loader 加载的虚拟软盘启动后,KNOPPIX会自动在硬盘上扫描KNOPPIX文件夹和KNOPPIX文件。

这样既可以享受Knoppix的便捷,很方便的更新Knoppix到最新版本,又不需要刻录光盘,而且光盘运行Knoppix会比硬盘慢。

虚拟软盘的原理

前面我们介绍了vFloppy是如何工作的。针对有兴趣的朋友,笔者愿意分享我开发的心得和源代码。

同前面的过程类似,就是生成一个引导扇区文件DBR,让OS Loader加载并运行,然后这个DBR文件加载硬盘上的磁盘镜像文件anyos.img,最后把控制权引导到该镜像文件。

vFloppy执行如下语句:
vFloppy -1 vLoader.bin -2 vMemdsk.bin -i anyos.img

实际完成了两个操作:

  1. vfloppy 计算anyos.img镜像文件在磁盘上所占用的绝对扇区地址,把扇区地址写入到vMemdsk.bin中的预定位置。这样在引导系统的时候,就不需要操作系统的支持而读取anyos.img镜像文件。
  2. vfloppy 计算vMemdsk.bin文件在磁盘上所占用的绝对扇区地址,然后把扇区地址写入到vMemdsk.bin和vLoader.bin中的预定位置。

用OS Loader启动vfloppy的过程

用OS Loader引导vFloppy虚拟的软盘镜像,其实和OS Loader下引导Windows 98类似。

  1. BIOS自检后,加载并运行硬盘的主引导纪录——MBR。
  2. MBR中的相应代码检测分区表,然后加载活动分区的引导纪录——DBR。本例中DBR就是OS Loader。
  3. OS Loader加载相关的程序,然后显示启动菜单,接受用户的命令(选择启动vFloppy或者其他)。
  4. 如果选择vFloppy,则控制权转给vFloppy的启动代码vLoader.bin。
  5. vLoader.bin根据执行vFloppy时记录的vMemdsk.bin文件的扇区地址,加载vMemdsk.bin并将转移转给它。
  6. vMemdsk.bin根据执行vFloppy时记录的anyos.img文件的扇区地址,读入anyos.img文件。
  7. vMemdsk.bin把对软驱的访问重定向到内存,也就是用内存模拟一个软驱。
  8. vMemdsk.bin的代码加载模拟软驱的引导扇区,从而从虚拟软驱引导系统。

和PartitionMagic与 Drive Image自带的虚拟软盘对比

如果用过PartitionMagic的人就知道, 它运行时如果是对非系统分区的调整则不需要重新启动就可以进行,而对系统分区进行调整(如扩张或者收缩系统分区),会要求重新启动,并且重启之后直接启动到DOS进行调整分区的工作的,不会出现OS Loader的启动菜单。 WinNT内核系统如Win2000/WinXP等同样如此。据分析, PartitionMagic有一个程序能将系统启动到虚拟软盘中,这种虚拟软盘用的实际就是IMG格式的未压缩的映像,可以使用WinImage来编辑,Drive Image同样带有类似的虚拟软盘。

那么为什么我不直接使用PartitionMagic的虚拟软盘呢?这是因为:

  1. 安全。PartitionMagic 的虚拟软盘的引导程序是放在MBR中的,并且占据磁盘开始的3个扇区,也就是说vfloppy.sys安装的时候,需要向从MBR开始的3个扇区写数据,这样如果此时发生错误,将可能使得系统无法引导。
  2. 冲突。由于“向从MBR开始的3个扇区写数据”,有可能和其他的启动管理程序冲突,如Smart Boot Manager也需要这些扇区空间,PartitionMagic的虚拟软盘的安装代码将会覆盖它,并且是永久覆盖,不会恢复。
  3. 不灵活。PartitionMagic 的虚拟软盘执行前,将会恢复主引导记录MBR,从而在系统启动的时候,我们无法选择需要启动的操作系统。

虚拟软盘的源代码

笔者在参考了GRUB 0.93的源代码和PartitionMagic 的vFloppy.sys 的反汇编代码后,实现了一个类似PartitionMagic 的vFloppy.sys的虚拟软盘系统。

  1. 系统构成

    该系统主要包括3个模块:

    1. 引导扇区文件vLoader.bin

      在vfloppy\loader目录的vloader.asm中,作用就是根据vFloppy.exe记录在该文件内部的关于vMemdsk.bin文件的扇区列表,加载vMemdsk.bin,并执行。这个模块的代码必须限制在512个字节以内。由于512字节大小的限制,引导扇区文件仅仅记录了vMemdsk.bin文件第一个扇区的地址,然后通过vMemdsk.bin文件第一个扇区继续加载vMemdsk.bin的其他扇区。

    2. 模拟软驱程序vMemdsk.bin

      在vFloppy\loader目录的vmemdsk_start.asm和vFloppy.sys中。其中vFloppy.sys文件来自PartitionMagic 7的虚拟软盘的文件,vmemdsk_start.bin则继续vLoader的工作,并加载vFloppy.sys。
      vMemdsk.bin=vmemdsk_start.bin+vFloppy.sys

      vFloppy.sys负责读取软盘镜像文件,并虚拟一个软驱。

    3. 主程序vFloppy

      由vfloppy\loader目录的install.c、fat_blocklist.c、NTFS_blocklist.c、blocklist.c和Win32.c 等文件组成。笔者从GRUB中中抽取了部分读取NTFS 和FAT分区的代码,所以很多头文件都在GRUB的目录下面。

      vFloppy.exe除了计算镜像文件的扇区列表外,还要给PartitionMagic的Vfloppy.sys传递镜像文件的参数。相关参数这里就不再详细说明,可以到我们的网站下载源代码及相关说明说明。

  2. 编译

    本文提供的源代码可用Mingw32Nasmw编译。附上的文件包括了打了ISO9660和NTFS补丁的GRUB0.93以及vfloppy的所有源代码。

    编译的方法很简单,执行进入vfloppy目录,执行loader目录的mkmemdsk.bat文件,就完成了loader的编译,然后在vfloppy目录执行Mingw32的make编译vfloppy的win32部分的可执行代码。

vfloppy展望

  1. 提供对Win9x和DOS的支持。源代码中包括了一个不是很完善的DOS版本,但仅仅支持FAT分区。
  2. 重写vMemdsk.bin核心代码,使其支持1.28G以上的硬盘(需要BIOS的支持),支持大的镜像文件,支持ISO文件,支持磁盘切换,支持内存写盘,支持保存内存盘的修改。如果一切顺利的话,可以在2004年底之前完成。
  3. 直接处理文件系统,类似于一个精简版本的GRUB。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多