VMWARE RVTOOLS → STACKIT · TUTORIAL

Reading RVTools vInfo, vDisk and vNetwork data for a STACKIT migration

Three sheets of an RVTools export carry almost everything StackToIT needs for a VMware estate: vInfo describes the machine, vDisk its disks, vNetwork its adapters. This walk-through takes a seven-machine demo export, runs the assessment and follows single columns into the files the run wrote, including one stray row that stops the draft.

The walk-through in six steps

  1. Put the sheets in one folder

    Export the RVTools sheets as CSV files into one folder, or keep the .xlsx workbook. The demo folder holds RVTools_tabvInfo.csv, RVTools_tabvDisk.csv and RVTools_tabvNetwork.csv. If the input type is not detected, add --input rvtools.

  2. Run the assessment

    stacktoit assess ./rvtools-export ./vmware-migration reads the files on your computer. Nothing is installed in the VMware environment and StackToIT does not connect to vCenter.

  3. Start with the architect report

    engineering/architect-report.md lists every unit with class, findings and open settings, and names the rows the run could not place. index.html shows the same per unit.

  4. Follow one VM across the sheets

    A vInfo row becomes a unit named vm.<name>. Its vDisk rows become the boot volume and further volumes, its vNetwork rows become network interfaces. The next four sections show this on real rows.

  5. Read what did not match

    A detail row that names no VM of vInfo is reported with its row number. It is a source gap, and the draft waits until it is resolved.

  6. Answer the open settings and run again

    What the export cannot state, such as machine types, subnet prefixes and DNS servers, goes into the files in review/. The next run reads them.

vDisk: capacity in MiB becomes size in GiB

A seven-machine export written for this page and assessed by StackToIT on 4 November 2026. Left: the two vDisk rows of erp-app01. Right: the resource blocks of the STACKIT Terraform the engine wrote for them; the comment lines above each block in the file are left out here.

Example inputRVTools_tabvDisk.csv
VM,Disk,Capacity MiB,Raw,Disk Mode,Sharing mode,Thin,Controller,Shared Bus,Disk Path,VM UUID
erp-app01,Hard disk 1,61440,False,persistent,sharingNone,True,SCSI controller 0,noSharing,[ds-prod-01] erp-app01/erp-app01.vmdk,5001-aaaa-0001
erp-app01,Hard disk 2,143360,False,persistent,sharingNone,True,SCSI controller 0,noSharing,[ds-prod-01] erp-app01/erp-app01_1.vmdk,5001-aaaa-0001
STACKIT Terraform by StackToITterraform/compute.tf
resource "stackit_server" "vm_erp_app01" {
  project_id        = var.project_id
  name              = "erp-app01"
  machine_type      = var.vm_erp_app01_machine_type
  availability_zone = var.availability_zone
  boot_volume = {
    source_type = "image"
    source_id   = var.vm_erp_app01_image_id
    size        = 60
  }
  network_interfaces = [stackit_network_interface.vm_erp_app01_nic1.network_interface_id]
}

resource "stackit_volume" "vm_erp_app01_disk2" {
  project_id        = var.project_id
  name              = "erp-app01-disk2"
  availability_zone = var.availability_zone
  size              = 140
  performance_class = var.vmware_volume_performance_class
}
  • Hard disk 1 is the boot volume

    61440 MiB is 60 GiB. The server starts from an image that you convert from this disk, and the boot volume is sized 60.

  • Every further disk is a volume

    Hard disk 2, 143360 MiB, becomes a 140 GiB volume. The comment in the file says its data is copied after the volume exists: the draft plans the volume, not the copy.

  • The machine type stays yours

    CPUs and Memory of vInfo (4 and 16384) appear only in the description of the machine type variable, as 4 vCPU and 16 GiB. You choose the STACKIT type.

vDisk: a raw device ends the automatic path

From the same run. Left: the three disks of erp-db01, the last one with Raw = True on a physicalSharing bus. Right: the part of assessment.json that records the decision for that VM (finding identifiers left out).

