![如何从 Linux 实时系统创建 VHD 磁盘映像?](https://linux22.com/image/1310932/%E5%A6%82%E4%BD%95%E4%BB%8E%20Linux%20%E5%AE%9E%E6%97%B6%E7%B3%BB%E7%BB%9F%E5%88%9B%E5%BB%BA%20VHD%20%E7%A3%81%E7%9B%98%E6%98%A0%E5%83%8F%EF%BC%9F.png)
再一次,我不得不求助于 SuperUser 的专家,因为我的其他资源(主要是 Google ;-))并没有太多帮助...
因此,基本上,我想创建一个物理磁盘的 VHD 映像,以便存档/访问/甚至挂载在虚拟机中。现在,网络上有几十篇关于如何做到这一点的文章和教程,但没有一篇完全符合我想要实现的条件:
- 我想目标文件成为一个VHD 映像,因为 Windows 7 可以本地安装它,甚至通过网络和许多其他程序都可以使用它(VirtualBox,...)
- 我尝试镜像的磁盘包含 Windows XP 安装,因此理论上我可以使用该
disk2vhd
实用程序,但我想找到一个不需要启动 Windows XP 的解决方案安装(即保持磁盘只读) - 因此,我正在寻找一种解决方案,涉及某种直播系统(通过 USB 或网络运行)
但是,我遇到的所有解决方案要么使用Linux 下的命令disk2vhd
,要么使用dd
Linux 下的命令,该命令会完整复制磁盘(即甚至空块),而不会输出 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。