从损坏的Virtualbox虚拟机.vdi中恢复文件。

我的Ubuntu 12.04.1在虚拟机中运行时空间不足,我正在安装软件,现在它无法重启。我有一些需要从中恢复的文件。我将ubuntu64.vdi文件保存在我的Windows 7笔记本电脑上(主机),我想知道是否有办法从vdi文件中恢复文件。
与此同时,我在同一台笔记本电脑上使用虚拟机生成了一个新的12.04.1机器,我将使用这个新机器代替损坏的机器。
我可以将损坏的vdi添加到工作机器的磁盘列表中。然后,我使用Gnome Nautilus来挂载损坏的磁盘。
我可以在里面找到文件,但它们大约是2个月前的。我认为这与我最后一次对机器进行虚拟机快照的时间相符,但不是我获得可用机器的最后一次,那是昨天。是否有办法在崩溃之前的昨天挂载vdi
编辑:
这是虚拟媒体管理器告诉我的关于ubuntu64.vdi文件的信息: enter image description here 编辑2:
我将我的ubuntu.vdi复制到一个有大量磁盘空间的外部USB设备上。我尝试使用Windows进行克隆,但出现了一个错误:

enter image description here

我尝试了同样的方法,通过USB驱动器的共享文件夹从工作虚拟机进行克隆。克隆过程花了一些时间,但最终成功完成。
root@precise64:/media/sf_E_DRIVE/copy_of_ubuntu64_vm_folder_20140224/ubuntu64# 
VBoxManage clonehd ubuntu64.vdi ubuntu64.raw --format RAW
0%...

10%...20%...30%...40%...50%...60%...70%...80%...90%...100%
Clone hard disk created in format 'RAW'. UUID: 90f99198-18e1-40ee-85fe-c083dcbb1ac3

编辑3:
创建原始文件后,我使用“testdisk”运行“Deeper Search”,得到了以下列表: enter image description here 完成“Deeper Search”之后,我得到了以下列表:

enter image description here

但是我不知道哪一个是哪一个快照... 有什么想法吗?

@Takkat,听起来很酷。我该怎么做? - 719016
@Takkat,我做了,并使用gnome nautilus挂载了它,但我相信它挂载的是机器的两个月前的版本。 - 719016
2这里的问题不在于如何恢复磁盘,而是如何与快照合并进行操作。如果您尝试克隆您的VDI,它将具有另一个UUID,并且快照将无法与其配合使用,您将丢失最新的数据。我不经常使用快照,因为过去曾遇到过损坏的磁盘,虽然能够恢复基础磁盘,但总是会丢失增量数据。希望有人能在这里提供一个好的方法来同时恢复基础和增量数据。 - Pablo Marin-Garcia
2这是下次的经验教训:永远不要将数据存储在虚拟机上,而是始终挂载外部驱动器...或者通过rsync进行频繁备份/同步。 - Dee
1尝试克隆最新的快照,而不是原始磁盘。你应该使用Vboxmanage clonehd 2208...(在这里复制最新的UUID)。请参考http://serverfault.com/a/506581/195528。 - Rmano
...只是插一句话,你尝试过扩展(副本)磁盘吗?如果由于空间问题而无法正常工作的话。 'http://www.webdesignblog.asia/software/linux-software/resize-virtualbox-disk-image-manipulate-vdi/#sthash.v1dwfS1K.dpbs' - Jacob Vlijm
5个回答

命令行操作

如果我们使用Ubuntu作为主机,可以使用以下命令将.vdi磁盘转换为原始磁盘:

VBoxManage clonehd <sourcename> <clone.raw> --format RAW

我们可以使用这个文件打开 testdisk 安装testdisk 来恢复虚拟驱动器镜像中的文件(也请参见下文):
testdisk <clone.raw>

虚拟机

如果损坏的VDI驱动镜像仍然在Virtual Box中注册,我们可以将此镜像添加为新虚拟机的驱动器:

enter image description here

