¿Cómo recuperar archivos vmx para imágenes de VMware?

¿Cómo recuperar archivos vmx para imágenes de VMware?

Accidentalmente, eliminé un archivo vmx de una imagen de VMware mientras se estaba ejecutando.

¿Cómo puedo recuperar esto?

Respuesta1

Malas noticias: creo que tendrás que recrearlo.

Buenas noticias: el VMDK contiene todo el disco, por lo que la mayoría de las cosas "importantes" están allí.

Entonces, cree una nueva VM y luego configure los discos para usar elexistenteVMDK.

Además, este tipo de preguntas deberían publicarse en "superuser.com", no en "stackoverflow.com".

Respuesta2

  1. El contenido del archivo vmx debe registrarse en el registro de imágenes de VMware.

  2. Copie el contenido como se muestra a continuación en un archivo (este contenido debe ubicarse entre Configuración y USUARIO PREDETERMINADO en el registro de imágenes de VMware) y asigne un nombre a este archivo como 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. Inicie la imagen abriendo example.vmx.

Respuesta3

Hay un guión para esto anunciado en

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

Personalmente tuve problemas para que funcionara en Mac OS ElCapitan. Lamentablemente, el guión está mal documentado.

Intenté los siguientes pasos:

#!/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}

Primero quería saber si el nombre del archivo de configuración se detecta correctamente. Un grep muestra qué esperar

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

pero el script no obtiene el nombre de archivo correcto y muestra un resultado vacío. Entonces reemplacé la línea para obtener el nombre del archivo con

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

que personalmente encuentro mejor comprensible. Primero buscamos la línea que contiene "Archivo de configuración". En esa línea buscamos el tercer campo separado por un signo de barra vertical y luego el tercer campo separado por dos puntos. Y sí, de hecho, esto determina el nombre del archivo de configuración.

Ahora veamos si esto creará un archivo vmx correcto. Primero nos aseguramos de no anular el original por lo que la última línea se modifica como:

>> ${VMXFILENAME}.new

y ahora podemos descomentar esta parte para probarla. Antes de hacer esto, nos aseguramos de que se cree una copia de seguridad de nuestro archivo vmx original (y solo una vez si necesitamos reiniciar este script...)

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

y el segundo sed tampoco funciona como se esperaba (suspiro...)

Así que terminé reemplazando también el sed con algunas líneas de awk.

#!/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}"

información relacionada