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


29

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

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

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

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

与往常一样,任何建议或评论都将受到高度赞赏!!


BSD有一个称为mkimg的工具,可以在其他格式中制作vhd映像。
朱利安

Answers:


30

供以后参考,这是我最终的工作方式,并对遇到的各种问题或陷阱提出了一些意见:

1.使用Linux live系统引导计算机

第一步是使用Linux live系统引导包含要映像的磁盘的计算机。

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

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

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

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

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

注意:dd不会输出操作进度,但是我们可以通过从另一终端向过程PID 发送USR1信号来强制执行此操作dd

$ kill -USR1 PIDofdd

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

您应该能够使用vdfuseqemu-nbd将其转换为.img文件来挂载vhd映像(更多信息:askubuntu.com/questions/19430/…
Francesco

1
在速度较慢的计算机上,ssh的加密可能是瓶颈。如果不需要加密,请考虑使用netcat(man nc)。
杰里米

2
您在创建零文件之前忘记了进入已装入的磁盘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 zero.file; 您也可以使用pv而不是dd显示即时进度。
Smeterlink'3

1
您可能应该在dd中使用更大的块大小,例如,bs=4M以显着加快该过程。
弗里茨

13

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

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

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

1
这款游戏的推出时间晚了3年,但此页面是Google在相关关键字上排名最高的网页,因此将来可能仍会帮助一些可怜的人。
2015年

2
此解决方案需要优先考虑。这是make我在许多小时的搜索中找到的最简单的解决方案(必须复制Linux)。勇敢采取主动的伊尔卡!
user66001 2015年

3

一种方法是使用一些便捷的技术:VirtualBox和ntfsprogs程序包。

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

因此,首先,在VirtualBox中创建一个新的VM,并为其提供一个新的空VHD文件驱动器。VHD驱动器仅需要与要克隆的物理驱动器上使用的数据大小一样大(实际上,请使其稍大一些,以留出一些摆动空间)。

接下来,找到包含该ntfsprogs软件包以及的Linux live CD openssh-server。我喜欢System Rescue CD,但是几乎任何基于Debian或Ubuntu的Live 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 ,只是为了确保克隆不会引起任何问题(它不应该有问题,但是,嘿,我对这些事情有些偏执)。


嗨,非常感谢您提出的解决方案!最后,我使用了另一种方法,因为磁盘上有多个分区要备份,并且无法轻松地在计算机上使用VirtualBox进行备份(有关详细信息,请参见我的回答),但是事实证明您建议使用VirtualBox和ssh非常有用!
Federico

1

(我知道这是一个旧帖子,但这也许至少会帮助其他人。)

您真的需要能够在Linux下创建映像吗?我认为您正在尝试将Windows硬盘驱动器备份到VHD。我认为Linux文件系统不能封装在VHD容器中。

一个自由的Sysinternals中叫做效用Disk2vhd将创建当前运行Windows XP或更高版本系统的VHD。这也应适用于安装USB驱动器的映像。


0

我最近也尝试克隆一个实时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。


因此,我不会尝试热复制,wiki.r1soft.com
display/

0

您也可以在Windows上使用实时CD。它不是Microsoft的官方产品,但可以使用。您可以将其放在CD或USB驱动器上。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.