0

我正在为具有多个分区的磁盘创建动态 vhd。

涉及的步骤是

  1. 首先,我通过创建页眉和页脚并计算 bat(块分配表)大小来创建 VHD。

  2. 然后我使用 win32 API 获取磁盘大小和分区详细信息

  3. 我拍摄卷的快照

  4. 我读取父磁盘的 mbr 并覆盖扇区偏移量,然后将具有多个分区的 mbr 写入 VHD。

  5. 现在对于每个卷影副本,我读取快照并写入 VHD 文件

  6. 此过程成功完成,然后我在 diskmgmt.msc 中打开 vhd。它显示了两个分区,我可以看到这些分区中的数据。

  7. 现在我将此 vhd 复制到 hyper V 机器,然后创建一个新 vm 并将此 vhd 添加到该机器。

  8. 当它启动时,它给我一个错误“磁盘读取错误”,但是当我将此 vhd 添加到现有操作系统并在引导加载程序中添加引导条目时,它可以正常引导。

我不知道出了什么问题。如果有人来给我一些指示。

这是编写mbr的代码

/* Stream out the first data block which contains only the MBR */

   BYTE zerosector[512] = {0};

  zerosector[0] = 0x80;

  assert(0 != WriteFile(hFile, zerosector, 512, &nWritten, NULL));  /* here goes the  first block's block bitmap */

  zerosector[0] = 0x00;


 unint16 mcount = 0;
 unint64 indexOffset = 0;

 memcpy(&mbr,mbrbuff,512);
 for(vector<PartOffset*>::iterator pTemp = pPart.begin();pTemp!=pPart.end();pTemp++)
 {

   mbr.partition[mcount].type          = 0x07;
   mbr.partition[mcount].start_sector  = 4096 + indexOffset ;
   mbr.signature                       = 0xAA55;
   mbr.partition[mcount].total_sectors =  (((*pTemp)->total_sectors)) + 1 ; 
   indexOffset +=  ((((*pTemp)->total_sectors))) + 1;
   //if(mcount==0)
     //  indexOffset +=  ((((*pTemp)->start_sector)/512) );
   mcount++;

 }

谢谢

4

1 回答 1

0

DiscUtils提供了访问和写入与 Hyper-V 兼容的 .VHD 文件的参考

看看它如何从DiskFactory开始构建 VHD

于 2013-12-09T15:39:29.027 回答