我似乎无法让我的虚拟机在启动时运行。
我尝试了“启动应用程序”和 update-rc.d,但没有成功。
sudo update-rc.d startvms defaults 99 10
这为不同的运行级别创建了所有适当的符号链接,但虚拟机仍然无法启动。
这是我的 startvms 脚本:
#!/bin/bash
### BEGIN INIT INFO
# Provides: startvms
# Required-Start: $remote_fs $syslog
# Required-Stop: $remote_fs $syslog
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Start my VMs at boot time
# Description: Enable service provided by daemon.
### END INIT INFO
case "$1" in
start)
echo "Starting"
nohup VBoxHeadless --startvm "UbuntuServer" &
;;
stop)
echo "Stopping $DESC"
VBoxManage controlvm "UbuntuServer" poweroff
;;
restart|force-reload)
echo "Restarting $DESC"
VBoxManage controlvm "UbuntuServer" poweroff
nohup VBoxHeadless --startvm "UbuntuServer" &
;;
*)
N=/etc/init.d/$NAME
echo "Usage: $N {start|stop|restart|force-reload}" >&2
exit 1
;;
esac
我究竟做错了什么?
答案1
这 是终于成功了!
1)创建启动脚本文件
在 /etc/init.d- 中sudo nano /etc/init.d/StartVM
。
将以下内容复制粘贴到文件中,并将“我的虚拟机名称”替换为您的虚拟机名称:
#! /bin/sh
# /etc/init.d/StartVM
#
#Edit these variables!
VMUSER=spode
VMNAME="My VM Name"
case "$1" in
start)
echo "Starting VirtualBox VM..."
sudo -H -b -u $VMUSER /usr/bin/VBoxVRDP -s "$VMNAME"
;;
stop)
echo "Saving state of Virtualbox VM..."
sudo -H -u $VMUSER /usr/bin/VBoxManage controlvm "$VMNAME" savestate
;;
*)
echo "Usage: /etc/init.d/StartVM {start|stop}"
exit 1
;;
esac
exit 0
2)赋予脚本可执行权限
和sudo chmod +x /etc/init.d/StartVM
。
3)告诉脚本在启动时运行。
告诉脚本第一个关闭并且最后一个启动。
sudo update-rc.d StartVM defaults 99 01
答案2
仅供参考,这可以在没有 nohup 的 Opensuse 上运行。
VBoxHeadless -s "OpenSuSE 11.4 64bit" &
答案3
在较新版本的 Virtualbox(4.2.0 及以上版本)中,您无需编写自己的脚本来自动启动虚拟机,但需要进行一些配置。请参阅 Virtualbox 手册第 9.24 节“在系统启动时启动虚拟机“
不幸的是,该手册只提供了概要说明,而且很久没有更新了。我发现virtualbox 论坛上的这篇文章带有一些额外的细节。
您只需在 rc.local 中输入一行即可启动您的服务器,但如果您想以“官方”方式执行此操作,请继续阅读。
将以下行添加到 /etc/default/virtualbox:
VBOXAUTOSTART_DB=/etc/vbox
VBOXAUTOSTART_CONFIG=/etc/vbox/vboxautostart.cfg
编辑 /etc/vbox/vboxautostart.cfg(此示例拒绝除用户“Bob”之外的所有用户的自动启动权限):
# Default policy is to deny starting a VM, the other option is "allow".
default_policy = deny
# Bob is allowed to start virtual machines but starting them
# will be delayed for 10 seconds
bob = {
allow = true
startup_delay = 10
}
# Alice is not allowed to start virtual machines, useful to exclude certain users
# if the default policy is set to allow.
alice = {
allow = false
}
将 vboxusers 组添加到 /etc/vbox 和 sticky bit:
# chgrp vboxusers /etc/vbox
# chmod 1775 /etc/vbox
将所有使用 virtualbox 的用户添加到“vboxusers”组,例如:
# adduser Bob vboxusers
每个想要为单个机器启用自动启动的用户都必须使用以下命令设置自动启动数据库目录的路径:
$ VBoxManage setproperty autostartdbpath /etc/vbox
然后,用户可以将虚拟机设置为自动启动,并配置如何停止(例如 savestate、acpishutdown):
$ VBoxManage modifyvm <vmname> --autostart-enabled on
$ VBoxManage modifyvm <vmname> --autostop-type acpishutdown
上述操作对我而言适用于从 virtualbox.org 存储库安装的 Virtualbox 5。
答案4
既然你提到了VBoxHeadless如果您从终端的命令行键入它,它就可以正常工作,但是从 init 脚本启动时不会启动任何 VM,我的猜测是它正在寻找一些环境变量,该变量在终端中运行 shell 时定义,但在 init 脚本环境中未定义(基本上是空的,除了内核命令行上给出的参数)。
您可以尝试用这个替换脚本中的 VBoxHeadless 调用吗?
env USER=username HOME=/path/to/user/homedir VBoxHeadless ...same options as before...
此处的“用户名”和主目录路径应更改为与您用于启动虚拟机的用户的用户名和主目录路径相匹配。