VMware虚拟机无法通过命令行恢复

3
我正在Ubuntu 10.10上运行VMWare Workstation。我有一系列的虚拟机,每周都会克隆一次。
我编写了一个bash脚本,循环遍历每个虚拟机,轻松地将其挂起,克隆它,然后尝试恢复它。
问题在于,虚拟机无法恢复,因此我必须手动恢复它们。我正在尝试找出如何修改我编写的脚本以确保虚拟机可以恢复。我已经包含了脚本和生成的日志文件的样本,显示了错误消息。
#!/bin/bash

##Author:   William Cooper
##Date: 2/15/2011
## Purpose:     Perform full backups of Virtual Machines
##      Running under VMWare Workstation

## Script won't run if the /nas directory doesn't exist
## The /nas directory is a mounted Buffalo Terastation
## Check /etc/fstab if this mountpoint is broken
   BACKUPDEST="/nas"

## No need to modify
   HOST=`hostname`
   DATEFILE=`/bin/date +%G%m%d`

## Run Command to find list of VM names:
## this will only be the name of the vm, no path and no .vmx
   VMLIST=`vmrun list | grep '/' | cut -d'/' -f3 | cut -d'.' -f1`

## Initialize Counter variable used to cycle through VMs in VMARRAY variable
   COUNTER=1

## Run Command to find list of VM Names and then store them in an Array:
## This will include full pathnames
   VMARRAY=( `vmrun list | grep '/'` )

#################################################################
## Functions

##
## Notify the starting time of backup in the log
##
function startScript {
   echo
   echo "----------------------------------------------------"
   echo "START - ${VM}"
   echo "Host: ${HOST}"
   echo "Date: `date`"
   echo
}

##
## Suspend VM
##
function suspendVM {
   ## Suspend the VM
   echo "Attempting to softly suspend "${VM}" . . ."
   vmrun suspend ${VMARRAY[${COUNTER}]} soft
   echo "${VM} Suspended on `date`"
   echo
}

##
## Backup VM
##
function doBackup {

   ## Check to see if the correct backup directory exists.
   if [ ! -d ${BACKUPDEST}/${VM} ]; then
      echo "${BACKUPDEST}/${VM} does not exist, creating . . ."
      mkdir "${BACKUPDEST}/${VM}"
      echo
   fi

   ## Backup VM (clone)
   echo "Backup of "${VM}" began: `date`"
   echo "Backup to ${BACKUPDEST}/${VM}/BACKUP/${DATEFILE} . . ."
   mkdir ${BACKUPDEST}/${VM}/BACKUP/${DATEFILE}
   vmrun clone ${VMARRAY[${COUNTER}]} ${BACKUPDEST}/${VM}/BACKUP/${DATEFILE}/${VM}.vmx full
   echo "Backup of "${VM}" ended: `date`"
   echo
}

##
## Start VM
##
function doStart {
   ## Resume VMs which were running [--type gui|sdl|vrdp|headless]
   echo "Attempting to resume "${VM}" . . ."
   vmrun start ${VMARRAY[${COUNTER}]}
   echo "${VM} Resumed on `date`"
   echo
}

##
## Notify the finishing time of backup in the log
##
function finishScript {
   echo "FINISH - ${VM}"
   echo "Host: ${HOST}"
   echo "Date: `date`"
   echo "----------------------------------------------------"
   echo
}

#################################################################
## Script

for VM in ${VMLIST}
do

   sleep 1
   ## StartScrip executes for logging
      startScript

   ## Suspend VM performs soft suspend
      suspendVM
      sleep 3

   ## Do Backup performs the VM clone
      doBackup
      sleep 3

   ## Start VM performs start vm
      doStart
      sleep 3

   ## FinishScript executes for logging
      finishScript

   ## Increment the Counter
      COUNTER=${COUNTER}+1

done | tee "${BACKUPDEST}/logs/VMClone_${DATEFILE}.log"

## Script
#################################################################
exit

下面是每个虚拟机生成的日志文件示例。
----------------------------------------------------
START - vmname
Host: servername
Date: Sat Feb 19 12:30:29 CST 2011

Attempting to softly suspend vmname . . .
vmname Suspended on Sat Feb 19 12:30:44 CST 2011

Backup of vmname began: Sat Feb 19 12:30:47 CST 2011
Backup to /nas/vmname/BACKUP/20110219 . . .
Backup of vmname ended: Sat Feb 19 12:43:16 CST 2011

Attempting to resume vmname . . .
Error: Cannot launch the UI because no display server is present in the current environment
vmname Resumed on Sat Feb 19 12:43:20 CST 2011

FINISH - vmname
Host: servername
Date: Sat Feb 19 12:43:23 CST 2011
----------------------------------------------------

错误: 无法启动用户界面,因为当前环境中不存在显示服务器。

1
你的计数器增量是通过某种副作用方式实现的。当你执行 COUNTER=${COUNTER}+1 时,它会构建一个越来越长的字符串形式 1+1+1+1+1,并在用作数组下标时进行算术运算。我建议改用 ((COUNTER++))。此外,你不需要为数组下标添加所有修饰符。例如,你可以使用 ${VMARRAY[COUNTER]}。我还建议使用 $() 而不是反引号进行命令替换。它们更易读,并且可以更容易地嵌套等。至于你的问题,你能提供更多环境细节吗? - Dennis Williamson
1
X11需要运行,并且DISPLAY变量需要有一个有意义的值。 - Dennis Williamson
感谢你提供((COUNTER++))的技巧。使用$()确实会更加整洁,但是除了你提供的代码清理建议之外,我不确定为什么DISPLAY全局变量会出错?我每个星期六都会运行一个cronjob调用上面的脚本。现在我想尝试的是在脚本中手动设置DISPLAY=:0.0,看看是否能解决问题。感谢你的帮助。 - Lucretius
<code>DISPLAY=:0.0</code> 没有起作用。我能确保这个脚本成功的唯一方法是关闭 VMWare Workstation 并选择让任务在后台运行而不显示。 - Lucretius
你是在TTY上(例如Ctl-Alt-F1)还是在Ubuntu终端上进行这个操作?在TTY上,我无法正确地使用DISPLAY,但在终端上它可以正常工作。至少对我来说是这样的。 - norcalli
现在它是一个 CronJob,运行一个在 Notepad++ 中编写的脚本(.sh)。 - Lucretius
4个回答

15

在Ubuntu上的Workstation 7似乎忽略了该参数。当我添加它时,没有任何区别。我们后来实施了vSphere和ESXi 5.0。虽然回答很有帮助。 - Lucretius

0
如果问题是因为您正在从ssh会话中运行vmrun,则另一个解决方案可能是在服务器上运行screen会话。
在运行Workstation的计算机上:
screen -S vmware

在客户端机器上,

ssh vmware-machine
screen -x vmware
vmrun start /path/to/vm.vmx

0

鉴于还没有找到确定的解决方案,我只能接受在这种特定情况下没有修复方法。

  • Ubuntu 10.10 x64
  • VMware Workstation 7

解决方法:关闭VMware Workstation并选择让虚拟机“在后台运行”,之后就可以完美运行。


0
尝试在运行vmware工作站的终端TTY上执行echo $DISPLAY。 echo $DISPLAY将返回类似于:1000.0的内容 您需要在脚本中设置export DISPLAY=":1000.0"。然后脚本将恢复虚拟机.. 我发现当我使用areca备份来恢复我的虚拟机时,使用postscript运行是有效的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接