如何挂载VirtualBox的虚拟硬盘镜像(vdi)?

有没有办法将VirtualBox的驱动映像(.vdi)挂载,以便可以在Nautilus等文件管理器中查看其内容?
我有一个Windows 2000的.vdi文件,在从VirtualBox 2.x升级到3.1.6后无法启动("无法访问的引导设备")。我相信IDE驱动的详细信息已经发生了变化,我只需要访问内部驱动映像并编辑Windows的boot.ini文件,将其指向新的位置。

1如果您的.vdi和.img文件包含多个分区,这将非常有用:浏览不挂载的img - user2689749
11个回答

使用qemu-nbd,该过程在serverfault此博客中有详细说明。
基本上,如果需要的话,您将需要安装qemu
sudo apt-get install qemu qemu-utils

然后您需要加载网络块设备模块:
sudo rmmod nbd
sudo modprobe nbd max_part=16

将.vdi镜像附加到您刚创建的nbd之一。
sudo qemu-nbd -c /dev/nbd0 drive.vdi

现在您将获得一个/dev/nbd0块设备,以及几个/dev/nbd0p*分区设备节点。
sudo mount /dev/nbd0p1 /mnt

完成后,请卸载所有内容并断开设备连接。
sudo qemu-nbd -d /dev/nbd0

2我想指出max_part=16似乎是一个关键部分。如果没有它,您将看不到任何/dev/nbd0pX文件,尽管主设备将正常工作。请查看以下在Gentoo论坛上的讨论,以了解遇到此问题的人们的情况。 - firegurafiku
所有的答案在某种程度上都有效,但这是我最喜欢的,并且应该被接受。clonehd可以完成工作,但会使存储需求翻倍。virtualbox-fuse是理想的选择,但尽管你仍然可以获得它,它没有出现在现代操作系统的软件源中。 - Hatoru Hansou
太棒了!这绝对是使用.vdi文件的最佳方法!我在克隆或调整VDI时遇到了一些愚蠢的错误,但这种方法可以绕过所有问题 :)VBoxManage: 错误:无法创建克隆介质'/mnt/temp6/xubuntu-14.04-64bit.img'。 VBoxManage: 错误:原始:创建图像'/mnt/temp6/xubuntu-14.04-64bit.img'时磁盘将溢出(VERR_DISK_FULL) VBOX_E_NOT_SUPPORTED VBoxManage: 错误:此格式尚未实现调整硬盘大小操作! - Avio
我也认为这是更好的答案。就我个人而言,我不太愿意克隆我的100GB镜像只为了获取几个文件 ;) 通过qemu-nbd挂载工作得很顺利。 - piit79
3这个方法很好用。请注意,安装qemu-kvm而不是qemu可能同样有效。对我来说,在我的Ubuntu 16.04上,它只安装了23MB和13个依赖项,而不是完整的qemu安装所需的230MB和更多的依赖项。 - mivk
请注意,以下内容仅适用于我的情况:sudo qemu-nbd -c /dev/nbd1 drive.vdi,否则我会遇到错误:mount: 特殊设备 /dev/nbd0p1 不存在。 - Janos Szabo
3在Debian buster amd64上,我只安装了 qemu-utils 及其依赖项,总计仅几MB的磁盘使用量,并且它成功工作:我成功挂载了 .vdi 文件并复制了一个文件。 - Jorge
3我想补充一下,显然需要在更新的内核上执行 sudo partprobe 命令,这样在Debian/Ubuntu系统中才会创建 /dev/nbd0p* 设备(https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=824553)。 - Kai
4这应该是被接受的答案!我的虚拟磁盘镜像文件太大了,无法直接转换成.iso格式保存在硬盘上。经过一番努力后,我向下滚动页面,看是否有其他方法可以直接使用虚拟磁盘镜像文件。这个方法很简单。(注意:对于那些关心硬盘空间的人来说,qemu大约需要300MB的空间。) - psitae
如果 nbd0p1 没有出现,请运行 sudo kpartx -av /dev/nbd0,它会将其添加到 /dev/mapper/ - iman
请注意,在Debian中,qemu-nbd位于qemu-kvm软件包中,因此您应该使用apt-get install qemu-kvm进行安装。 - ceremcem
只是要注意,在19.10上,我不需要执行partprobe就能成功运行。 - Tom
干得好,运行得很顺畅! - Smeterlink
Ubuntu 20.04 LTS存在问题。我遇到了sudo: qemu-nbd: command not found的错误。 - brewmanz
除了挂载的驱动器没有显示任何内容外,其他一切都很正常...然而,binwalk在VDI文件中找到了许多文件。我也尝试了第一个答案,但是在我的挂载点上仍然只得到了一个空目录。不确定原因。 - lucidbrot
为了解决Ubuntu上的“sudo:qemu-nbd:command not found”问题,您需要安装一个额外的软件包:“sudo apt-get install qemu-utils”。 - megloff
1这个回答开头的链接已经失效了。 - DAB
这个解决方案对快照来说安全吗? - zomega

