VM引导后执行命令

时间:2012-11-01 13:03:48

标签: bash virtualbox

我已经厌倦了早上开始我需要多少步骤。是的,启动我的整个环境只需要几分钟,但我真的只是在启动时运行一个命令并准备立即启动。

我正在连接到SqlServer的Rails上编写应用程序。为了开发它,我有一个我在VM上使用的本地版本的DB。我的手动过程如下:

Run VirtualBox.
Start the VM.
     When the VM is done booting:
          Open terminal
          Run `rails s`
          When rails is done starting:
                 open browser
                 navigate to localhost:3000 and start developing
Run Sublime

我喜欢在一个剧本中这样做:

VirtualBox Windows7 &
sublime &
google-chrome &

但是,一旦虚拟机完成启动,我无法弄清楚如何仅运行此命令

gnome-terminal --working-directory=git/my_project --tab -e 'rails s' --tab -e 'git status'

此外,在 rails s成功完成后启动chrome 会很好(但不是必须)。

这甚至可能吗?

我并不反对投票,但感觉这是VirtualBox应该能够做得更自然的事情。

修改

来自评论:

我正在使用具有两个桥接接口的主机网络(一个用于无线接口,一个用于有线接口)可用。 (它允许我使用VM,无论我是否连接到网络,并允许我在有线和无线之间自由切换,而不会注意到差异)。

4 个答案:

答案 0 :(得分:1)

我将如何做:

  1. 在VM中,创建一个可找到默认网关的脚本,&继续ping它。 &安培;将其添加到用户的启动。 (需要解析ipconfig /all,可以用vbscript / python完成。)
  2. 在主机中,查看主机和主机之间的网络接口; VM。在主机上找到默认网关(在bash脚本中解析route -n输出)。由于两者都使用相同的物理接口,因此网关将是相同的(假设NAT& ONE物理接口)。使用tcpdump,等待ping数据包到网关。
  3. 选择“默认网关”是因为这是主持人和VM可以找到彼此独立的。其他选择是硬编码主机的地址。

    主机上的主机tcpdump退出后,表示虚拟机处于活动状态。启动到Windows桌面。

答案 1 :(得分:0)

之前我调查了这条调查线,我认为Devil's Pie是最接近你设置的:

http://burtonini.com/blog/computers/devilspie

答案 2 :(得分:0)

您可以尝试从此开始(VBoxManager startvm):

How to automatically start and shut down VirtualBox machines?

然后查看一些工作脚本,以便在VM完成后按顺序添加到init.d和/或rc.local:

Get To Know Linux: The /etc/init.d Directory

答案 3 :(得分:0)

我需要编排类似的东西。我使用Windows VM(来宾)作为Linux笔记本电脑(主机)的代理(它运行仅Windows的公司VPN客户端)。方法是使访客完全自动化,并等待其准备就绪:

  1. 主机必须没有时髦的路由
  2. VM启动并运行一个Powershell脚本(通过Windows Task Scheduler,在启动时运行),该脚本连接VPN客户端并设置ICS(Internet连接共享,基本上是路由)。
  3. 主机现在添加了时髦的路由,这些路由通过VM的仅主机接口发送了一些流量。如果过早添加了这些路由,则第2步将不起作用。
  4. 虚拟机还运行squid(http代理),并且其端口是从主机转发的NAT端口,因此 localhost:3128 实际上是发给来宾的。因此,使用此代理的curl进入公司网络,并指示来宾是否已完全建立并连接。

(鱿鱼还可以用作此复杂但非常方便的机制的备份,我仍然可以通过开瓶器等进行ssh操作)

因此,我在主机上运行此脚本(显示了简化版本):

#!/bin/bash
VM=vm  #Name of the Virtual Machine
SCRIPT_DIR=/some/dir
PROXY_ADDRESS=localhost:3128 
REMOTE_CURL_HOST=any.corporate.hostname

function waitloop() {
    echo -n "Waiting to hear from $REMOTE_CURL_HOST "
    while ! curl -s -m 5 --proxy $PROXY_ADDRESS $REMOTE_CURL_HOST > /dev/null ; do
        echo -n .
        sleep 10
    done
    echo "!"
}

# a separate script that takes down my routes, you may not need this.
bash $SCRIPT_DIR/network-config-vboxnet0.sh down

# error is OK if it's already running
vboxmanage startvm $VM

waitloop && bash $SCRIPT_DIR/network-config-vboxnet0.sh up && echo "Completed"

本质上,脚本会一直等到curl通过虚拟机工作为止。