1

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

我正在编写一个连接到 SqlServer 的 Rails 应用程序。为了开发它,我有一个在 VM 上使用的本地版本的数据库。我的手动过程是这样的:

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 应该能够更自然地做的事情。

编辑

来自评论:

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

4

4 回答 4

1

以下是我的做法:

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

选择“默认网关”是因为主机和虚拟机可以相互独立地找到它。另一种选择是硬编码主机地址。

主机上的主机 tcpdump 退出后,这意味着虚拟机处于活动状态并已启动到 windows 桌面。

于 2012-12-13T10:22:17.193 回答
0

我之前研究过这条查询线,我认为 Devil's Pie 是最接近设置它的方法:

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

于 2012-11-01T13:16:17.057 回答
0

你可以尝试从这个(VBoxManager startvm)开始:

如何自动启动和关闭 VirtualBox 机器?

然后查看一些工作脚本以添加到您的 init.d 和/或 rc.local 一旦您的虚拟机按顺序完成其余工作:

了解 Linux:/etc/init.d 目录

于 2012-12-17T23:13:17.803 回答
0

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

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

(Squid 也可以作为这种复杂但非常方便的机制的备份,我仍然可以通过 corkscrew 等进行 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 运行。

于 2019-04-01T18:17:01.413 回答