VM引导后执行命令

问题描述 投票:1回答:4

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

我在连接到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 &

但我无法弄清楚如何在VM完成启动后运行此命令:

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

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

这甚至可能吗?

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

编辑

来自评论:

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

bash virtualbox
4个回答
1
投票

我将这样做:

  1. 在VM中,创建一个脚本,该脚本将找到默认网关,并继续ping它。并将其添加到用户的启动。 (需要解析ipconfig /all,可以用vbscript / python完成。)
  2. 在主机中,查看主机和VM之间的网络接口。在主机上找到默认网关(在bash脚本中解析route -n输出)。由于两者都使用相同的物理接口,因此网关将是相同的(假设NAT和ONE物理接口)。使用tcpdump,等待ping数据包到网关。

选择“默认网关”是因为这是主机和VM可以彼此独立发现的东西。其他选择是硬编码主机的地址。

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


0
投票

之前我调查过这一行调查,我认为Devil's Pie是最接近你设置的:

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


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


0
投票

我需要编排类似的东西。我正在使用Windows VM(来宾)作为我的Linux笔记本电脑(主机)的代理(它运行仅限Windows的企业VPN客户端)。方法是让客户完全自动化并等待它准备好:

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

(Squid也可用作这个复杂但非常方便的机制的备份,我仍然可以通过开瓶器等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通过VM工作。

© www.soinside.com 2019 - 2024. All rights reserved.