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
VMware virtual machines wont resume from the command line
提问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
回答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

