如何从 Linux 实时系统创建 VHD 磁盘映像?

Fed*_*ico 34 linux vhd dd liveusb disk-image

再一次,我不得不求助于 SuperUser 的专家,因为我的其他来源(主要是 Google ;-))并没有证明很有帮助......

所以基本上,我想创建一个物理磁盘的 VHD 映像,以便存档/访问/甚至可能安装在虚拟机中。现在,网上有很多关于如何做到这一点的文章和教程,但没有一个完全符合我想要达到的条件:

  • 我希望目标文件VHD 映像,因为 Windows 7 可以本地安装它,甚至通过网络和许多其他程序可以使用它(VirtualBox,...)
  • 我正在尝试映像的磁盘包含 Windows XP 安装,因此理论上,我可以使用该disk2vhd实用程序,但我想找到一个不需要启动该 Windows XP安装的解决方案(即保持磁盘只读)
  • 因此,我正在寻找一种涉及某种实时系统(从 USB stic 或网络运行)的解决方案

但是,我遇到的所有解决方案都在 linux 下使用disk2vhd或使用该dd命令,该命令执行磁盘的完整副本(即甚至是空块)并且不输出 VHD 文件。Linux下有没有可以直接创建VHD文件的工具/程序?或者是否可以将使用 dd 创建的原始磁盘映像转换为 VHD 文件,而无需为空块分配空间?你将如何进行?

与往常一样,非常感谢任何建议或评论!!

Fed*_*ico 32

为了将来参考,以下是我最终的处理方式,并对遇到的各种问题或陷阱发表了一些评论:

1.用Linux live系统启动机器

第一步是使用 Linux 实时系统启动包含要映像的磁盘的机器。

注意:我的第一个想法是使用 Ubuntu Live USB 磁盘,但机器不支持从 USB 引导,所以我发现使用旧的Knoppix live CD更容易。

2. 使用磁盘镜像dd并通过管道传输数据ssh

然后,我用复制所有磁盘内容到一个文件中的图像我的本地服务器上dd,并通过管道中的数据ssh

$ dd if=/dev/hdX bs=4k conv=noerror,sync | ssh -c 河豚 myuser@myserver 'dd of=myfile.dd'

这里有一些评论:此方法将读取所有磁盘内容,因此可能需要很长时间(80Gb 磁盘花了我 5 小时)。瓶颈不是网络,而是磁盘读取速度。在启动副本之前,我建议检查 BIOS/磁盘/系统参数以确保磁盘和主板以尽可能高的速度工作(这可以使用命令hdparm -i和运行测试来检查hdparm -Tt /dev/hdX)。

注意:dd不输出操作的进度,但我们可以通过从另一个终端向进程 PID发送USR1信号来强制它这样做dd

$ kill -USR1 PIDofdd

注意:较新版本dd支持status=LEVEL选项 ( man dd)

   status=LEVEL
          The  LEVEL of information to print to stderr; 'none' suppresses everything but error messages, 'noxfer' suppresses
          the final transfer statistics, 'progress' shows periodic transfer statistics
Run Code Online (Sandbox Code Playgroud)

3.回收未使用的空间

此时,不再需要源计算机,我们将专门在目标服务器上工作(也运行 Linux)。VirtualBox 将用于将原始磁盘映像转换为 VHD 格式,但在此之前,我们可以将未使用的块清零,以便 VirtualBox 不会在最终文件中为它们分配空间。

为此,我将图像安装为环回设备:

$ mount -o loop,rw,offset=26608813056 -t ntfs-3g /mnt/mydisk/myfile.dd /mnt/tmp_mnt
$ cat /dev/zero > zero.file
$ rm zero.file
Run Code Online (Sandbox Code Playgroud)

注意:可以通过parted在映像文件上使用来获取指示磁盘映像内分区开始的偏移量:

$ parted /mnt/mydisk/myfile.dd
(parted) unit
Unit?  [compact]? B
(parted) print
Model:  (file)
Disk /mnt/mydisk/myfile.dd: 80026361856B
Sector size (logical/physical): 512B/512B
Partition Table: msdos

Number  Start         End           Size          Type      File system  Flags
 1      32256B        21936821759B  21936789504B  primary   ntfs         boot
 2      21936821760B  80023749119B  58086927360B  extended               lba
 5      26608813056B  80023749119B  53414936064B  logical   ntfs
Run Code Online (Sandbox Code Playgroud)

NOTE2:默认的Linux内核NTFS驱动提供只读访问,因此需要安装和使用用户空间ntfs-3g驱动,否则写入磁盘会报错!

4. 使用 VBoxManage 创建 VHD 镜像

此时,我们可以使用 VirtualBox 实用程序将原始图像转换为 VHD 文件:

VBoxManage convertfromraw myfile.dd myfile.vhd --format VHD
Run Code Online (Sandbox Code Playgroud)

  • 在创建零文件之前,您忘记 cd 进入已安装的磁盘: mount -o loop,rw,offset=26608813056 -t ntfs-3g /mnt/mydisk/myfile.dd /mnt/tmp_mnt ;cd /mnt/tmp_mnt ; cat /dev/zero > zero.file ; rm 零文件;您也可以使用 pv 而不是 dd 来显示即时进度。 (2认同)
  • 您可能应该在 dd 中使用更大的块大小,例如“bs=4M”以显着加快该过程。 (2认同)

Yir*_*kha 19

我试图做与 OP 完全相同的事情(同时拯救 Windows 安装)并最终为它创建了一个新工具,ntfsclone2vhd.

然后,您只需执行以下操作:

ntfsclone --save-image -o - /dev/sdXX | ntfsclone2vhd - /mnt/usb/output.vhd
Run Code Online (Sandbox Code Playgroud)

  • 这个解决方案需要投票给最高层。这是迄今为止我在数小时的搜索中找到的最简单的解决方案(除非必须“制作”Linux 副本)。为主动 Yirkha 喝彩! (3认同)