你可以将其转换为标准图像,然后进行挂载。
VBoxManage clonehd --format RAW ubuntu.vdi ubuntu.img

那么

mount -t ext3 -o loop,rw ./ubuntu.img /mnt

你需要知道文件系统的类型,这里是ext3。挂载后,使用你喜欢的编辑器进行编辑。不要将/mnt位置内的文件与正在运行的主机混淆,否则会出问题。
要检查关于你的VDI文件的详细信息,请运行:VBoxManage showhdinfo ubuntu.vdi
来源:[已解决] 如何使用档案管理器打开.vdi文件?- ubuntuforums.org

4特别适用于这种情况。原作者可以在副本上工作,同时保留原始版本作为备份。 - Javier Rivera
15小心使用动态大小的.vdi文件进行此操作。将其转换为.img将强制使映像文件与磁盘的逻辑大小一样大,这就是为什么此方法有效,但它可能比.vdi文件更大。如果您不确定,请查看VBoxManage showhdinfo [您的vdi文件]的输出。 - Jack O'Connor
4-1,stwisselMaxime R.的回答提供了解决方案--这是一个可行的权宜之计,但并不是对问题的最佳答案。 - STW
4如果图像有分区表(像大多数驱动器一样),那么您需要将此答案与这个答案结合起来,以挂载各个分区。 - bain
2不起作用。一直出现挂载错误,文件系统类型错误。我尝试了ext3、ext2和ext4。虚拟机箱显示硬盘的文件系统类型是ext4。 - Joshua Robison
既然你将vdi克隆为RAW格式,或许需要使用mount -t raw命令进行挂载? - Joshua Robison
2你可以将图像放在循环中:losetup -P /dev/loopX ubuntu.img(其中X是未使用的循环设备的索引),然后mount /dev/loopXpY /mnt(其中Y是要挂载的分区的索引)。 - Rufflewind
将整个图像转换是非常低效的。此外,这种解决方案不允许您编辑磁盘文件。 - zomega

看起来vdfuse就是你要找的工具。它在Ubuntu软件仓库中可以找到。如果你想自己编译(2010年的源代码),你也可以这样做
然而对于我们大多数人来说,简单来说就是:
sudo apt-get install virtualbox-fuse

似乎现在也支持动态VDI。
要将.vdi文件挂载到/mnt目录,请使用以下命令:
sudo vdfuse -a -f /path-to-vdi-file /mnt

整个磁盘将以分区的方式进行挂载,命名格式为Partition1Partition2。然后可以对这些文件进行循环挂载。例如,
sudo mount -o loop /mnt/Parition1 /mountpoint

谢谢你的支持。vdfuse已经作为答案提供了。请改进那个答案,而不是添加一个重复的答案。 - matt wilkie
1@mattwilkie:现在的区别是:不再需要手动编译了。 - stwissel
好的,在进行了这个修改后,这个答案比之前的一行更好了。 - matt wilkie
2不客气。坐在一个合适的屏幕和键盘前,而不是在玻璃上乱敲,真的有很大的区别 :-) - stwissel
vdfuse的优点在于它不会因为磁盘已满等问题而抱怨。如果你选择使用VBoxManage,你需要额外的空间来进行挂载。 - Jack
6在14.04版本中无法使用。 - int_ua
2可以从这里下载:http://sourceforge.net/projects/vdfuse/?source=typ_redirect,它在15.04版本上可用。 - sup
1上面链接中的vdfuse在16.04版本上无法正常工作。 - Artem Pelenitsyn
8不再适用于16.10版本,该软件包已不存在。 - Piskvor left the building