开始您的虚拟Ubuntu,我们已经添加了损坏的.vdi文件,但是不要挂载该驱动器
  1. 在已挂载的分区上创建一个目录来存放收集到的数据(例如~/rescued)。

  2. 在虚拟机上安装testdisk Install testdisk

  3. 从终端启动testdisk:

    sudo testdisk
    
  4. 选择要从中收集数据的适当驱动器(此处显示为/sdb),然后选择[Proceed]

    enter image description here

  5. 选择适当的分区布局(通常为Intel

  6. 选择[Analyse] - [Quick Search]

  7. 选择包含要收集的数据的分区(此处仅存在一个NTFS分区):

    enter image description here

  8. 按下 P 以列出该分区上的文件。

  9. 浏览到包含数据的目录。查看文件名以确保选择正确。

  10. 使用 : 选择要收集的目录或文件。所有选择的文件/目录将标记为绿色:

    enter image description here

  11. 按下大写 C 将所有选定的目录/文件复制到下一步中选择的救援目录。

  12. 选择Ubuntu虚拟机上已挂载分区的目录来存放被救援的数据:

    enter image description here

  13. 按下 c 开始将损坏的.vdi文件中的数据复制到健康虚拟机中的救援目录。

注意事项:

如果我们无法通过“快速搜索”选项在6中看到我们的文件,可能需要执行“深度搜索”。这将列出先前删除和覆盖的分区。因此,我们需要确保选择包含我们数据的适当分区。
如果我们已经对.vdi文件进行了快照,可以在~/.VirtualBox/Machines/<机器名称>/Snapshots/{###}.vmdk中找到这些快照。但是,每当我们使用Virtual Box的快照功能时,快照中的任何更改都将被写入差异文件。
要将差异文件与硬盘合并,我们需要删除所有快照(这可能不是我们想要的,因为那样我们只需恢复到以前的快照而不是调用数据恢复),或者我们需要使用以下命令克隆机器的驱动器:
VBoxManage clonehd <源名称> <克隆名称> 然后,按照上面所示的步骤将克隆绑定到我们的救援虚拟机。
在数据安全之后,才应该对损坏的.vdi文件进行写入操作,因为这可能会进一步损坏文件系统。
如果我们的救援Ubuntu太小,无法容纳被救援的数据,我们可以创建另一个新的虚拟驱动器来绑定到虚拟机。然后,需要在虚拟机中挂载该驱动器,以便能够将数据从testdisk保存到其中。

非常感谢这些详细的指示。我按照正确的步骤操作,并将文件添加到我的恢复文件夹中。复制成功了,但文件的时间戳相当旧:是2013年夏天的而不是两天前的。我记不清8个月前是否有特别的操作,但乍一看,我两天前的文件并不存在。现在我正在使用“深度搜索”再次浏览它。 - 719016
@213441265152351 - 还要看一下快照文件夹...可能有一个更新的.vmdk文件(至少在我的系统中是这样)。希望你能找到你的数据 :) - Takkat
我进行了一次“深度搜索”,几个小时后,再次浏览我想要恢复的内容:它们仍然指向一个2013年夏季版本的虚拟机,早于使用gnome nautilus挂载分区之前的一月2014年版本,但仍然无法找到两天前的文件。 - 719016
1@213441265152351: 哎呀,这就复杂了。可能是在“崩溃”发生时,差异图像尚未正确写入驱动器。你可以尝试从虚拟媒体管理器(参见http://www.virtualbox.org/manual/ch05.html#diffimages)查看磁盘,看看是否是这种情况。但我必须说,对于从这些图像中恢复数据,我无法给出一个很好的建议。 - Takkat
我明白你的观点。我查看了Virtual Media Manager关于我的失败的ubuntu64.vdi的情况,并在问题中打印了结果。 - 719016
@213441265152351 看一下我的修改。我认为我们需要克隆VDI来合并差异。不幸的是,我无法在这里进行测试。将克隆到RAW还可以直接访问主机上的VDI,而无需在虚拟机中运行所有内容。希望这对你有所帮助。 - Takkat
我现在正在尝试克隆到原始格式。大约过了1个小时,仍然卡在"0%..."。 - 719016
@213441265152351 是的,这需要很长时间 :/ - Takkat
如果http://serverfault.com/a/506581/195528是正确的,你只需要克隆最新的快照到一个新的磁盘。这样做可以吗? - Rmano
2@Rmano:实际上,克隆的虚拟磁盘镜像(VDI)不会包含任何快照,而是将最新的虚拟机状态与差异合并。只有在需要克隆早期快照的情况下,我们才可能使用快照 VDI 进行克隆,但是克隆后的副本将不包括快照之后的所有更改。 - Takkat
你好,来自2023年的问候!只是想说这些步骤仍然非常有效。谢谢! - Chris S

1)尝试通过 UUID 恢复快照,使用以下方法:

  • 选择要恢复的状态的 UUID。
  • 打开 .xml 文件,最好使用可以轻松浏览 XML 文件的工具(例如 Internet Explorer)。
  • 在“Storage Controllers”部分的最底部找到当前状态的 UUID,并注意 StorageController name=、type= 以及 AttachedDevice type=、port= 和 device= 的设置。
  • 在中间找到所需的快照。
  • 在快照的“Storage Controller”部分,找到与上述获取的值匹配的 AttachedDevice(包括 name/type/type/port/device)。
  • 那个镜像的 UUID 标识了硬盘的快照图像。去掉 {} 括号,然后

输入命令 C:> VBoxManage clonehd <UUID> CloneDisk.vdi

希望能有所帮助,我在这里找到了解决方案:(https://forums.virtualbox.org/viewtopic.php?t=791)

2)如果步骤 1)不起作用,下面是另一种尝试克隆磁盘当前状态的步骤:

