如何在启动时自动启动虚拟机器?

我的Ubuntu12.04中有很多虚拟机器,每次关机或重启我都必须逐个启动它们。

我想帮助编写脚本,以便在启动时自动启动VBox机器。

您可以使用VirtualBox自动启动服务。 描述如何执行此操作的好教程发布在“极客管理生活”博客上 。

以下步骤改编自链接的博客文章:

  1. 首先,您需要创建文件/etc/default/virtualbox并添加一些变量。

    VBOXAUTOSTART_DB ,包含自动启动数据库目录的绝对路径
    VBOXAUTOSTART_CONFIG ,其中包含自动启动配置设置的位置。 该文件看起来应该类似于:

     # virtualbox defaults file VBOXAUTOSTART_DB=/etc/vbox VBOXAUTOSTART_CONFIG=/etc/vbox/vbox.cfg 
  2. 现在我们需要创建/etc/vbox/vbox.cfg文件并添加

     # Default policy is to deny starting a VM, the other option is "allow". default_policy = deny # Create an entry for each user allowed to run autostart myuserid = { allow = true } 

    注意:如果文件名vbox.cfg在上面不起作用,请尝试将其命名为autostart.cfg

    如果您是唯一的用户,则可以将default_policy = allow行添加到vbox.cfg文件中。

  3. 将目录权限设置为vboxuser组,并确保用户可以写入目录以及粘滞位。

     sudo chgrp vboxusers /etc/vbox sudo chmod 1775 /etc/vbox 
  4. 将每个用户添加到vboxusers组。

     sudo usermod -a -G vboxusers USERNAME 

    (用USERNAME名替换USERNAME

注意如果您已更改当前用户的组权限,请注销并重新登录以刷新权限。 (credit @ kR105)

  1. 每个想要为单个机器启用自动启动的用户都必须设置自动启动数据库目录的路径

     VBoxManage setproperty autostartdbpath /etc/vbox 

    并为具有的单个VM启用自动启动

     VBoxManage modifyvm  --autostart-enabled on 

    这将在/etc/vbox目录中创建一个myuserid.start文件

  2. 现在重新启动vboxautostart-service以读取更改。

     sudo service vboxautostart-service restart 
  3. 重新启动系统,您的VM应该启动

我有类似的不愉快事件在香草LTS上尝试这个操作。

 ~$ cat /etc/os-release NAME="Ubuntu" VERSION="14.04.1 LTS, Trusty Tahr" 

在此版本中,未安装密钥文件/etc/init.d/vboxautostart-service

据我所知,所有的VitualBox和要求都是由apt-get引入的,所以我不能说为什么还没有提供’vboxautostart-service’文件。 但是为了克服这个问题,我对kdmurray的post进行了更新。

1) / etc / default / virtualbox文件存在给我。 所以必须添加变量:

 VBOXAUTOSTART_DB=/etc/vbox VBOXAUTOSTART_CONFIG=/etc/vbox/autostart.cfg 

2)必须创建/etc/vbox/autostart.cfg,如OP所示。

6b)需要获取vboxautostart-service脚本并使其可执行。

 cd /etc/init.d/ sudo wget http://www.virtualbox.org/browser/vbox/trunk/src/VBox/Installer/linux/vboxautostart-service.sh?format=raw -O vboxautostart-service sudo chmod +x vboxautostart-service 

6c)警告rc.d控制器,但我用24作为开始时间。 只需20,它没有启动。 也许它甚至在virtualbox工作之前就已经运行了。

 sudo update-rc.d vboxautostart-service defaults 24 24 

然后重新启动正确启动VM。

经过许多不愉快的时间试图上面的kdmurray程序进入工作,没有成功,我最终找到了一个简单的方法。

首先,我的Linux主机(Mint 17)在启动时设置为自动登录到我的主帐户。

其次,我使用VirtualBox GUI(v4.3.12)中的工具为桌面上的每个虚拟机创建快捷方式。 {右键单击左栏中的VM并选择“在桌面上创建快捷方式”}

下一篇:我已经发现启动菜单 – >控制中心 – >启动应用程序 – >添加和添加桌面快捷方式给出了无法正常工作的文件,我从本页的其他答案中发现创业公司的位置是/ home /USERNAME/.config/autostart所以我右键单击每个桌面虚拟机快捷方式,然后将它们粘贴到该文件夹​​中,覆盖之前的垃圾文件。 现在他们开发了“漂亮”的VirtualBox图标。

当然,在重新启动主机时,3个VM自动启动。

🙂

比尔威廉姆斯

PS:唉,我仍然缺少一些东西,因为虚拟机通常不会在启动时启动,而是生成一个错误对话框,说明它们已被锁定,即使我已经告诉他们在重新启动主机之前关闭它们。

你可以使用vboxmanage startvm "my virtual machine" --type=headless|gui|sdl (其中之一)。 如果它们是通过除gui以外的其他方式连接的服务器,请使用“无头”。

要在引导期间的正确时间实际运行这些命令,您需要阅读Upstart。

除了上面对vboxautostart-service的良好描述外,您还可以这样做

 VBoxManage modifyvm server --autostop-type savestate 

