说明

由于博客已经全面由 CSDN 迁往 SegmentFault, 故将部分文章进行改写和迁移. 这些文章的开头均有本说明. 由于时间较为久远, 部分内容可能发生变更, 稳重的实例请斟酌后再尝试.

环境

Manjaro Linux 19.0, Linux Kernel 5.5, XFCE 4.4, Virtual Box 6.1 (均是英文版)

VBox 虚拟机的结构

在一个正确的VBox虚拟机中,可以发现以下目录组成。
以我的Kali Linux虚拟机为例。

Kali Linux
├── Kali Linux.vbox
├── Kali Linux.vbox-prev
├── Kali Linux.vdi
├── Logs
│   ├── VBox.log
│   ├── VBox.log.1
│   ├── VBox.log.2
│   └── VBox.log.3
└── Snapshots
    └── 2020-03-02T02-46-17-417352000Z.sav

2 directories, 8 files

如下所示。

VBox 文件:Kali Linux.vbox

这是VBox虚拟机的配置文件,包含了对虚拟机软硬件的描述,使用XML语法。
内容如下所示。

<?xml version="1.0"?>
<!--
** DO NOT EDIT THIS FILE.
** If you make changes to this file while any VirtualBox related application
** is running, your changes will be overwritten later, without taking effect.
** Use VBoxManage or the VirtualBox Manager GUI to make changes.
-->
<VirtualBox xmlns="http://www.virtualbox.org/" version="1.16-linux">
  <Machine uuid="{698fd744-e86c-4197-8e8c-6d8c6c0053ee}" name="Kali Linux" OSType="Debian_64" stateFile="Snapshots/2020-03-02T02-46-17-417352000Z.sav" snapshotFolder="Snapshots" lastStateChange="2020-03-02T02:46:53Z">
    <MediaRegistry>
      <HardDisks>
        <HardDisk uuid="{425440d0-a459-4c9b-bdb0-c8c4e9d0b2f6}" location="Kali Linux.vdi" format="VDI" type="Normal"/>
      </HardDisks>
      <DVDImages>
        <Image uuid="{843ff379-14b6-45d7-9c08-3f91e9c47d9a}" location="/home/felix/Documents/disks/ISO/kali-linux-2020.1a-installer-amd64.iso"/>
        <Image uuid="{5b5ebce9-6c35-4556-9afe-1082b2557215}" location="/usr/lib/virtualbox/additions/VBoxGuestAdditions.iso"/>
      </DVDImages>
    </MediaRegistry>
    <ExtraData>
      <ExtraDataItem name="GUI/LastCloseAction" value="SaveState"/>
      <ExtraDataItem name="GUI/LastNormalWindowPosition" value="0,28,640,480,max"/>
      <ExtraDataItem name="GUI/LastScaleWindowPosition" value="640,300,640,480"/>
      <ExtraDataItem name="GUI/ScaleFactor" value="1.5"/>
    </ExtraData>
    <Hardware>
      <CPU>
        <PAE enabled="false"/>
        <LongMode enabled="true"/>
        <X2APIC enabled="true"/>
        <HardwareVirtExLargePages enabled="false"/>
      </CPU>
      <Memory RAMSize="4096"/>
      <HID Pointing="USBTablet"/>
      <Display controller="VMSVGA" VRAMSize="16"/>
      <VideoCapture screens="1" file="." fps="25"/>
      <RemoteDisplay enabled="true"/>
      <BIOS>
        <IOAPIC enabled="true"/>
        <SmbiosUuidLittleEndian enabled="true"/>
      </BIOS>
      <USB>
        <Controllers>
          <Controller name="OHCI" type="OHCI"/>
        </Controllers>
      </USB>
      <Network>
        <Adapter slot="0" enabled="true" MACAddress="0800271DB31D" type="82540EM">
          <DisabledModes>
            <InternalNetwork name="intnet"/>
            <GenericInterface driver="VBOX"/>
            <NATNetwork name="NatNetwork"/>
          </DisabledModes>
          <BridgedInterface name="wlp1s0"/>
        </Adapter>
      </Network>
      <AudioAdapter codec="AD1980" driver="Pulse" enabled="true" enabledIn="false"/>
      <RTC localOrUTC="UTC"/>
      <Clipboard/>
      <DragAndDrop mode="Bidirectional"/>
      <GuestProperties>
        <GuestProperty name="/VirtualBox/GuestAdd/Revision" value="135662" timestamp="1582981113600000000" flags=""/>
        <GuestProperty name="/VirtualBox/GuestAdd/Version" value="6.1.2" timestamp="1582981113597531000" flags=""/>
        <GuestProperty name="/VirtualBox/GuestAdd/VersionExt" value="6.1.2" timestamp="1582981113599930000" flags=""/>
        <GuestProperty name="/VirtualBox/GuestInfo/OS/Product" value="Linux" timestamp="1582981113594753000" flags=""/>
        <GuestProperty name="/VirtualBox/GuestInfo/OS/Release" value="5.4.0-kali4-amd64" timestamp="1582981113595029000" flags=""/>
        <GuestProperty name="/VirtualBox/GuestInfo/OS/Version" value="#1 SMP Debian 5.4.19-1kali1 (2020-02-17)" timestamp="1582981113596947000" flags=""/>
        <GuestProperty name="/VirtualBox/HostInfo/GUI/LanguageID" value="C" timestamp="1583117177393486000" flags="RDONLYGUEST"/>
        <GuestProperty name="/VirtualBox/HostInfo/VBoxRev" value="135662" timestamp="1583063544812066002" flags="TRANSIENT, RDONLYGUEST"/>
        <GuestProperty name="/VirtualBox/HostInfo/VBoxVer" value="6.1.2" timestamp="1583063544812066000" flags="TRANSIENT, RDONLYGUEST"/>
        <GuestProperty name="/VirtualBox/HostInfo/VBoxVerExt" value="6.1.2" timestamp="1583063544812066001" flags="TRANSIENT, RDONLYGUEST"/>
        <GuestProperty name="/VirtualBox/VMInfo/ResetCounter" value="3" timestamp="1582984372225316000" flags="TRANSIENT, RDONLYGUEST"/>
        <GuestProperty name="/VirtualBox/VMInfo/ResumeCounter" value="5" timestamp="1583104345717747000" flags="TRANSIENT, RDONLYGUEST"/>
      </GuestProperties>
    </Hardware>
    <StorageControllers>
      <StorageController name="IDE" type="PIIX4" PortCount="2" useHostIOCache="true" Bootable="true">
        <AttachedDevice passthrough="false" type="DVD" hotpluggable="false" port="1" device="0">
          <Image uuid="{843ff379-14b6-45d7-9c08-3f91e9c47d9a}"/>
        </AttachedDevice>
      </StorageController>
      <StorageController name="SATA" type="AHCI" PortCount="1" useHostIOCache="false" Bootable="true" IDE0MasterEmulationPort="0" IDE0SlaveEmulationPort="1" IDE1MasterEmulationPort="2" IDE1SlaveEmulationPort="3">
        <AttachedDevice type="HardDisk" hotpluggable="false" port="0" device="0">
          <Image uuid="{425440d0-a459-4c9b-bdb0-c8c4e9d0b2f6}"/>
        </AttachedDevice>
      </StorageController>
    </StorageControllers>
  </Machine>
