Wie stellt man eine VMX-Datei für VMware-Images wieder her?

Wie stellt man eine VMX-Datei für VMware-Images wieder her?

Ich habe versehentlich eine VMX-Datei aus einem VMware-Image entfernt, während es ausgeführt wurde.

Wie kann ich das wiederherstellen?

Antwort1

Schlechte Nachrichten: Ich glaube, Sie müssen es neu erstellen.

Gute Neuigkeiten: Die VMDK enthält die gesamte Festplatte, sodass die meisten „wichtigen“ Dinge dort enthalten sind.

Erstellen Sie also eine neue VM und konfigurieren Sie dann die Festplatte(n) so, dass sie diebestehendeVMDK.

Außerdem sollten Fragen dieser Art wirklich auf „superuser.com“ gepostet werden – und nicht auf „stackoverflow.com“.

Antwort2

  1. Der Inhalt der VMX-Datei sollte im Image-Protokoll von VMware protokolliert werden.

  2. Kopieren Sie den Inhalt wie unten in eine Datei (dieser Inhalt sollte sich zwischen „Konfiguration“ und „USER DEFAULT“ im Image-Protokoll von VMware befinden) und benennen Sie diese Datei wie folgt example.vmx.

    config.version = "8"
    virtualHW.version = "4"
    floppy0.present = "true"
    nvram = "VNTco012.nvram"
    deploymentPlatform = "windows"
    virtualHW.productCompatibility = "hosted"
    tools.upgrade.policy = "manual"
    powerType.powerOff = "default"
    powerType.powerOn = "default"
    powerType.suspend = "default"
    powerType.reset = "default"
    displayName = "VNTco012"
    extendedConfigFile = "VNTco012.vmxf"
    scsi0.present = "true"
    scsi0.sharedBus = "none"
    scsi0.virtualDev = "lsilogic"
    memsize = "2048"
    scsi0:0.present = "true"
    scsi0:0.fileName = "VNTco012.vmdk"
    scsi0:0.deviceType = "scsi-hardDisk"
    sched.scsi0:0.shares = "normal"
    ide0:0.present = "true"
    ide0:0.clientDevice = "true"
    ide0:0.fileName = "/usr/lib/vmware/isoimages/windows.iso"
    ide0:0.deviceType = "atapi-cdrom"
    ide0:0.startConnected = "false"
    floppy0.startConnected = "false"
    floppy0.fileName = "/dev/fd0"
    floppy0.clientDevice = "true"
    ethernet0.present = "true"
    ethernet0.networkName = "VM Network 1007"
    ethernet0.addressType = "vpx"
    ethernet0.generatedAddress = "00:50:56:aa:40:b9"
    guestOSAltName = "Microsoft Windows Server 2003, Standard Edition (32-bit)"
    guestOS = "winnetstandard"
    uuid.bios = "50 2a 7f e5 bc 42 27 8b-d0 04 3f 47 3c d8 3a ed"
    log.fileName = "vmware.log"
    snapshot.action = "keep"
    sched.cpu.min = "0"
    sched.cpu.units = "mhz"
    sched.cpu.shares = "normal"
    sched.mem.minsize = "0"
    sched.mem.shares = "normal"
    toolScripts.afterPowerOn = "true"
    toolScripts.afterResume = "true"
    toolScripts.beforeSuspend = "true"
    toolScripts.beforePowerOff = "true"
    scsi0:0.redo = ""
    tools.remindInstall = "FALSE"
    vmware.tools.requiredversion = "7299"
    ethernet0.startConnected = "TRUE"
    tools.deployPkg.fileName = ""
    numvcpus = "2"
    scsi0:1.present = "true"
    scsi0:1.fileName = "VNTco012_1.vmdk"
    scsi0:1.deviceType = "scsi-hardDisk"
    
  3. Starten Sie das Bild, indem Sie öffnen example.vmx.

Antwort3

Es gibt ein Skript dafür unter

https://kb.vmware.com/selfservice/microsites/search.do?language=en_US&cmd=displayKC&externalId=1023880

Ich persönlich hatte Probleme, es auf Mac OS ElCapitan zum Laufen zu bringen. Das Skript ist leider schlecht dokumentiert.

Ich habe die folgenden Schritte versucht:

