Recover vmx from log file
Recover vmx from log file
On the VMware community forums, Eric Tung has devised a little jewel of code that automates recreating a vmx file from a recent vmware.log file.
This is possible as on every boot of a virtual machine, the vmware.log gets a copy from your virtual hardware settings written out into the vmware.log logfile along with some extra information such as the date and time this VM was run. The script extracts the relevant part for you and eliminates the risk of making a typo while doing this by hand. It is written in perl, just a few lines long and shows the true power of what a bit of perl can do for you 🙂
vmxRecover.pl code
#!/usr/bin/perl use strict; use warnings; if ($#ARGV != 0) { print "Recovers .vmx files from .log files. Usage:\n"; print "$0 logfile > vmxfile\n\n"; exit; } while (<>) { # Scan until we reach the config section if (/: vmx\| DICT --- CONFIGURATION/) { last; } } while (<>) { if (/: vmx\| DICT --- \S/) { last; } # Keep going until the next section s/^.*: vmx\| DICT\s*//; # Strip off the leading timestamp and other stuff s/\r//; # Get rid of any \r's that may have somehow snuck in s/([^=]*=) (.*)/$1 "$2"/; # Quote the value print; }
Usage
Say you want to recreate a the virtual hardware configuration for a VMware virtual machine “Windows XP.vmx” then you’d call it like this:
vmxRecover.pl vmware.log > "Windows XP.vmx" Another way to do it.
Rebuilding the virtual machine’s .vmx file from vmware.log
Purpose
.vmx
file of a virtual machine and recover its contents if the .vmx
is missing or has lost its configuration.
This article provides a shell script that rebuilds the .vmx
file from the vmware.log
file.
Resolution
.vmx
file using a shell script which parses the information from the vmware.log
file:
Notes:
- VMware does not guarantee that this script will recover every
.vmx
file. This is only an option to try if the operation becomes necessary. For example, if the virtual machine configuration is changed after the last power on, then that information is not logged in thevmware.log
and the.vmx
may not be accurate. - Ensure that you run the commands or the script from the virtual machine working directory. To determine the working directory, right-click the virtual machine and click Edit Settings, then click Options > Virtual Machine Working Location.
- Create a new file using a text editor. Name it, for example,
vmxrebuild.sh
.Note: For information on using a text editor, see Editing files on an ESX host using vi or nano (1020302).
- Copy and paste this script to the file:
VMXFILENAME=$(sed -n 's/^.*Config file: .*\/\(.\+\)$/\1/p' vmware.log)
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} - Save the file, ensuring that it has an
.sh
extension. - Run this command to give execute privileges to the file:
chmod +x filename
Where
filename
is the name of the saved shell script file. - If
uuid.location
has changed due to operations such as cloning or Storage vMotion, run this command to get the new UUID:NEWUUID=$(sed -n "s/^.*UUID: Writing uuid.location value: '\(.\+\)'.*$/\1/p" vmware.log)
Note: Whenever possible, use the latest
vmware.log
file. - Run this command to replace the old UUID in the
.vmx
file with the new one:if [ "${NEWUUID}" ] then sed -i "s/uuid.location = .*$/uuid.location = \"${NEWUUID}\"/" ${VMXFILENAME} fi
- To run the script:
./filename.sh