</VirtualBox>

我们将在下一篇中仔细研究这个文件。

VBox-prev 文件:Kali Linux.vbox-prev

这是历史版本的VBox配置文件,有备份的作用,内容与Kali Linux.vbox相似,但属性不同,在这里我们不过多描述。

VDI 文件:Kali Linux.vdi

VDI 文件是Virtual Box独家格式的虚拟硬盘文件,在VBox文件中指定。通过GHex编辑器,我们可以看到这个VDI 文件的内容。
在这里插入图片描述可以看到,它的文件头是:

<<< Oracle VM VirtualBox Disk Image >>>

除了VDI文件,Virtual Box 虚拟机还支持VHD,VMDK 格式的虚拟硬盘。其中,VMDK 格式正是VMWare虚拟机使用的虚拟硬盘格式。

Virtual Box与VMWare的兼容性问题

如上所述,Virtual Box可以采用VMWare的虚拟磁盘。通过创建带有VMDK磁盘的虚拟机,可以方便的将其在VBox与VMWare之间来回移动而正确运行。但是,经本人实验发现,这种方法只适用于在创建时选择“使用一个VMDK文件作为虚拟硬盘“的选项。本人亲测,如果VMWare虚拟机采用了多个VMDK文件(Split选项),只有一个没有数字序号的VMDK文件对于VBox是合法的,可读的。

然而,当我们启动这块虚拟磁盘时,会出现类似

INT xxx code cannot be executed: Error!

的错误,因此,对于使用多块虚拟磁盘的VMWare虚拟机,Virtual Box不能使用,但是,对于使用一块虚拟磁盘的VMWare虚拟机,VBox 可以正确启动,运行。

Logs 文件夹:VBox.log, VBox.log.1, ...

每次VBox 启动,都会产生一个 log (日志)文件,可以提供对错误排查等方面的信息。以下是VBox.log文件的内容

00:00:01.677201 VirtualBox VM 6.1.2 r135662 linux.amd64 (Jan 14 2020 22:33:16) release log
00:00:01.677205 Log opened 2020-03-01T11:52:06.893608000Z
00:00:01.677206 Build Type: release
00:00:01.677210 OS Product: Linux
00:00:01.677213 OS Release: 5.5.2-1-MANJARO
00:00:01.677215 OS Version: #1 SMP PREEMPT Tue Feb 4 19:22:35 UTC 2020
00:00:01.677250 DMI Product Name: HP ZBook 14u G5
00:00:01.677265 DMI Product Version: 
00:00:01.677273 Firmware type: UEFI
00:00:01.677817 Secure Boot: Disabled
...... 
04:49:22.678899 E1000#0: TX frames up to 32768: 0
04:49:22.678902 E1000#0: Larger TX frames    : 0
04:49:22.678904 E1000#0: Max TX Delay        : 0
04:49:22.724032 GIM: KVM: Resetting MSRs
04:49:22.730560 Changing the VM state from 'DESTROYING' to 'TERMINATED'
04:49:22.733887 Console: Machine state changed to 'Saved'
04:49:23.467202 GUI: Passing request to close Runtime UI from machine-logic to UI session.

可以看出,Virtual Box把所有的行为,数据都输出到了这些log文件里,对调试虚拟机非常有用。但是文件体积因此非常大,如下是ls结果。

~/VirtualBox VMs/Kali Linux/Logs » ls -l                                                                                 felix@felix-zbook
total 584
-rw------- 1 felix felix 139958 Mar  2 10:46 VBox.log
-rw------- 1 felix felix 209527 Mar  1 11:00 VBox.log.1
-rw------- 1 felix felix 128813 Feb 29 21:25 VBox.log.2
-rw------- 1 felix felix 107014 Feb 29 21:16 VBox.log.3

Snapshots文件夹:2020-03-02T02-46-17-417352000Z.sav

Snapshot,懂虚拟机的都明白,不用说了吧。。。


FelixWang
7 声望0 粉丝

Access is denied to view this.