
不小心,我在 VMware 映像運行時刪除了一個 vmx 檔案。
我怎樣才能恢復這個?
答案1
壞消息:我認為你將不得不重新創建它。
好消息:VMDK 保存整個磁碟 - 所以大部分「重要」的東西都在那裡。
因此,建立一個新的虛擬機器 - 然後配置磁碟以使用現存的VMDK。
另外,這種問題確實應該發佈在「superuser.com」上,而不是「stackoverflow.com」上。
答案2
vmx 檔案的內容應記錄到 VMware 的映像日誌中。
將以下內容複製到檔案中(這些內容應位於 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"
透過打開 啟動影像
example.vmx
。
答案3
廣告中有此腳本
就我個人而言,我很難讓它在 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}"