#!/bin/bash
# https://kb.vmware.com/selfservice/microsites/search.do?language=en_US&cmd=displayKC&externalId=1023880
VMXFILENAME=$(sed -n 's/^.*Config file: .*\/\(.\+\)$/\1/p' vmware.log)
echo $VMXFILENAME
exit
echo -e "#\041/usr/bin/vmware" > ${VMXFILENAME}
echo '.encoding = "UTF-8"' >> ${VMXFILENAME}
sed -n '/DICT --- CONFIGURATION/,/DICT ---/ s/^.*DICT \+\(.\+\) = \(.\+\)$/\1 = "\2"/p' vmware.log >> ${VMXFILENAME}

also wollte ich zuerst wissen, ob der Konfigurationsdateiname richtig erkannt wird. Ein grep zeigt, was zu erwarten ist

 grep "Config file:"  vmware.log
 2017-01-25T19:35:35.533+01:00| vmx| I125: Config file: /vmware/vm.vmwarevm/vm.vmx

aber das Skript erhält nicht den richtigen Dateinamen, sondern zeigt ein leeres Ergebnis an. Also habe ich die Zeile zum Abrufen des Dateinamens ersetzt durch

VMXFILENAME=grep "Config file: " vmware.log | cut -f3 -d"|" | cut -f3 -d ":"

was ich persönlich verständlicher finde. Zuerst suchen wir nach der Zeile, die "Konfigurationsdatei" enthält. In dieser Zeile suchen wir nach dem dritten Feld, das durch ein Pipe-Zeichen getrennt ist, und dann nach dem dritten Feld, das durch einen Doppelpunkt getrennt ist. Und ja, tatsächlich bestimmt dies den Namen der Konfigurationsdatei.

Nun wollen wir sehen, ob dadurch eine korrekte VMX-Datei erstellt wird. Zuerst stellen wir sicher, dass wir die ursprüngliche Datei nicht überschreiben, daher wird die letzte Zeile wie folgt geändert:

>> ${VMXFILENAME}.new

und jetzt können wir diesen Teil auskommentieren, um ihn zu testen. Bevor wir dies tun, stellen wir sicher, dass eine Sicherungskopie unserer ursprünglichen VMX-Datei erstellt wird (und nur einmal, wenn wir dieses Skript neu starten müssen ...)

echo "trying to create a new $VMXFILENAME"
today=`date "+%Y-%m-%d"`
if [ -f $VMXFILENAME ]
then
  if [ ! -f $VMXFILENAME.$today ]
  then
    echo "creating backup of $VMXFILENAME as $VMXFILENAME.$today"
    mv $VMXFILENAME $VMXFILENAME.$today
  else
    echo "backup $VMXFILENAME.$today exists"
  fi
else
  echo "$VMXFILENAME not found" 1>&2
  if [ !-f $VMXFILENAME.$today ]
  then
    exit 1
  fi
fi

und das zweite sed funktioniert auch nicht wie erwartet (seufz ...)

Also habe ich am Ende auch das sed durch ein paar Zeilen awk ersetzt

#!/bin/bash
# https://kb.vmware.com/selfservice/microsites/search.do?language=en_US&cmd=displayKC&externalId=1023880
VMXFILENAME=`grep "Config file: " vmware.log | cut -f3 -d"|" | cut -f3 -d ":"`
echo "trying to create a new $VMXFILENAME"
today=`date "+%Y-%m-%d"`
if [ -f $VMXFILENAME ] 
then
  if [ ! -f $VMXFILENAME.$today ]
  then
    echo "creating backup of $VMXFILENAME as $VMXFILENAME.$today"
    mv $VMXFILENAME $VMXFILENAME.$today
  else
    echo "backup $VMXFILENAME.$today exists"
  fi 
else
  echo "$VMXFILENAME not found" 1>&2
  if [ !-f $VMXFILENAME.$today ]
  then
    exit 1
  fi
fi
echo -e "#\041/usr/bin/vmware" > ${VMXFILENAME}
echo '.encoding = "UTF-8"' >> ${VMXFILENAME}
#sed -n '/DICT --- CONFIGURATION/,/DICT ---/ s/^.*DICT \+\(.\+\) = \(.\+\)$/\1 = "\2"/p' vmware.log 
gawk '
# use pipe sign as a field separator
BEGIN { FS="|" }
# check whether we are in the range of lines after DICT --CONFIGURATION
/DICT --- CONFIGURATION/ { inconfig=1;next }
/DICT --- [A-Z+]/        { inconfig=0;next }
/DICT/ && (inconfig==1) { 
          if (match($3,/.*DICT[ \t]+(.*)/,groups)) {
            print groups[1] 
          }
        }
' vmware.log >> ${VMXFILENAME}
echo "please check ${VMXFILENAME}"

verwandte Informationen