Example inputRVTools_tabvDisk.csv
VM,Disk,Capacity MiB,Raw,Disk Mode,Sharing mode,Thin,Controller,Shared Bus,Disk Path,VM UUID
erp-db01,Hard disk 1,102400,False,persistent,sharingNone,False,SCSI controller 0,noSharing,[ds-prod-02] erp-db01/erp-db01.vmdk,5001-aaaa-0002
erp-db01,Hard disk 2,512000,False,persistent,sharingNone,False,SCSI controller 1,noSharing,[ds-prod-02] erp-db01/erp-db01_1.vmdk,5001-aaaa-0002
erp-db01,Hard disk 3,512000,True,persistent,sharingNone,False,SCSI controller 2,physicalSharing,[ds-san-01] erp-db01/erp-db01_rdm.vmdk,5001-aaaa-0002
StackToIT assessmentassessment.json
{
  "id": "vm.erp-db01",
  "result": {
    "class": "MANUAL_REVIEW",
    "confidence": "MEDIUM",
    "findings": [
      {
        "severity": "critical",
        "message": "Raw device mapping: the LUN is not part of the VM image, so an image export does not carry its data; it needs a block- or application-level copy to a STACKIT volume."
      },
      {
        "severity": "critical",
        "message": "Shared or multi-writer disks (clusters such as WSFC or Oracle RAC). Shared block storage for several servers is not verified on STACKIT in this knowledge base; the cluster design has to be reviewed."
      },
      {
        "severity": "info",
        "message": "Not verifiable statically (snapshots not visible): The VM has snapshots; consolidate them before export — only the current state is migrated."
      }
    ]
  }
}
  • Class changes to manual review

    erp-db01 is the only one of the seven machines classified MANUAL_REVIEW, and compute.tf has no server block for it.

  • Two findings from one row

    The same third disk raises a raw-device finding and a shared-disk finding, because Shared Bus is physicalSharing. Read both before you plan the copy.

  • Why it matters

    A raw LUN is not inside the VMDK files, so an image export does not carry its data. The finding asks for a block-level or application-level copy to a STACKIT volume.

vNetwork: one row per adapter

From the same run. Left: the two adapter rows of gw-edge01. Right: the network interfaces the engine wrote for them.

Example inputRVTools_tabvNetwork.csv
VM,NIC label,Adapter,Network,Switch,Connected,IPv4 Address,VM UUID
gw-edge01,Network adapter 1,Vmxnet3,PG-Edge,dvs-edge,True,192.0.2.10,5001-aaaa-0005
gw-edge01,Network adapter 2,Vmxnet3,PG-ERP-App,dvs-erp,True,10.40.10.1,5001-aaaa-0005
STACKIT Terraform by StackToITterraform/compute.tf
resource "stackit_network_interface" "vm_gw_edge01_nic1" {
  project_id = var.project_id
  network_id = stackit_network.network_PG_Edge.network_id
  ipv4       = "192.0.2.10"
}

resource "stackit_network_interface" "vm_gw_edge01_nic2" {
  project_id = var.project_id
  network_id = stackit_network.network_PG_ERP_App.network_id
  ipv4       = "10.40.10.1"
}
  • The Network column picks the network

    PG-Edge and PG-ERP-App are two port groups, so the two interfaces point at two different STACKIT networks.

  • IPv4 Address is kept

    Both interfaces carry the address from the export. An adapter with an empty address, like the one of arch-old01, gets an interface without a fixed address.

  • The switch is not carried

    dvs-edge and dvs-erp are distributed switches. The run lists the switch among the properties the draft does not carry, because a STACKIT network has no counterpart for it.

One stray vDisk row and no draft

Our first run of this estate had one extra row in the vDisk sheet, for a machine that is not in vInfo. Left: that row. Right: what the run recorded about it, from assessment.json.

Example inputRVTools_tabvDisk.csv
VM,Disk,Capacity MiB,Raw,Disk Mode,Sharing mode,Thin,Controller,Shared Bus,Disk Path,VM UUID
retired-vm09,Hard disk 1,51200,False,persistent,sharingNone,True,SCSI controller 0,noSharing,[ds-prod-01] retired-vm09/retired-vm09.vmdk,5001-aaaa-0099
StackToIT assessmentassessment.json
{
  "summary": {
    "source_status": "RVTOOLS_DETAIL_UNMATCHED",
    "source_file_gaps": [
      {
        "path": ".#vDisk",
        "kind": "RVTOOLS_DETAIL_UNMATCHED",
        "detail": "1 of 11 vDisk rows could not be attributed to exactly one vInfo VM (match rate 10/11); they are attached to no VM: row 12 VM \"retired-vm09\": no VM of vInfo has the name \"retired-vm09\" with the UUID 5001-aaaa-0099"
      }
    ],
    "blocked_outputs": [
      {
        "output": "STACKIT draft (terraform/)",
        "reason": "a source file was not read in full (summary.source_file_gaps); no STACKIT draft is generated from a source that was not seen in full"
      },
      {
        "output": "migration waves (migration/technical-sequencing.md, units[].wave)",
        "reason": "a source file was not read in full (summary.source_file_gaps); a wave orders the whole estate and what is missing may hold units and dependencies"
      }
    ]
  }
}
  • Nothing was drafted

    All 12 units were assessed, but the run wrote no Terraform and no waves, because it does not draft from a source it did not see in full.

  • The message names the row

    It states the sheet, the row, the VM name and the UUID that matched nothing, and the match rate of 10 of 11 rows.

  • Remove the row and run again

    With that row deleted, the same estate produced the draft: 10 units generated, 2 left for the architect, 24 variables. All other snippets on this page come from that second run.

