
Acidentalmente, removi um arquivo vmx de uma imagem VMware enquanto ela estava em execução。
Como posso recuperar isso?
Responder1
Más notícias: acho que você terá que recriá-lo.
Boas notícias: o VMDK contém todo o disco - portanto, a maior parte das coisas "importantes" está lá.
Portanto, crie uma nova VM e configure o(s) disco(s) para usar oexistirVMDK.
Além disso, esse tipo de pergunta deveria ser postado em "superuser.com" - não em "stackoverflow.com".
Responder2
O conteúdo do arquivo vmx deve ser registrado no log de imagem do VMware.
Copie o conteúdo como abaixo para um arquivo (esse conteúdo deve estar localizado entre Configuração e PADRÃO DO USUÁRIO no log de imagem do VMware) e nomeie esse arquivo 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"
Comece a imagem abrindo o arquivo
example.vmx
.
Responder3
Existe um script para isso anunciado em
Pessoalmente, tive problemas para fazê-lo funcionar no Mac OS ElCapitan. Infelizmente, o script está mal documentado.
Eu tentei as seguintes etapas:
#!/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}
então primeiro eu queria saber se o nome do arquivo de configuração foi detectado corretamente. Um grep mostra o que esperar
grep "Config file:" vmware.log
2017-01-25T19:35:35.533+01:00| vmx| I125: Config file: /vmware/vm.vmwarevm/vm.vmx
mas o script não obtém o nome de arquivo correto e mostra um resultado vazio. Então substituí a linha para obter o nome do arquivo por
VMXFILENAME=grep "Config file: " vmware.log | cut -f3 -d"|" | cut -f3 -d ":"
que eu pessoalmente acho mais compreensível. Primeiro procuramos a linha que contém "Arquivo de configuração". Nessa linha procuramos o terceiro campo separado por uma barra vertical e depois o terceiro campo separado por dois pontos. E sim, isso determina o nome do arquivo de configuração.
Agora vamos ver se isso criará um arquivo vmx correto. Primeiro, garantimos que não substituímos o original, então a última linha é modificada como:
>> ${VMXFILENAME}.new
e agora podemos descomentar esta parte para testá-la. Antes de fazermos isso, garantimos que uma cópia de backup do nosso arquivo vmx original seja criada (e apenas uma vez se precisarmos 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
e o segundo sed também não funciona como esperado (suspiro...)
Então acabei substituindo também o sed por algumas linhas do 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}"