将磁盘设置为另一个虚拟操作系统的次要主控,然后启动该(虚拟)操作系统,您就可以挂载它。
步骤1:假设您已经在VirtualBox中安装了一个虚拟操作系统(比如Ubuntu 16.04),请从该虚拟操作系统的设置中添加一个新的存储。 enter image description here 步骤2:浏览您想访问的Vdi文件并选择它。
步骤3:登录到虚拟操作系统。
步骤4:虚拟磁盘可能已经在操作系统内可用。如果不可用,请按照步骤5进行操作。
步骤5:在虚拟操作系统内使用Gparted检查磁盘,并确保磁盘的类型是虚拟操作系统可访问的类型。如果不是,则可能需要编辑磁盘,但这样会丢失现有内容。

1就记录而言,2016年行不通。 - Paulo Pedroso
1它在Ubuntu 16.04上运行正常。 - Sharun
这真的是唯一的解决方案,当你需要进行更改然后再回到使用它时,无法让vdfuse与rw正常工作。 - DuBistKomisch
你甚至可以使用一个Live Ubuntu,并将.vdi文件作为额外的存储添加进去。 - AmirHossein Rezaei

主持人注意:自2016年起,vdfuse模块和软件包已经过时,因为它们已从Ubuntu软件库中删除。虽然这个答案现在已经过时,但由于帖子的年龄和赞同数,此处的答案已被保留作为历史用途。
我自己没有测试过,但有一个可以挂载它们的fuse模块(vdfuse),请查看以下页面:
- HOWTO: 在主机上挂载任何VBox兼容的磁盘映像
请注意,使用它进行写入操作是有风险的。

使用方法:

$ ./vdfuse-v<version> -h
USAGE: ./vdfuse [options] -f image-file mountpoint
   -h   help
   -r   readonly
   -t   specify type (VDI, VMDK, VHD, or raw; default: auto)
   -f   VDimage file
   -a   allow all users to read disk
   -w   allow all users to read and write to disk
   -g   run in foreground
   -v   verbose
   -d   debug

直接使用文件名挂载图像:
$ ./vdfuse-v<version> -f image.vdi /mnt/vdi
$ mount -o loop /mnt/vdi/Partition1 /mnt/WindowsXP

挂载机器磁盘(包括快照):
$ ./vdautomount-<version> -p /path/to/vdfuse WinXP /mnt/vdi
$ mount -o loop /mnt/vdi/Partition1 /mnt/WindowsXP

1不再相关,因为此实用程序不受支持。 - Evan Carroll

您可以使用VirtualBox的命令行工具中的vboximg-mount程序。

有趣!我遇到了分段错误,但这是第一个提到这个工具的答案,所以我给了赞同。 - Flimm

正如Vojtech Trefny上面提到的,
1)首先将您的VDI转换为IMG格式。
VBoxManage clonehd --format RAW ubuntu.vdi ubuntu.img

2) 然后挂载IMG
mount -t ext3 -o loop,rw ./ubuntu.img /mnt

3) 然而,当我收到这个错误信息时:
mount: wrong fs type, bad option, bad superblock on /dev/loop0,
       missing codepage or helper program, or other error
       In some cases useful info is found in syslog - try
       dmesg | tail  or so

而且dmesg说:
[3105578.013671] EXT4-fs (loop0): VFS: Can't find ext3 filesystem

你需要检查.img文件的分区结构。
fdisk -l ubuntu.img

Disk ubuntu.img: 21.0 GB, 20971520000 bytes
255 heads, 63 sectors/track, 2549 cylinders, total 40960000 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0xf45bc910

   Device Boot      Start         End      Blocks   Id  System
ubuntu.img1   *        2048    12582911     6290432   83  Linux
ubuntu.img2        12584958    16775167     2095105    5  Extended
ubuntu.img3        16775168    40959999    12092416   83  Linux
ubuntu.img5        12584960    16775167     2095104   82  Linux swap / Solaris

