如何恢復VMware鏡像的vmx檔案?

如何恢復VMware鏡像的vmx檔案?

不小心,我在 VMware 映像運行時刪除了一個 vmx 檔案。

我怎樣才能恢復這個?

答案1

壞消息:我認為你將不得不重新創建它。

好消息:VMDK 保存整個磁碟 - 所以大部分「重要」的東西都在那裡。

因此,建立一個新的虛擬機器 - 然後配置磁碟以使用現存的VMDK。

另外,這種問題確實應該發佈在「superuser.com」上,而不是「stackoverflow.com」上。

答案2

  1. vmx 檔案的內容應記錄到 VMware 的映像日誌中。

  2. 將以下內容複製到檔案中(這些內容應位於 VMware 映像日誌中的 Configuration 和 USER DEFAULT 之間),並將該檔案命名為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. 透過打開 啟動影像example.vmx

答案3

廣告中有此腳本

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

就我個人而言,我很難讓它在 Mac OS ElCapitan 上運行。不幸的是,該腳本的記錄很糟糕。

我嘗試了以下步驟:

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

所以首先我想知道設定檔名是否被正確地偵測到。 grep 顯示了預期的內容

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

但腳本沒有獲得正確的文件名,它顯示空結果。所以我將獲取檔案名稱的行替換為

VMX檔名=grep "Config file: " vmware.log | cut -f3 -d"|" | cut -f3 -d ":"

我個人認為這更好理解。首先,我們尋找包含「設定檔」的行。在該行中,我們查找用管道符號分隔的第三個字段,然後查找用冒號分隔的第三個字段。是的,這確實決定了設定檔名。

現在讓我們看看這是否會建立正確的 vmx 檔案。首先,我們確保不會覆寫原始行,因此最後一行修改為:

>> ${VMXFILENAME}.new

現在我們可以取消這部分的註解來測試它。在執行此操作之前,我們確保建立原始 vmx 檔案的備份副本(如果我們需要重新啟動此腳本,則僅建立一次...)

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

第二個 sed 也沒有如預期般運作(嘆氣...)

所以我最後也用幾行 awk 換了 sed

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

相關內容