虚拟机很可能预期其虚拟计算机中包含内置硬盘,因此 Oracle VirtualBox 必须能够将真实存储作为虚拟硬盘呈现给访客机。目前有三种方法可以实现此目的:
Oracle VirtualBox 可以在真实硬盘上使用大型镜像文件,并将其作为虚拟硬盘呈现给访客机。这是最常用的方法,详情请参见 磁盘镜像文件(VDI、VMDK、VHD、HDD)。
iSCSI 存储服务器可以连接到 Oracle VirtualBox。详情请参见 iSCSI 服务器。
您可以允许虚拟机直接访问您的一个主机磁盘。这是一个高级功能,详情请参见 从访客机使用原始主机硬盘。
每个此类虚拟存储设备,例如镜像文件、iSCSI 目标或物理硬盘,都需要连接到 Oracle VirtualBox 呈现给虚拟机的虚拟硬盘控制器。这将在下一节中解释。
在计算设备中,硬盘和 CD/DVD 驱动器连接到称为硬盘控制器的设备,该设备驱动硬盘操作和数据传输。Oracle VirtualBox 可以模拟计算设备中常见的硬盘控制器类型:IDE、SATA (AHCI)、SCSI、SAS、基于 USB 的、NVMe 和 virtio-scsi 大容量存储设备。
IDE (ATA) 控制器是 IBM PC/AT (1984) 中磁盘控制器的一种向后兼容但非常先进的扩展。最初,此接口仅适用于硬盘,但后来扩展到也支持 CD-ROM 驱动器和其他类型的可移动介质。在物理 PC 中,此标准使用带有 40 或 80 根导线的扁平带状并行电缆。每根此类电缆可将两个设备(称为设备 0 和设备 1)连接到控制器。典型的 PC 有两个此类电缆连接器。因此,最常见的是支持多达四个 IDE 设备:主设备 0、主设备 1、从设备 0 和从设备 1。
在 Oracle VirtualBox 中,每个虚拟机都可以启用一个 IDE 控制器,这使您可以连接多达四个虚拟存储设备到机器。默认情况下,其中一个虚拟存储设备(辅助通道上的设备 0)预配置为虚拟机的虚拟 CD/DVD 驱动器。但是,您可以更改默认设置。
即使您的访客操作系统不支持 SCSI 或 SATA 设备,它也应该始终能够识别 IDE 控制器。
您还可以选择 Oracle VirtualBox 应向虚拟机呈现的 IDE 控制器硬件的确切类型:PIIX3、PIIX4 或 ICH6。这在性能方面没有区别,但如果您从其他虚拟化产品导入虚拟机,该机器中的操作系统可能期望特定的控制器类型,如果找不到则会崩溃。
在 VirtualBox Manager 中使用新建虚拟机向导创建新虚拟机后,您通常会在机器的存储设置中看到一个 IDE 控制器。虚拟 CD/DVD 驱动器将连接到此控制器的四个端口之一。
串行 ATA (SATA) 是比 IDE 更新的标准。与 IDE 相比,它支持更高的速度和每个控制器连接更多设备。此外,在物理硬件中,设备可以在系统运行时添加和移除。SATA 控制器的标准接口称为高级主机控制器接口 (AHCI)。
就像真实的 SATA 控制器一样,Oracle VirtualBox 的虚拟 SATA 控制器运行速度更快,并且比虚拟 IDE 控制器消耗更少的 CPU 资源。此外,与连接了 DVD 驱动器的 Oracle VirtualBox IDE 控制器相比,这使您能够将多达 30 个虚拟硬盘连接到一台机器,而不仅仅是三个。
因此,根据所选的访客操作系统,Oracle VirtualBox 默认使用 SATA 作为新创建虚拟机的设置。默认会创建一个虚拟 SATA 控制器,并且新虚拟机创建的默认磁盘会连接到此控制器。
整个 SATA 控制器及其连接的虚拟磁盘(包括 IDE 兼容模式下的磁盘)将不被没有 AHCI 设备支持的操作系统识别。特别是,Windows Vista 之前的 Windows 版本不支持 AHCI。旧版 Windows 版本,例如 Windows XP(即使安装了 SP3),除非您安装额外的驱动程序,否则将无法识别此类磁盘。可以通过安装 SATA 驱动程序并在虚拟机设置窗口中更改控制器类型,在安装后从 IDE 切换到 SATA。
Oracle VirtualBox 推荐使用 Intel Matrix Storage 驱动程序,可从 http://downloadcenter.intel.com/Product_Filter.aspx?ProductID=2101 下载。
要为默认未启用 SATA 控制器的机器添加 SATA 控制器(无论是由于它是由旧版 Oracle VirtualBox 创建的,还是因为所选的访客操作系统默认不支持 SATA),请执行以下操作。转到机器设置窗口的存储页面,点击“存储树”框下的添加控制器,然后选择添加 SATA 控制器。新控制器将作为单独的 PCI 设备出现在虚拟机中,您可以向其添加虚拟磁盘。
要更改 SATA 控制器的 IDE 兼容模式设置,请参见 VBoxManage storagectl。
SCSI 是另一个已确立的行业标准,代表小型计算机系统接口。SCSI 是一种通用的数据传输接口,用于各种设备之间,包括存储设备。SCSI 仍用于连接某些硬盘和磁带设备,但在商品硬件中已基本被取代。它仍在高性能工作站和服务器中普遍使用。
主要为了与其他虚拟化软件兼容,Oracle VirtualBox 可选支持 LSI Logic 和 BusLogic SCSI 控制器,每个控制器最多可连接十五个虚拟硬盘。
要启用 SCSI 控制器,在虚拟机的设置窗口的存储页面上,点击“存储树”框下的添加控制器,然后选择添加 SCSI 控制器。新控制器将作为单独的 PCI 设备出现在虚拟机中。
与其他控制器类型一样,SCSI 控制器只能被具有设备支持的操作系统识别。Windows 2003 及更高版本附带 LSI Logic 控制器的驱动程序,而 Windows NT 4.0 和 Windows 2000 附带 BusLogic 控制器的驱动程序。Windows XP 不附带任何驱动程序。
串行连接 SCSI (SAS) 是另一种使用 SCSI 命令集的总线标准。与 SCSI 物理设备相反,SAS 使用串行电缆而不是并行电缆。这简化了物理设备连接。因此,在某些方面,SAS 之于 SCSI 就像 SATA 之于 IDE:它能够实现更可靠、更快速的连接。
为了支持需要 SAS 控制器的高端访客机,Oracle VirtualBox 模拟 LSI Logic SAS 控制器,其启用方式与 SCSI 控制器大致相同。目前,最多可连接 255 个设备到 SAS 控制器。
与 SATA 一样,SAS 控制器只能被具有设备支持的操作系统识别。特别是,Windows Vista 之前的 Windows 版本不支持 SAS。因此,Windows XP,即使是 SP3,除非您安装额外的驱动程序,否则将无法识别此类磁盘。
USB 大容量存储设备类是一种通过 USB 将硬盘或闪存驱动器等外部存储设备连接到主机的标准。所有主流操作系统都支持这些设备并附带通用驱动程序,使第三方驱动程序变得多余。特别是,不支持 SATA 控制器的旧版操作系统可能会受益于 USB 大容量存储设备。
Oracle VirtualBox 提供的虚拟 USB 存储控制器与其他存储控制器类型的工作方式不同。虽然大多数存储控制器对访客机来说表现为连接了多个磁盘的单个 PCI 设备,但基于 USB 的存储控制器不显示为虚拟存储控制器。连接到控制器的每个磁盘都作为专用的 USB 设备出现在访客机中。
仅在使用 EFI 时才支持从通过 USB 连接的驱动器引导,因为 BIOS 缺乏 USB 支持。
非易失性内存高速 (NVMe) 是一种直接通过 PCI Express 连接非易失性内存 (NVM) 的标准,旨在解除固态设备之前使用的 SATA 协议的带宽限制。与其他标准不同,NVMe 的命令集非常简单,以实现最大吞吐量,并且不兼容 ATA 或 SCSI。操作系统需要支持 NVMe 设备才能使用它们。例如,Windows 8.1 添加了原生 NVMe 支持。对于 Windows 7,通过更新添加了原生支持。
NVMe 控制器是扩展包的一部分。
仅在使用 EFI 时才支持从通过 NVMe 连接的驱动器引导,因为 BIOS 缺乏相应的驱动程序。
虚拟 I/O 设备 SCSI 是一种将虚拟存储设备(如硬盘或光驱)连接到虚拟机的标准。最新的 Linux 和 Windows 版本都支持这些设备,但 Windows 需要额外的驱动程序。目前 virtio-scsi 控制器支持是实验性的。
virtio-scsi 控制器只能被具有设备支持的操作系统识别。特别是,Windows 中没有内置支持。因此,除非您安装额外的驱动程序,否则 Windows 将无法识别此类磁盘。
总而言之,Oracle VirtualBox 为您提供以下几类虚拟存储插槽:
连接到传统 IDE 控制器的四个插槽,这些插槽始终存在。其中一个通常是虚拟 CD/DVD 驱动器。
连接到 SATA 控制器的 30 个插槽,如果访客操作系统已启用并支持。
连接到 SCSI 控制器的 15 个插槽,如果访客操作系统已启用并支持。
连接到 SAS 控制器最多 255 个插槽,如果访客操作系统已启用并支持。
连接到虚拟 USB 控制器的八个插槽,如果访客操作系统已启用并支持。
连接到 NVMe 控制器最多 255 个插槽,如果访客操作系统已启用并支持。
连接到 virtio-scsi 控制器最多 256 个插槽,如果访客操作系统已启用并支持。
面对如此众多的存储控制器选择,您可能不知道该选择哪一个。一般来说,除非它是您的访客操作系统唯一支持的控制器,否则应避免使用 IDE。无论您使用 SATA、SCSI 还是 SAS,都没有真正的区别。Oracle VirtualBox 提供多种控制器仅是为了与现有硬件和其他虚拟机管理程序兼容。
磁盘镜像文件驻留在主机系统上,并被访客系统视为具有特定几何形状的硬盘。当访客操作系统从硬盘读取或写入数据时,Oracle VirtualBox 会将请求重定向到镜像文件。
像物理磁盘一样,虚拟磁盘具有大小或容量,在创建镜像文件时必须指定。然而,与物理磁盘不同的是,Oracle VirtualBox 允许您在创建后扩展镜像文件,即使其中已包含数据。请参阅 VBoxManage modifymedium。
Oracle VirtualBox 支持以下类型的磁盘镜像文件:
VDI。通常,Oracle VirtualBox 为访客硬盘使用自己的容器格式。这称为虚拟磁盘镜像 (VDI) 文件。当您创建具有新磁盘的新虚拟机时,会使用此格式。
VMDK。Oracle VirtualBox 还完全支持许多其他虚拟化产品(如 VMware)使用的流行且开放的 VMDK 容器格式。
VHD。Oracle VirtualBox 还完全支持 Microsoft 使用的 VHD 格式。
HDD。Parallels 版本 2 的镜像文件(HDD 格式)也受支持。
由于缺乏格式文档,不支持版本 3 和 4 等较新版本。但是,您可以使用 Parallels 提供的工具将此类镜像文件转换为版本 2 格式。
不管磁盘容量和格式如何,如 创建虚拟机 中所述,创建磁盘镜像有两种选项:固定大小或动态分配。
固定大小。如果您创建固定大小的镜像,则会在您的主机系统上创建一个镜像文件,其大小与虚拟磁盘的容量大致相同。因此,对于 10 GB 的磁盘,您将拥有一个 10 GB 的文件。请注意,创建固定大小的镜像可能需要很长时间,具体取决于镜像的大小和硬盘的写入性能。
动态分配。为了更灵活地管理存储,请使用动态分配镜像。它最初会非常小,并且不会占用未使用的虚拟磁盘扇区的任何空间,但每次首次写入磁盘扇区时都会增长,直到驱动器达到创建时选择的最大容量。虽然这种格式最初占用空间较少,但 Oracle VirtualBox 需要扩展镜像文件会消耗额外的计算资源,因此在磁盘文件大小稳定之前,写入操作可能比固定大小磁盘慢。然而,一段时间后,增长速度会减慢,写入操作的平均损耗将可以忽略不计。
Oracle VirtualBox 会跟踪虚拟机正在使用的所有硬盘、CD/DVD-ROM 和软盘镜像。这些通常被称为已知介质,并来自两个来源:
当前连接到虚拟机的所有介质。
已注册的介质,用于与旧版 Oracle VirtualBox 兼容。
可以使用虚拟介质管理器工具查看和更改已知介质,您可以通过点击 VirtualBox Manager 中全局工具菜单上的介质来访问它。
已知介质方便地按支持的格式分组在单独的选项卡中。这些格式包括:
硬盘镜像,可以是 Oracle VirtualBox 自己的虚拟磁盘镜像 (VDI) 格式,也可以是 磁盘镜像文件(VDI、VMDK、VHD、HDD) 中列出的第三方格式。
标准 ISO 格式的 CD/DVD 镜像。
标准 RAW 格式的软盘镜像。
对于每个镜像,虚拟介质管理器会显示镜像文件的完整路径以及其他信息,例如当前连接到该镜像的虚拟机。
虚拟介质管理器使您能够执行以下操作:
添加一个镜像到已知介质。
创建一个新的磁盘镜像。
复制一个镜像以创建另一个。
对于虚拟硬盘,您可以指定以下目标类型之一:VDI、VHD 或 VMDK。
移动镜像到另一个位置。
文件对话框会提示您输入新的镜像文件位置。
当您使用虚拟介质管理器移动磁盘镜像时,Oracle VirtualBox 会自动更新所有相关的配置文件。
始终使用虚拟介质管理器或 VBoxManage modifymedium 命令来移动磁盘镜像。
如果您使用主机操作系统的文件管理功能将磁盘镜像移动到新位置,请运行 VBoxManage modifymedium --setlocation 命令以配置磁盘镜像在主机文件系统上的新路径。此命令会自动更新 Oracle VirtualBox 配置。
移除已知介质中的镜像。您可以在移除镜像时选择性地删除镜像文件。
释放镜像以将其从虚拟机中分离。此操作仅在镜像当前作为虚拟硬盘连接到虚拟机时适用。
清除列表中所有无法访问的磁盘镜像。磁盘镜像将从其连接的虚拟机中释放,并从已知介质中移除。
此选项仅适用于光盘和软盘。
搜索按名称或 UUID 查找镜像。
查看和编辑磁盘镜像的属性。
可用属性包括:
类型:指定磁盘的快照行为。请参阅 特殊镜像写入模式。
位置:指定主机系统上磁盘镜像文件的位置。您可以使用文件对话框浏览磁盘镜像位置。
描述:指定磁盘镜像的简短描述。
大小:指定磁盘镜像的大小。您可以使用滑块增加或减小磁盘镜像大小。
信息:指定磁盘镜像的详细信息。
刷新所选磁盘镜像的属性值。
要执行这些操作,请在虚拟介质管理器中突出显示介质,然后执行以下任一操作:
点击虚拟介质管理器工具栏中的图标。
右键点击介质并选择一个选项。
在虚拟机的设置窗口的存储页面中使用创建新的磁盘镜像。默认情况下,磁盘镜像存储在虚拟机的文件夹中。
您可以将硬盘镜像文件复制到其他主机系统,然后从主机系统导入到虚拟机中。但是,某些 Windows 访客操作系统可能要求您以与旧虚拟机类似的方式配置新虚拟机。
显示虚拟介质管理器中的硬盘选项卡,然后点击创建。
为新的虚拟硬盘镜像选择文件类型。
为虚拟硬盘选择动态分配或固定大小的存储。
配置虚拟硬盘文件的位置,并使用滑块设置虚拟硬盘的大小限制。
点击完成以创建虚拟硬盘文件。
虚拟硬盘镜像将在指定位置创建,并添加到虚拟介质管理器中的硬盘选项卡。
使用VISO 创建器工具从主机上选定的文件创建虚拟光盘镜像。
虚拟 ISO (VISO) 与真实 ISO 不同,因为文件保留在主机上,除非您选择将文件复制到访客机。这使得 VISO 创建和使用更快,并且您不需要访客增强功能。VISO 是只读的,非常适合用作安装介质或参考数据。
显示虚拟介质管理器中的光盘选项卡,然后点击创建。
将显示VISO 创建器工具。
创建虚拟 ISO 文件。
配置 ISO 文件的名称。
点击设置并选择VISO 选项选项卡。在Viso 名称字段中输入名称。
将文件添加到您的虚拟 ISO。
在主机文件系统窗格中,选择要从主机系统复制到虚拟 ISO 的文件。
点击添加项目到 VISO。文件将显示在VISO 内容窗格中。
还可以进行以下文件操作:
要在虚拟 ISO 上创建文件夹,点击新建目录。
要从虚拟 ISO 中移除文件,请在VISO 内容窗格中选择文件,然后点击从 VISO 中移除项目。
要从虚拟 ISO 中移除所有文件,点击重置 VISO 内容。
要将现有 ISO 中的所有文件内容导入到虚拟 ISO 中,请突出显示 ISO 文件名并点击将所选 ISO 导入 VISO 内容。导入的 ISO 将打开,内容会列在VISO 内容窗格中。
要从导入的 ISO 中删除文件,请在Viso 内容窗格中选择文件,然后点击从 VISO 中移除所选项目。
创建虚拟 ISO 镜像。
点击保存并关闭。
将创建具有指定名称和内容的虚拟 ISO 文件。
使用软盘创建器工具创建软盘镜像。
显示虚拟介质管理器中的软盘选项卡,然后点击创建。
将显示软盘创建器工具。
配置以下设置:
文件路径:软盘镜像的名称和位置。
大小:从支持的软盘大小列表中选择。
将磁盘格式化为 FAT 12:这是大多数软盘使用的默认格式。对于未格式化的磁盘,请勿选择此选项。
创建软盘镜像文件。
点击创建。
软盘镜像将在指定位置创建,并添加到虚拟介质管理器中的软盘选项卡。
对于 Oracle VirtualBox 支持的每个虚拟磁盘镜像,您可以单独确定它应如何受虚拟机写入操作和快照操作的影响。这适用于所有上述镜像格式(VDI、VMDK、VHD 或 HDD),并且无论镜像是否是固定大小或动态分配的。
默认情况下,镜像处于普通模式。要将现有镜像标记为以下列出的非标准模式之一,请使用 VBoxManage modifymedium。请参阅 VBoxManage modifymedium。或者,使用 VBoxManage storageattach 将镜像连接到虚拟机并指定 --mtype
参数。请参阅 VBoxManage storageattach。
可用的虚拟磁盘镜像模式如下:
普通镜像对访客机如何读写磁盘没有限制。这是默认的镜像模式。
当您按照 快照 中所述创建虚拟机快照时,普通硬盘的状态会随快照一起记录,并在恢复到快照时,其状态将被完全重置。
镜像文件本身不会重置。相反,当创建快照时,Oracle VirtualBox 会冻结镜像文件,不再对其进行写入。对于来自虚拟机的写入操作,会创建一个第二个差异镜像文件,该文件仅接收对原始镜像的更改。请参阅 差异镜像。
虽然您可以将同一个普通镜像连接到多台虚拟机,但连接到同一个镜像文件的这些虚拟机中,一次只能运行一台,否则多台机器同时写入同一个镜像文件时会发生冲突。
直通式硬盘完全不受快照影响。它们的状态在创建快照时不会保存,在恢复快照时也不会恢复。
可共享硬盘是直通式硬盘的一种变体。原则上,它们的行为完全相同。它们的状态在创建快照时不会保存,在恢复快照时也不会恢复。区别仅在于您将此类磁盘连接到多台虚拟机时。可共享磁盘可以连接到多台可同时运行的虚拟机。这使得它们适用于虚拟机之间的集群文件系统以及明确准备并发访问磁盘的类似应用程序。只有固定大小的镜像才能以这种方式使用,动态分配的镜像将被拒绝。
这是一个专家功能,误用可能导致数据丢失,因为常规文件系统不具备处理多方同时更改的能力。
不可变镜像只在虚拟机运行时暂时记住写入访问。所有更改在下次虚拟机启动时都会丢失。因此,与普通镜像不同,同一个不可变镜像可以无限制地用于多台虚拟机。
创建不可变镜像意义不大,因为它最初是空的,并且每次机器重启时都会丢失其内容。您将拥有一块在机器启动时总是未格式化的磁盘。相反,您可以首先创建一个普通镜像,然后在您认为内容有用时将其标记为不可变。
如果您对带有不可变镜像的机器进行快照,那么在每次机器启动时,这些镜像都会重置为上一个(当前)快照的状态,而不是原始不可变镜像的状态。
作为特殊情况,如果不可变镜像连接到处于保存状态的机器,或者其最后一次快照是在机器运行时创建的,则它们不会重置。这称为在线快照。因此,如果机器的当前快照是在线快照,其不可变镜像的行为将与普通镜像完全相同。要重新启用此类镜像的自动重置,请删除机器的当前快照。
Oracle VirtualBox 根本不会直接写入不可变镜像。来自机器的所有写入操作都定向到差异镜像。下次虚拟机启动时,差异镜像会重置,这样每次虚拟机启动时,其不可变镜像都具有完全相同的内容。
差异镜像仅在从 Oracle VirtualBox 内部启动机器时重置,而不是在您从机器内部请求重新启动时重置。这也是为什么当快照也存在时(它们也使用差异镜像),不可变镜像表现如上所述的原因。
如果虚拟机启动时自动丢弃差异镜像不符合您的需求,您可以使用 VBoxManage modifymedium 命令的 autoreset
参数将其关闭。请参阅 VBoxManage modifymedium。
多重连接模式镜像可以同时连接到多台虚拟机,即使这些机器同时运行。对于连接到此类镜像的每台虚拟机,都会创建一个差异镜像。因此,一台机器写入此类虚拟磁盘的数据不会被连接到该镜像的其他机器看到。每台机器都会创建自己的多重连接镜像写入历史记录。
从技术上讲,多重连接镜像的行为与不可变镜像相同,只是差异镜像不会在每次机器启动时重置。
此模式适用于共享几乎从不写入的文件,例如图片库,其中每个访客机只更改少量数据,而大部分磁盘内容保持不变。修改的块存储在相对较小的差异镜像中,共享内容仅在主机上存储一次。
只读镜像自动用于 CD/DVD 镜像,因为 CD/DVD 无法写入。
以下场景说明了各种镜像模式在快照方面的区别。
假设您已在虚拟机中安装了访客操作系统并创建了快照。之后,您的虚拟机感染了病毒,您想恢复到快照。使用普通硬盘镜像,您只需恢复快照,硬盘镜像的早期状态也会恢复,病毒感染将被撤销。使用不可变硬盘,只需关闭并启动您的虚拟机,病毒感染就会被清除。然而,使用直通式镜像,您无法通过虚拟化轻松撤销病毒感染,而必须像真实计算机一样对虚拟机进行消毒。
如果您想独立于快照保留关键数据,直通式镜像可能会很有用。由于您可以将多个镜像连接到虚拟机,您可能希望有一个用于操作系统的不可变镜像,以及一个用于数据文件的直通式镜像。
前面一节提到了差异镜像以及它们如何与快照、不可变镜像和多个磁盘连接一起使用。本节将更详细地描述差异镜像的工作原理。
差异镜像是一种特殊的磁盘镜像,仅包含与另一个镜像的差异。差异镜像本身是无用的,它必须始终引用另一个镜像。差异镜像通常被称为子镜像,它包含与其父镜像的差异。
当差异镜像处于活动状态时,它会接收来自虚拟机的所有写入操作,而不是其父镜像。差异镜像仅包含自创建以来发生更改的虚拟硬盘扇区。当机器从这样的虚拟硬盘读取扇区时,它首先查找差异镜像。如果扇区存在,则从那里返回。如果不存在,Oracle VirtualBox 则查找父镜像。换句话说,父镜像变为只读。它永远不会再被写入,但如果扇区未更改,则会从中读取。
差异镜像可以被链式连接。如果为已经存在差异镜像的虚拟磁盘创建另一个差异镜像,那么它将成为原始父镜像的孙镜像。第一个差异镜像也变为只读,写入操作只进入第二级差异镜像。当从虚拟磁盘读取时,Oracle VirtualBox 需要首先查找第二个差异镜像,如果未找到扇区,则查找第一个,然后查找原始镜像。
差异镜像的数量可以是无限的,并且每个镜像可以有多个子镜像。因此,差异镜像可以形成一个复杂的树结构,包含父镜像、兄弟镜像和子镜像,具体取决于您的机器配置的复杂程度。写入操作始终指向连接到机器的那个活动差异镜像,而对于读取操作,Oracle VirtualBox 可能需要查找链中的所有父镜像,直到找到相关扇区。您可以在虚拟介质管理器中查看这样的树。
在所有这些情况下,从虚拟机的角度来看,虚拟硬盘的行为与其他任何磁盘一样。当虚拟机运行时,会产生轻微的运行时 I/O 开销,因为 Oracle VirtualBox 可能需要多次查找扇区。然而,这并不明显,因为包含扇区信息的表始终保留在内存中,可以快速查找。
差异镜像用于以下情况:
快照。正如前一节所解释的,当您创建快照时,Oracle VirtualBox 会冻结连接到虚拟机的镜像,并为每个非直通模式的镜像创建差异镜像。从虚拟机的角度来看,虚拟磁盘继续像以前一样运行,但所有写入操作都进入差异镜像。每次您创建另一个快照时,对于每个硬盘连接,都会创建并连接另一个差异镜像,形成一个链或树。
在上面的截图中,您可以看到原始磁盘镜像现在连接到一个快照,代表快照创建时磁盘的状态。
如果您恢复快照,并希望返回到快照中存储的精确机器状态,则会发生以下情况:
Oracle VirtualBox 将复制到快照中的虚拟机设置复制回虚拟机。因此,如果您自创建快照以来对机器配置进行了更改,这些更改将被撤销。
如果快照是在机器运行时创建的,它包含一个已保存的机器状态,并且该状态也会恢复。恢复快照后,机器将处于“已保存”状态,并在下次启动时从那里恢复执行。否则,机器将处于“已关闭电源”状态并进行完整引导。
对于连接到机器的每个磁盘镜像,自当前快照创建以来包含所有写入操作的差异镜像将被丢弃,原始父镜像将再次变为活动状态。如果您恢复了根快照,那么这将是每个连接的根磁盘镜像。否则,将是其派生出的其他差异镜像。这有效地恢复了旧的机器状态。
如果您稍后删除快照以释放磁盘空间,对于每个磁盘连接,其中一个差异镜像将变得过时。在这种情况下,磁盘连接的差异镜像不能简单地删除。相反,Oracle VirtualBox 需要查看差异镜像的每个扇区,并将其复制回其父镜像。这称为“合并”镜像,可能是一个耗时的过程,具体取决于差异镜像的大小。在合并操作导致过时的差异镜像被删除之前,它还可能暂时需要大量的额外磁盘空间。
不可变镜像。当镜像切换到不可变模式时,也会创建一个差异镜像。与快照一样,父镜像变为只读,差异镜像接收所有写入操作。每次虚拟机启动时,连接到它的所有不可变镜像的各自差异镜像都会被丢弃,从而有效地在每次重启时重置虚拟机的虚拟磁盘。
您可以在同一个主机上复制硬盘镜像文件,以快速生成具有相同操作系统设置的第二台虚拟机。但是,您只能使用 Oracle VirtualBox 提供的工具复制虚拟磁盘镜像。请参阅 VBoxManage clonemedium。这是因为 Oracle VirtualBox 为每个磁盘镜像分配一个通用唯一标识符 (UUID),该 UUID 也存储在镜像内部,并且 Oracle VirtualBox 将拒绝处理使用相同编号的两个镜像。如果您不小心尝试重新导入一个您正常复制的磁盘镜像,您可以使用 VBoxManage clonevm 命令创建第二个副本并导入它。
请注意,Linux 发行版通过驱动器的 ID 识别引导硬盘。 Oracle VirtualBox 报告的驱动器 ID 是根据虚拟磁盘镜像的 UUID 确定的。因此,如果您克隆一个磁盘镜像并尝试引导复制的镜像,访客机可能无法确定自己的引导磁盘,因为 UUID 发生了变化。在这种情况下,您必须修改引导加载程序脚本中的磁盘 ID,例如 /boot/grub/menu.lst。磁盘 ID 如下所示:
scsi-SATA_VBOX_HARDDISK_VB5cfdb1e2-c251e503
复制镜像的 ID 可以通过以下方式确定:
hdparm -i /dev/sda
Oracle VirtualBox 可以选择性地禁用主机操作系统在磁盘镜像文件上执行的 I/O 缓存。
传统上,Oracle VirtualBox 将磁盘镜像文件作为普通文件打开,这导致它们像其他任何文件一样被主机操作系统缓存。这样做主要优点是速度:当访客操作系统写入磁盘并且主机操作系统缓存使用延迟写入时,写入操作可以快速报告给访客操作系统已完成,而主机操作系统可以异步执行该操作。此外,当您第二次启动虚拟机并且有足够的内存供操作系统用于缓存时,虚拟磁盘的大部分可能在系统内存中,虚拟机可以更快地访问数据。
请注意,这仅适用于镜像文件。对于驻留在远程 iSCSI 存储上的虚拟磁盘不会发生缓冲,这在企业级设置中更为常见。请参阅 iSCSI 服务器。
虽然缓冲对于在台式计算机上虚拟化少量机器是一个有用的默认设置,但这种方法也存在一些缺点:
通过主机操作系统缓存进行的延迟写入安全性较低。当访客操作系统写入数据时,它认为数据已写入,即使数据尚未到达物理磁盘。如果由于某种原因(例如断电或主机崩溃)未发生写入,数据丢失的可能性会增加。
磁盘镜像文件通常非常大。因此,缓存它们会很快耗尽整个主机操作系统缓存。根据主机操作系统缓存的效率,这可能会极大地减慢主机速度,尤其是当多台虚拟机同时运行时。例如,在 Linux 主机上,主机缓存可能导致 Linux 延迟所有写入操作,直到主机缓存几乎满,然后一次性写入所有这些更改,这可能会使虚拟机执行停滞数分钟。这可能导致访客机中出现 I/O 错误,因为 I/O 请求在那里超时。
物理内存经常被浪费,因为访客操作系统通常有自己的 I/O 缓存,这可能导致数据在访客机和主机缓存中都被缓存两次,效果甚微。
如果您决定出于上述原因禁用主机 I/O 缓存,Oracle VirtualBox 会使用自己的小缓存来缓冲写入,但不会进行读取缓存,因为这通常已经由访客操作系统执行。此外,Oracle VirtualBox 通过多个 I/O 线程完全支持其虚拟 SATA、SCSI 和 SAS 控制器的异步 I/O。
由于 IDE 控制器不支持异步 I/O,出于性能原因,您可能希望为虚拟机的虚拟 IDE 控制器保持主机缓存启用状态。
因此,Oracle VirtualBox 允许您单独配置每个 I/O 控制器是否使用主机 I/O 缓存。您可以在给定虚拟存储控制器的存储设置中选择使用主机 I/O 缓存复选框,或者使用以下 VBoxManage 命令禁用虚拟存储控制器的主机 I/O 缓存:
VBoxManage storagectl "VM name" --name <controllername> --hostiocache off
由于上述原因,Oracle VirtualBox 默认对新虚拟机使用 SATA 控制器。
Oracle VirtualBox 支持限制异步 I/O 使用的最大带宽。此外,它还支持通过带宽组共享多个镜像的限制。可以有多个这样的限制。
限制使用 VBoxManage 进行配置。以下示例创建一个名为 Limit 的带宽组,将限制设置为每秒 20 MB,并将该组分配给虚拟机的已连接磁盘:
VBoxManage bandwidthctl "VM name" add Limit --type disk --limit 20M VBoxManage storageattach "VM name" --storagectl "SATA" --port 0 --device 0 --type hdd --medium disk1.vdi --bandwidthgroup Limit VBoxManage storageattach "VM name" --storagectl "SATA" --port 1 --device 0 --type hdd --medium disk2.vdi --bandwidthgroup Limit
组中的所有磁盘共享带宽限制,这意味着在上述示例中,两个镜像的总带宽永远不能超过 20 MBps。但是,如果一个磁盘不需要带宽,另一个磁盘可以使用其组的剩余带宽。
每个组的限制可以在虚拟机运行时更改,并且更改会立即生效。以下示例将上述示例中创建的组的限制更改为 10 MBps:
VBoxManage bandwidthctl "VM name" set Limit --limit 10M
虚拟 CD/DVD 驱动器默认只支持读取。介质配置可以在运行时更改。您可以选择以下选项来提供介质数据:
主机驱动器定义访客机可以从主机驱动器中的介质读取。
镜像文件授予访客机对镜像中数据的只读访问权限。这通常是一个 ISO 文件。
空表示没有插入介质的驱动器。
在上述选项之间切换,或者更改机器访问的主机驱动器中的介质,或者更改镜像文件,都会向访客操作系统发出介质更改信号。然后访客操作系统可以对更改做出反应,例如启动安装程序。
介质更改可以被访客机阻止,Oracle VirtualBox 通过在适当情况下锁定主机驱动器来反映这一点。在这种情况下,您可以使用 VirtualBox Manager 或 VBoxManage 命令行工具强制移除介质。这实际上等同于许多 CD/DVD 驱动器提供的紧急弹出功能,并伴随所有相关的副作用。访客操作系统可能会发出错误消息,就像在真实硬件上一样,访客应用程序也可能出现异常行为。请谨慎使用此功能。
提供给访客机的驱动器识别字符串(由 Windows 设备管理器等配置工具显示)始终是 VBOX CD-ROM,无论虚拟驱动器的当前配置如何。这是为了防止每次更改配置时在访客操作系统中触发硬件检测。
标准 CD/DVD 模拟仅支持读取标准数据 CD 和 DVD 格式。作为一项实验性功能,为了获得额外功能,可以通过启用直通模式,让访客机直接访问 CD/DVD 主机驱动器。根据主机硬件,这可能允许以下功能正常工作:
如果主机 DVD 驱动器是 CD/DVD 刻录机,则从访客机内部进行 CD/DVD 写入
播放音频 CD
播放加密 DVD
要启用主机驱动器直通,您可以使用 VBoxManage storageattach 命令的 --passthrough
选项。请参阅 VBoxManage storageattach。
即使启用了直通,不安全的命令(例如更新驱动器固件)仍将被阻止。不支持视频 CD 格式,即使在直通模式下也不支持,并且无法从虚拟机播放。
在 Oracle Solaris 主机上,由于主机强制执行的安全措施,直通功能需要以真实 root 权限运行 Oracle VirtualBox。
iSCSI 代表互联网 SCSI,是一种支持通过互联网 (TCP/IP) 连接使用 SCSI 协议的标准。特别是随着千兆以太网的出现,将 iSCSI 存储服务器简单地作为远程硬盘连接到计算机网络已变得经济实惠。在 iSCSI 术语中,提供存储资源的服务器称为iSCSI 目标,而连接到服务器并访问其资源的客户端称为iSCSI 发起者。
Oracle VirtualBox 可以透明地将 iSCSI 远程存储作为虚拟硬盘呈现给虚拟机。访客操作系统将不会看到虚拟磁盘镜像(VDI 文件)与 iSCSI 目标之间的任何区别。为了实现这一点,Oracle VirtualBox 具有集成的 iSCSI 发起者。
Oracle VirtualBox 的 iSCSI 支持是根据 iSCSI 标准开发的,应该适用于所有符合标准的 iSCSI 目标。要在 Oracle VirtualBox 中使用 iSCSI 目标,您必须使用命令行。请参阅 VBoxManage storageattach。
vboximg-mount 是一个适用于 Mac OS 和 Linux 主机的命令行实用程序,它为主机系统上的 Oracle VirtualBox 虚拟磁盘镜像提供原始访问权限。使用此实用程序可以挂载、查看和可选修改磁盘镜像内容。
该实用程序基于用户空间文件系统 (FUSE) 技术,并使用 VirtualBox 运行时引擎。请确保 Oracle VirtualBox 正在主机系统上运行。
使用 vboximg-mount 时,请确保满足以下条件:
磁盘镜像未被任何其他系统(例如访客虚拟机)使用。
主机系统上没有虚拟机正在运行。
与直接循环挂载虚拟磁盘镜像相比,使用 FUSE 进行原始访问更受青睐,因为它支持快照。它可以在暴露的虚拟硬盘中选择性地合并磁盘差异镜像,提供虚拟磁盘内容的旧版本或最新版本表示。
vboximg-mount 使您能够查看有关已注册虚拟机、其连接的磁盘介质以及任何快照的信息。此外,您还可以查看磁盘镜像的分区信息。
该 vboximg-mount 命令包含对虚拟机磁盘镜像内部文件系统的实验性只读访问。此功能使您无需启动虚拟机即可从磁盘镜像中提取某些文件,并且无需在主机系统上安装第三方文件系统驱动程序。支持 FAT、NTFS、ext2、ext3 和 ext4 文件系统。
使用 --help
选项查看有关 vboximg-mount 命令用法的信息。完整的命令参考在 vboximg-mount 中描述。
当 vboximg-mount 挂载 Oracle VirtualBox 磁盘镜像时,它会在您指定的挂载点创建一个一级深的文件系统。该文件系统包括一个设备节点,该设备节点将合成的磁盘镜像表示为可读或可读写字节流。此字节流可以通过使用主机操作系统或使用其他基于 FUSE 的文件系统进行挂载。
以下示例演示如何使用 vboximg-mount 命令查看虚拟磁盘镜像的信息。
以下命令输出所有已注册虚拟机及其关联快照的详细信息:
$ vboximg-mount --list --verbose ------------------------------------------------------ VM Name: "macOS High Sierra 10.13" UUID: 3887d96d-831c-4187-a55a-567c504ff0e1 Location: /Volumes/work/vm_guests/macOS High Sierra 10.13/macOS High Sierra 10.13.vbox ----------------------- HDD base: "macOS High Sierra 10.13.vdi" UUID: f9ea7173-6869-4aa9-b487-68023a655980 Location: /Volumes/work/vm_guests/macOS High Sierra 10.13/macOS High Sierra 10.13.vdi Diff 1: UUID: 98c2bac9-cf37-443d-a935-4e879b70166d Location: /Volumes/work/vm_guests/macOS High Sierra 10.13/ Snapshots/{98c2bac9-cf37-443d-a935-4e879b70166d}.vdi Diff 2: UUID: f401f381-7377-40b3-948e-3c61241b1a42 Location: /Volumes/work/vm_guests/macOS High Sierra 10.13/ Snapshots/{f401f381-7377-40b3-948e-3c61241b1a42}.vdi ----------------------- HDD base: "simple_fixed_disk.vdi" UUID: ffba4d7e-1277-489d-8173-22ca7660773d Location: /Volumes/work/vm_guests/macOS High Sierra 10.13/simple_fixed_disk.vdi Diff 1: UUID: aecab681-0d2d-468b-8682-93f79dc97a48 Location: /Volumes/work/vm_guests/macOS High Sierra 10.13/ Snapshots/{aecab681-0d2d-468b-8682-93f79dc97a48}.vdi Diff 2: UUID: 70d6b34d-8422-47fa-8521-3b6929a1971c Location: /Volumes/work/vm_guests/macOS High Sierra 10.13/ Snapshots/{70d6b34d-8422-47fa-8521-3b6929a1971c}.vdi ------------------------------------------------------ VM Name: "debian" UUID: 5365ab5f-470d-44c0-9863-dad532ee5905 Location: /Volumes/work/vm_guests/debian/debian.vbox ----------------------- HDD base: "debian.vdi" UUID: 96d2e92e-0d4e-46ab-a0f1-008fdbf997e7 Location: /Volumes/work/vm_guests/debian/ol7.vdi Diff 1: UUID: f9cc866a-9166-42e9-a503-bbfe9b7312e8 Location: /Volumes/work/vm_guests/debian/Snapshots/ {f9cc866a-9166-42e9-a503-bbfe9b7312e8}.vdi
以下命令输出指定磁盘镜像的分区信息:
$ vboximg-mount --image=f9ea7173-6869-4aa9-b487-68023a655980 --list Virtual disk image: Path: /Volumes/work/vm_guests/macOS High Sierra 10.13/macOS High Sierra 10.13.vdi UUID: f9ea7173-6869-4aa9-b487-68023a655980 # Start Sectors Size Offset Type 1 40 409599 199.9M 20480 EFI System 2 409640 67453071 32.1G 209735680 Hierarchical File System Plus (HFS+) 3 67862712 1269535 107.8M 34745708544 Apple Boot (Recovery HD)
以下步骤展示如何使用 vboximg-mount 命令在主机操作系统上挂载虚拟磁盘镜像的一个分区。
在主机操作系统上创建挂载点。例如:
$ mkdir macos_sysdisk
显示虚拟磁盘镜像的分区信息。
$ vboximg-mount --image=uuid --list
其中 uuid 是磁盘镜像的 UUID。
使用 vboximg-mount 对虚拟磁盘镜像上的分区执行 FUSE 挂载。例如:
$ vboximg-mount --image=uuid -p 2 macos_sysdisk
其中 uuid 是磁盘镜像的 UUID。
在此示例中,分区 2 挂载在 macos_sysdisk 挂载点。挂载包括磁盘镜像的所有快照。
使用主机操作系统挂载 vhdd
设备节点。FUSE 挂载的设备节点表示虚拟磁盘镜像。
$ ls macos_sysdisk macOS High Sierra 10.13.vdi vhdd $ sudo mount macos_sysdisk/vhdd /mnt