Which column decides what

Sheet and columnWhat the run didWhere to read it
vInfo · Templatetpl-rhel9 is marked True: class REPLATFORM, target STACKIT image, no Terraform block. A manual step asks you to decide how it moves.assessment.json, execution/manual/actions.md
vInfo · Powerstatearch-old01 is powered off: an info finding asks whether it is still needed. The draft writes no power state for the server; power-state is one of the open settings you decide.engineering/architect-report.md
vInfo · CPUs, MemoryOnly stated in the description of the machine type variable of each server.terraform/variables.tf
vInfo · OS according to the configuration filelegacy-web01 reads CentOS 7: a warning that the guest is past its vendor's support. The VMware Tools column is not checked and is left to a person.engineering/architect-report.md
vInfo · Datacenter, Cluster, Host, PathListed among the critical settings that stay with you, such as source-datacenter, source-cluster and datastore. They are not carried into Terraform.engineering/analysis-details.md
vDisk · Capacity MiBRounded up to whole GiB: 61440 becomes 60, 143360 becomes 140.terraform/compute.tf
vDisk · Raw, Shared BusCritical findings on erp-db01. The unit moves to MANUAL_REVIEW and no server is drafted.assessment.json
vDisk · Thin, Controller, Disk ModeThin and Controller are listed as properties the draft does not carry. Disk Mode stays an open setting to confirm.engineering/architect-report.md
vNetwork · Adapterlegacy-web01 uses E1000: an info finding says to check the guest network configuration after conversion.engineering/architect-report.md
vNetwork · ConnectedThe adapter of arch-old01 is not connected. The interface is still drafted, and the connection state is an open setting.terraform/compute.tf, engineering/analysis-details.md

Without the vSnapshot and vMemory sheets the run warns that snapshots and memory reservation of the 7 VMs are unknown, not none. Add both sheets to the export.

Before you run: make the export join cleanly

  • Export all sheets in one RVTools run

    A disk added between two exports is a row without a matching machine. One run, one moment, one set of files.

  • Every vDisk and vNetwork row names a VM of vInfo

    Name and, where stated, UUID must belong to the same machine. The run reports a mismatched row with its sheet, row number, name and UUID.

  • Keep vSnapshot and vMemory in the export

    They turn unknown snapshots and reservations into stated ones. The backup checklist for VMware estates builds on them.

  • Decide about templates and powered-off machines

    They are assessed like any other row. Decide early which ones you keep, so the review queue shows the machines that matter.

  • Read a run with gaps anyway

    The units and their classes are written even when the draft is withheld, so you can already see raw devices, end-of-support guests and multi-adapter machines.

Questions about the RVTools sheets

Which RVTools sheets does StackToIT need?

vInfo is the sheet the run starts from. In this walk-through vDisk supplied the disks and vNetwork the adapters. vSnapshot and vMemory add snapshots and memory reservation; when they are missing, the run says so and treats those values as unknown.

Does a row that does not match make the run fail?

No. The run completes and assesses every unit, but it writes no Terraform and no waves until the row is fixed or removed. The console says the source is incomplete.

What happens to VLAN IDs and virtual switches?

Each port group becomes a STACKIT network. The run states that VLAN IDs and virtual switches have no meaning on STACKIT, so the subnet prefix of each network is a variable you set. Addresses seen in the export are listed in the variable description.

Why do disk sizes in Terraform differ from the export?

RVTools reports MiB, the draft sizes volumes in GiB and rounds up. Confirm that the size fits the workload; the run lists it as a setting for you to confirm.

Can I use the .xlsx workbook instead of CSV files?

Yes. The public documentation shows stacktoit assess ./rvtools.xlsx ./vmware-migration. The sheets are read the same way.

Sources

Your next move: STACKIT.

Tell us about your estate. We show you what StackToIT delivers for it: target architecture, Terraform artifacts and a structured migration plan.