打开虚拟媒体管理器(菜单:文件>虚拟媒体管理器)。 导航到您想要克隆的硬盘,并完全展开树形结构(使用数字键盘上的*键)。 找到附加到您想要克隆当前状态的虚拟机的{hexUUID}.vdi文件。它将是一个分支末端的叶子文件之一。当您选择它时,窗口底部的“附加到:”文本将显示为:“附加到:”,后面没有任何(快照名称)的括号。 单击窗口底部显示的“位置:”旁边的文件名。 按Ctrl+C / 复制将文本复制到剪贴板中,它将类似于:(路径){b6441469-5ccb-418c-8fdd-73c5e1a17314}.vdi 按Ctrl+V / 粘贴并提取hexUUID值(删除{}括号),然后运行clonehd来进行克隆!
这个解决方案来自这里:(http://www.i-m-code.com/blog/blog/2012/02/04/virtualbox-clone-snapshots/) 两者大致讲述的是相同的内容。

找到了我的损坏的vdi文件,使用7-Zip可以恢复,希望这个简单的方法也能帮助到其他人。

对我来说很有效!!!谢谢。 - Domi.Zhang
我有7-Zip,但是我找不到和修复功能。你是怎么做到的? - AlexSC

我的Linux系统在/处遭到破坏,fsck无法修复。我采用了以下简单的方法:

  1. 向机器添加一个新的替代性VDI。
  2. 下载一个新的Linux ISO。
  3. 引导并在(1)中添加的磁盘上安装新的Linux。
  4. 在新系统上挂载磁盘并复制所需的文件。通常,这意味着复制/home/user/文件夹。记得要复制隐藏文件(设置文件)。

对我来说效果很好。磁盘损坏只妨碍了启动,我的个人文件夹没有数据丢失。


在插入Ubuntu ISO后,启动旧的虚拟机。Ubuntu将分析该机器。选择“尝试Ubuntu”(显然不要安装任何东西,也不要擦除任何数据)。一旦它启动起来(它能启动,因为它是使用的Ubuntu ISO而不是您旧的损坏安装),在浏览器(Nautilus)中选择“其他位置”以导航到您的旧数据并将其移到安全的地方。
我没有尝试修复机器,只是对恢复数据并将其转移到新的虚拟机感兴趣。可能可以直接从已启动的旧机器上按照顶部答案建议的方法实现这一点。