在关机时自动停止访客。 对于Ubuntu 14.04,我不得不在vboxautostart-service stop部分添加一个sleep 30 ,以便等待guest完全保存。

我在运行VBox 5.1.34的Ubuntu 16.04下找到了一种更简单的方法。

在VBox中,右键单击列表中正在运行或空闲的VM,选择“在桌面上创建快捷方式”。一旦看到桌面上的图标,打开任何工具,让您看到VBox创建的基础命令(在我的桌面上)系统,我右键单击并选择“属性”)将其复制到剪贴板。

打开程序以更新“启动应用程序”并创建一个在启动时启动的新应用程序,粘贴您从VirtualBox创建的桌面链接复制的命令。

要在登录我们的会话时启动VM,我们可能需要定义.desktop文件:

  • 在Unity Launcher中添加Virtualbox快捷方式以引导至VM

当此文件被复制或移动到我们的自动启动目录时,它将在我们登录后执行:

  • 如何在登录时自动启动应用程序?

在用户空间中运行Virtual Box可能有助于避免在启动期间启动它们产生不必要的副作用(例如,VM以root身份运行,启动时间增加令人难以置信,……)。

这可以使用VirtualBox命令行管理界面完成。 只需在启动时运行以下脚本。

 #!/bin/bash VMUSER="vmuser" VMNAME="RedHatVM" #also you can put UUID in this variable (VMNAME="4ec6acc1-a232-566d-a040-6bc4aadc19a6") case "$1" in start) echo "===Starting VirtualBox VM===" sudo -H -u $VMUSER VBoxManage startvm "$VMNAME" --type headless ;; stop) echo "===Saving state of Virtualbox VM===" sudo -H -u $VMUSER VBoxManage controlvm "$VMNAME" savestate sleep 20 ;; shutdown) echo "===Shutting down Virtualbox VM===" sudo -H -u $VMUSER VBoxManage controlvm "$VMNAME" acpipowerbutton sleep 20 ;; reset) echo "===Resetting VirtualBox VM===" sudo -H -u $VMUSER VBoxManage controlvm "$VMNAME" reset ;; status) echo -n "VMNAME->";sudo -H -u $VMUSER VBoxManage showvminfo "$VMNAME" --machinereadable |grep "VMState="| cut -d "=" -f2 ;; echo "Usage: /etc/init.d/VMscript {start|stop|shutdown|reset|status}" exit 1 ;; esac exit 0 

有一个很好的教程可以获得更多信息。

加入@kdmurray的答案。

如果您收到错误:

 VBoxManage modifyvm  --autostart-enabled on 

为了解决这个问题,我不得不手动创建文件“username”.start和“username”.stop:

 sudo touch "username".start sudo touch "username".stop 

并改变所有者:

 sudo chown "username" "username".start sudo chown "username" "username".stop 

重新运行:

 VBoxManage modifyvm  --autostart-enabled on 

然后重启服务:

 sudo service vboxautostart-service stop sudo service vboxautostart-service start 

检查一切正常:

 top 

如果虚拟机正在运行,您应该在列表中看到“VBox …”进程

您还可以获得此处描述的gnome会话管理器。 Gnome会话管理器它位于软件中心或者您可以直接进入终端并键入sudo apt-get install gnome-session-common

接下来,您可以创建一个小脚本来运行并使用gnome会话管理器来启动它。 这是一个小样本脚本,让你去…

 #!/bin/sh #vboxmanage startvm "my virtual machine" --type=headless|gui|sdl (one of those) # So if your username is user, and virtualbox put your VMs in the default location, and you want headless... vboxmanage startvm '/home/user/VirtualBox VMs/myvmname' --type=gui 

这是我在主机重启时启动Centos(我的虚拟机名称)的方法。 我使用crontab来完成这项工作。 这是我的crontab条目:

 @reboot VBoxHeadless --startvm "Centos" & 

对于Ubuntu服务器16.04.1 LTS我解决了这个问题:

首先激活rc-local.service

 sudo systemctl enable rc-local.service 

/etc/rc.local添加以下行

 su virtual_box_user -c "VBoxHeadless -startvm 'virtual_machine_name' &" 

请注意,virtual_box_user是可以看到执行命令的虚拟机(您愿意启动)的虚拟机:

 VBoxManage list vms 

例:

 $ VBoxManage list vms "virtualbox1" {2eb3ba3b-bcb3-4515-95d9-d33bce214c28} "virtualbox2" {62365634-f2q4-40c0-b4ed-22f4ab84441a} 

修改后的/etc/rc.local应如下所示

 #!/bin/sh -e # # rc.local # # This script is executed at the end of each multiuser runlevel. # Make sure that the script will "exit 0" on success or any other # value on error. # # In order to enable or disable this script just change the execution # bits. # # By default this script does nothing. su bob -c "VBoxManage startvm 'virtualbox1' --type headless &" su bob -c "VBoxManage startvm 'virtualbox2' --type headless &" exit 0 

如果您没有选择正确的virtualbox所有者,则应该看到输入命令时出错:

 sudo systemctl status rc-local.service 

我希望这可以提供帮助