VMware イメージの vmx ファイルを復元する方法は?

VMware イメージの vmx ファイルを復元する方法は?

誤って、VMware イメージの実行中に vmx ファイルを削除してしまいました。

これを回復するにはどうすればいいでしょうか?

答え1

悪い知らせですが、再作成する必要があると思います。

良いニュース: VMDK はディスク全体を保持するので、「重要な」もののほとんどがそこにあります。

そこで、新しいVMを作成し、ディスクを設定して既存 VMDK です。

また、この種の質問は、「stackoverflow.com」ではなく「superuser.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 ":"

個人的には、これがより理解しやすいと思います。まず、「Config file」を含む行を探します。その行で、パイプ記号で区切られた 3 番目のフィールドを探し、次にコロンで区切られた 3 番目のフィールドを探します。そして、確かに、これが構成ファイル名を決定します。

これで正しい vmx ファイルが作成されるかどうかを確認しましょう。まず、元のファイルを上書きしないようにするため、最後の行を次のように変更します。

>> ${VMXFILENAME}.new

これで、この部分のコメントを解除してテストできます。これを行う前に、元の vmx ファイルのバックアップ コピーが作成されていることを確認します (このスクリプトを再起動する必要がある場合は 1 回だけ)。

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

そして 2 番目の sed も期待どおりに動作しません (ため息...)

結局、sedを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}"

関連情報