4) 如您所见,主分区从字节16775168开始。然而,请注意扇区大小为512字节,因此您需要将结果16775168 x 512 = 8588886016乘以,以便正确设置挂载偏移量。
mount -t ext3 -o loop,rw,offset=8588886016 ./ubuntu.img /mnt

5) 实际上,在文件系统调整大小后出现脏数据的情况下,这个方法对我并没有起作用。在这种情况下,我进一步进行了以下操作:
dd if=ubuntu.img of=ubuntu.disk bs=512 skip=16775168 count=12092416
e2fsck ubuntu.disk
mount ubuntu.disk /mnt

1这不是对问题的回答。你还有另一个问题——一个损坏的图片。你应该自己回答一个新问题。 - Evan Carroll
2这扩展了先前回答涵盖错误情况。损坏的图像是一个使用案例。+1 为许多新技巧。 - FractalSpace

使用vboximg-mount实用程序将VirtualBox磁盘映像文件在主机上可用:

打开VDI文件

sudo mkdir -p /mnt/vdi/expanded
sudo vboximg-mount -i <path-to-vdi> -o allow_other /mnt/vdi/expanded
输出示例
ls /mnt/vdi/expanded
<filename.vdi>  vhdd  vol0  vol1

挂载磁盘

mkdir /mnt/vdi/vol1
sudo mount /mnt/vdi/expanded/vol1 /mnt/vdi/vol1

卸载
cd /mnt                       # Optional (avoid mount: ... target is busy)
sudo umount /mnt/vdi/vol1     # Order importent
sudo umount /mnt/vdi/expanded
rm -rf /mnt/vdi               # Optional (clean-up resources)

除了使用 vboximg-mount -i <path-to-vdi> 的方法,你还可以使用 vboximg-mount --list --wide 列出所有用户 VDI,并将它们的 UUID 指定给 vboximg-mount(例如 vboximg-mount -i <UUID> [...])。 - desseim
我发现当不使用sudo时,只有-i <UUID>才有效。没有sudo时,分区的第二次挂载失败了。而使用sudo时,我需要在-i选项中使用完整路径到.vdi镜像。 - Daniel Stevens
我尝试使用FreeDOS 1.3 RC4在本地挂载一个vdi镜像:输出结果相同,但我不得不挂载vol0而不是vol1,并指定-t vfat和完整路径,因为相对路径无法正常工作... - undefined

不是你要求的东西,但如果只是单纯地需要从vdi文件中获取文件,并且想要一个非常快速的解决方案:
1. 在主机上运行一个ssh服务器(apt-get install openssh-server && service ssh restart) 2. 使用VirtualBox从现有的vdi文件构建一个虚拟机,然后启动该虚拟机。(在构建虚拟机时,我只保留了默认的网络适配器(NAT)。) 3. 在虚拟机内部,通过sftp连接到你的主机。(sftp hostuser@hostip) 4. 在sftp会话中,将需要的文件上传到主机上。

1虽然这是一个丑陋的方法,但如果你处于困境中,它能完成任务。 - Piskvor left the building
一个问题可能是机器目前无法正确启动,因此您需要先解决这个问题,这意味着您不能从内部进行操作。此外,使用SSH与您的虚拟机操作系统一起复制文件是最好的方法。比尝试共享磁盘要快得多。 - Alexis Wilke
访客系统需要安装SSH才能正常工作。在Linux访客系统上较为简单,在Windows访客系统上则不太直接。 - Flimm

P7Zip可以打开VDI文件

从Ubuntu软件中心安装P7Zip - Desktop,可以通过this link下载或者运行以下命令进行安装:
sudo snap install p7zip-desktop
启动P7Zip Desktop并导航到包含.vdi文件的文件夹(可能在您的主目录下的VirtualBox VMs文件夹中)。 在P7Zip窗口中双击VDI文件。 按照您的喜好查看或提取文件。

这似乎加载了最旧的快照,而不是客户机文件系统的当前状态。 - Flimm
如果我们只需要从有效的VDI文件中提取单个文件,P7zip是最简单的方法。然而,它似乎有bug,因为它只能在当前文件系统中打开VDI文件,而不能在/media中打开其他挂载的文件系统中的文件。 - Francesco Galgani