bash VMware 虚拟机无法从命令行恢复

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/5094537/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-17 23:31:06  来源:igfitidea点击:

VMware virtual machines wont resume from the command line

linuxbashvmwareubuntu-10.10

提问by Lucretius

I'm running VMWare Workstation on Ubuntu 10.10. I have a series of virtual machines that I clone every week.

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

I've written a bash script that cycles through each of the virtual machines, softly suspends it, clones it, and then attempts to resume it.

我编写了一个 bash 脚本,它在每个虚拟机之间循环,轻轻地挂起它,克隆它,然后尝试恢复它。

The problem is, the VM's do not resume, so I have to manually resume them. I'm trying to figure out how I can modify the script I've written to ensure the VMs resume. I've included the script and a sample of the generated logfile showing the error message.

问题是,VM 无法恢复,所以我必须手动恢复它们。我想弄清楚如何修改我编写的脚本以确保 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

An example of the generated logfile for each VM is shown below.

下面显示了为每个 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
----------------------------------------------------

Error: Cannot launch the UI because no display server is present in the current environment

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

采纳答案by Lucretius

Since no solid answer has been found I'm just going to accept that under these specific circumstances there is no fix.

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

  • Ubuntu 10.10 x64
  • VMware Workstation 7
  • Ubuntu 10.10 x64
  • VMware 工作站 7

Solution: Close down VMware Workstation and choose for the VMs to "Run in the Background" Works flawlessly after that.

解决方案:关闭 VMware Workstation 并选择让虚拟机“在后台运行”之后即可正常工作。

回答by Tom

You could use the nogui paramater to the start command, e.g:

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

vmrun start yourmachine.vmx nogui

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

请参阅:http: //www.vmware.com/pdf/vix180_vmrun_command.pdf

回答by Johnbritto

try doing echo $DISPLAY on your terminal TTY where vmware workstation runs. The echo $DISPLAY will return like :1000.0 you need to set export DISPLAY=":1000.0" in your script. then the script will resume the VM's.. i found this works when i use areca backup to resume my VM using postscript run in areca.

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

回答by Dyno Fu

if the problem is because you are running vmrun from a ssh session, then another solution might be run a screen session on the server.

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

on the machine Workstation is running:

在工作站运行的机器上:

screen -S vmware

on the client machine,

在客户端机器上,

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