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
.vmxfile. 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.logand the.vmxmay 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
.shextension. - Run this command to give execute privileges to the file:
chmod +x filenameWhere
filenameis the name of the saved shell script file. - If
uuid.locationhas 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.logfile. - Run this command to replace the old UUID in the
.vmxfile with the new one:if [ "${NEWUUID}" ] then sed -i "s/uuid.location = .*$/uuid.location = \"${NEWUUID}\"/" ${VMXFILENAME} fi - To run the script:
./filename.sh
