在VMware中安装Minix

类别:软件工程 点击:0 评论:0 推荐:

《不用一张软盘在VMware中安装Minix》

随书光盘中提供了一个dos程序FDVOL,用来将
i386\ROOT
i386\USR
i386\USR.TAZ
SYS.TAZ
CMD.TAZ
这五个文件写到九张1.44兆的软盘上,然后用这九张软盘(安装盘)来安装Minix。

就像下面这样

fdvol 1440 A: i386\ROOT i386\USR    - Combined ROOT+USR floppy
fdvol 1440 A: i386\USR.TAZ          - Base system on 3 floppies
fdvol 1440 A: SYS.TAZ               - System sources on 2 floppies
fdvol 1440 A: CMD.TAZ               - Commands sources on 3 floppies
这在readme中都有说明,不多说了。

其实我们不需要一张软盘就可以安装Minix了(恐怕你也没有这么多软盘),因为在VMware中可以使用软盘镜像来代替真的软盘,

做法如下:

在VMware中创建新的虚拟机,选择Custom

Guest operating system选择Other

内存大小设为16兆

选择Do not use a network connection

磁盘大小设为1G并选择Create a new virtual disk

现在虚拟机创建完了,该制作软盘镜像了。

i386\ROOT和i386\USR这两个文件直接用copy命令连接成一个文件就行了,
随便起个名字(就叫rootandusr吧)
copy /b root + usr rootandusr

i386\USR.TAZ和SYS.TAZ以及CMD.TAZ处理起来稍微麻烦点

为此我编了两个小程序(源代码在后边)

knife用来将文件按照指定的大小分割为若干个文件,第一个参数是待分割的文件的名字,
第二个参数是分割的大小,第三个参数是分割产生的文件的基本名字。
padding用来在文件后面补零,一直把它变成一张软盘的大小(1474560字节)

首先执行
knife USR.TAZ 1474560 myusr
产生了三个文件
myusr000
myusr001
myusr002
大小分别为
1474560
1474560
776267
最后一个也就是myusr002是个小尾巴,我们用padding把它也变成1474560大小,如下
padding myusr002
现在好了,三个文件的大小都是1474560了
至于为什么是1474560,因为一张软盘2个面,每个面80个磁道,每个磁道18个扇区,每个扇区512字节,
一乘就知道了。

然后再如法炮制SYS.TAZ和CMD.TAZ
最后就有了如下九个文件:

rootandusr

myusr000
myusr001
myusr002

mysys000
mysys001

mycmd000
mycmd001
mycmd002

这就是九张安装盘的镜像了。

然后我们在VMware中把软盘设置为使用镜像文件就行了

当安装程序提示换盘的时候只要在Devices菜单中选择相应的镜像文件就行了。

应该很顺利吧???

下面是用到的两个小程序的源代码,用vc6建一个控制台工程即可编译。

// knife的源代码
//-----------------------------
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void main(int argc, char *argv[])
{
 
 if (argc == 1)
 {
  puts("File Knife 0.01   Copyright  08/15/2001  Du Yan Ning");
  puts("Sytax:  KNIFE  [ <source file name> <target file size> <target file base name> ]");
  return;
 }

 if (argc != 4)
 {
  puts("Invalid parameter numbers!");
  return;
 }

 char source[256], target[256];
 strcpy(source, argv[1]);

 int size;
 size = atoi(argv[2]);

 FILE *sfp, *tfp;

 sfp = fopen(source, "rb");
 if (sfp == 0)
 {
  printf("Can't open source file: %s", source);
  return;
 }


 int counter = 0;
 char asciic[6];

 bool complete = false;
 bool fileopen = false;

 while (!complete)
 {

  Sleep(20);
  switch (counter % 4)
  {
  case 0:
   putchar('@');
   break;
  case 1:
   putchar('#');
   break;
  case 2:
   putchar('$');
   break;
  case 3:
   putchar('%');
   break;
  }
  putchar('\b');


  {
   strcpy(target, argv[3]);
   sprintf(asciic, "%03d", counter);
   strcat(target, asciic);
  }

  counter++;

  for (int i = 0; i < size; i++)
  {

   int c;

   c = getc(sfp);
   
   if (c == EOF)
   {
    complete = true;
    break;
   }

   if (i == 0)
   {
    tfp = fopen(target, "wb");
    fileopen = true;
   }
   putc(c, tfp);

  }

  if (fileopen == true)
  {
   fclose(tfp);
   fileopen = false;
  }

 } // while (!complete)

 fclose(sfp);


 puts("\nconvertion complete!");
}

 

 

 

// padding的源代码
//-----------------------------
/* CHSIZE.C: This program uses _filelength to report the size
* of a file before and after modifying it with _chsize.
*/

#include <io.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>

void main(int argc, char* argv[])
{
 if (argc != 2)
 {
  printf("padding [<filename>]\n");
  return;
 }

 int fh, result;
 
 /* Open a file */
 if( (fh = _open( argv[1], _O_RDWR | _O_CREAT, _S_IREAD
  | _S_IWRITE ))  != -1 )
 {
  long originalLen = _filelength(fh);
  printf( "File length before: %ld\n", originalLen);

  long eventualLen = 512;
  //while (eventualLen < originalLen)
  //{
  // eventualLen += 512;
  //}
  eventualLen = 1474560;

  if((result = _chsize(fh, eventualLen)) == 0)
   printf( "Size successfully changed\n" );
  else
   printf( "Problem in changing the size\n" );
  printf( "File length after:  %ld\n", _filelength( fh ) );
  _close( fh );
 }
}

本文地址:http://com.8s8s.com/it/it36682.htm