
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
Der Inhalt der VMX-Datei sollte im Image-Protokoll von VMware protokolliert werden.
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"
Starten Sie das Bild, indem Sie öffnen
example.vmx
.
Antwort3
Es gibt ein Skript dafür unter
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}"