【问题标题】:VMware virtual machines wont resume from the command lineVMware 虚拟机无法从命令行恢复
【发布时间】:2011-02-23 17:31:19
【问题描述】:

我在 Ubuntu 10.10 上运行 VMWare 工作站。我每周都会克隆一系列虚拟机。

我编写了一个 bash 脚本,该脚本循环遍历每个虚拟机,将其软挂起、克隆,然后尝试恢复它。

问题是,VM 没有恢复,所以我必须手动恢复它们。我试图弄清楚如何修改我编写的脚本以确保虚拟机恢复。我已经包含了脚本和一个显示错误消息的生成日志文件示例。

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

为每个 VM 生成的日志文件示例如下所示。

----------------------------------------------------
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
----------------------------------------------------

错误:无法启动 UI,因为当前环境中不存在显示服务器

【问题讨论】:

  • 您的计数器增量通过某种副作用起作用。当您执行COUNTER=${COUNTER}+1 时,它会构建一个越来越长的1+1+1+1+1 形式的字符串,当它用作数组下标时会进行算术评估。我建议改用((COUNTER++))。此外,您不需要数组下标的所有装饰。例如,您可以使用:${VMARRAY[COUNTER]}。另外,我建议使用$() 而不是反引号来进行命令替换。它们更具可读性并且更容易嵌套等。至于您的问题,您能否提供更多环境的详细信息?
  • X11 需要运行,DISPLAY 变量需要有一个有意义的值。
  • 感谢((COUNTER++)) 的提示。 $() 确实感觉更干净,但除了您给出的代码清理建议之外,我不确定为什么 DISPLAY 全局中断?我运行一个 cronjob,每个星期六调用上面的脚本。我想我现在要尝试的只是在脚本中手动设置DISPLAY=:0.0 以查看是否可以修复它。谢谢。
  • DISPLAY=:0.0 不起作用。我可以确保此脚本成功的唯一方法是关闭 VMWare Workstation 并选择“在后台运行”而不显示作业。
  • 您是在 TTY 上(如 Ctl-Alt-F1)还是在 ubuntu 的终端上执行此操作?使用 TTY,我永远无法让 DISPLAY 正常工作,但在终端中它工作正常。至少对我来说。

标签: linux bash vmware ubuntu-10.10


【解决方案1】:

您可以在启动命令中使用 nogui 参数,例如:

vmrun start yourmachine.vmx nogui

见:http://www.vmware.com/pdf/vix180_vmrun_command.pdf

【讨论】:

  • 在 Ubuntu 上的 Workstation 7 中,它似乎忽略了该参数。当我添加它时,它没有任何区别。从那以后,我们已经实现了 vSphere 和 ESXi 5.0。虽然有用的答案。
【解决方案2】:

由于没有找到可靠的答案,我只能接受在这些特定情况下没有解决办法。

  • Ubuntu 10.10 x64
  • VMware 工作站 7

解决方案:关闭 VMware Workstation 并选择虚拟机“在后台运行” 之后完美运行。

【讨论】:

    【解决方案3】:

    尝试在运行 vmware 工作站的终端 TTY 上执行 echo $DISPLAY。 echo $DISPLAY 将返回:1000.0 你需要设置 在脚本中导出 DISPLAY=":1000.0"。然后脚本将恢复虚拟机的.. 当我使用 areca 备份使用在 areca 中运行的 postscript 恢复我的 VM 时,我发现这很有效。

    【讨论】:

      【解决方案4】:

      如果问题是因为您从 ssh 会话运行 vmrun,那么另一种解决方案可能是在服务器上运行屏幕会话。

      在工作站正在运行的机器上:

      screen -S vmware
      

      在客户端机器上,

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-06-15
        • 1970-01-01
        • 2019-04-24
        • 2015-06-02
        • 1970-01-01
        相关资源
        最近更新 更多