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

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

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

因此,基本上,我想创建一个物理磁盘的 VHD 映像,以便存档/访问/甚至挂载在虚拟机中。现在,网络上有几十篇关于如何做到这一点的文章和教程,但没有一篇完全符合我想要实现的条件:

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

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

与往常一样,我们非常感谢任何建议或意见!!

答案1

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

1. 使用 Linux Live 系统启动机器

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

注意:我的第一个想法是使用 Ubuntu Live USB 磁盘,但机器不支持从 USB 启动,所以我发现使用旧的Knoppix 现场 CD

2. 使用以下方式对磁盘进行映像处理dd并通过管道传输数据ssh

然后,我将所有磁盘内容复制到本地服务器上的文件映像中,dd并通过以下方式传输数据ssh

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

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

注意:dd不输出操作进度,但我们可以通过发送USR1dd从另一个终端向进程 PID 发出信号:

$ kill -USR1 PID

注意:较新版本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

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

注意:可以使用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

注2:默认的Linux内核NTFS驱动程序提供只读访问,因此需要安装并使用用户空间ntfs-3g驱动程序,否则写入磁盘将引发错误!

4.使用 VBoxManage 创建 VHD 映像

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

VBoxManage convertfromraw myfile.dd myfile.vhd --format VHD

答案2

我试图做和楼主完全一样的事情(同时拯救一个 Windows 安装),最后为它创建了一个新工具,ntfsclone2vhd

然后你只需做这样的事情:

ntfsclone --save-image -o - /dev/sdXX | ntfsclone2vhd - /mnt/usb/output.vhd

答案3

一种方法是使用一些方便的技术:VirtualBox 和软件包ntfsprogs

VirtualBox 的最新版本允许您创建 VHD 硬盘文件,同时ntfsprogs提供ntfsclone实用程序。顾名思义,ntfsclone克隆 NTFS 文件系统,我相信它是在文件系统级别执行此操作,跳过未使用的磁盘块。

因此,首先,在 VirtualBox 中创建一个新的 VM,并为其配置一个新的空 VHD 文件驱动器。VHD 驱动器的大小只需与要克隆的物理驱动器上使用的数据大小一样大(实际上,让它稍微大一点,以留出一些回旋余地)。

接下来,找到包含软件包的 Linux Live CD ntfsprogs,以及openssh-server。我喜欢系统救援光盘为此,但几乎任何基于 Debian 或 Ubuntu 的实时 CD 也应该可以正常工作。

使用 Linux Live CD 启动 VirtualBox VM,并sshd在 VM 内启动,以便您能够远程执行命令。使用您喜欢的任何分区工具对空 VHD 驱动器进行适当的分区(我喜欢普通的旧式分区工具fdisk,但我有点老派)。

使用另一份 Linux Live CD,启动包含要克隆的物理磁盘的计算机。我假设 VirtualBox VM 和此计算机可以通过网络相互访问。在此计算机上,执行以下命令(全部在一行上):

ntfsclone --save-image -o - /dev/sdXX |
    ssh root@VirtualBox-VM 'ntfsclone --restore-image --overwrite /dev/sdYY -'

在哪里:

  • /dev/sdXX是要克隆的物理驱动器的设备名称(在本地计算机上),并且
  • /dev/sdYY是 VHD 目标驱动器的设备名称(在 VM 中)。

ntfsclone解释:管道中的第一个命令提取源 NTFS 文件系统的映像并通过 ssh 隧道将其发送出去,而第二个ntfsclone命令接收该映像并将其恢复到 VHD 驱动器。

操作完成后,VHD 文件应包含原始物理磁盘的逐个文件精确克隆(除非出现任何硬件错误,例如坏扇区,这可能会导致过程过早中止)。

您可能要做的最后一件事是chkdsk在 VHD 驱动器上运行 Windows,只是为了确保克隆不会引入任何问题(它不应该,但是嘿,我对这些事情有点偏执)。

答案4

我最近也尝试克隆一个实时的 Linux 系统。

仍然没有完美的解决方案。建议您可以尝试以下 2 种方法:

(1)VMware vConverter(免费)

您需要安装 vsphere hypervisor(免费)作为目标。

我几天前就这么做了,但没成功。我想我在 VirtualBox 上安装了 vSphere。

参考这里:http://xrubenx.blogspot.com.au/2010/01/vmware-converter-standalone.html

(2)使用这个http://www.r1soft.com/tools/linux-hot-copy/

这个周末我将尝试 R1Soft hotcopy。

相关内容