WindowsからVirtualbox上のUbuntuで動作するプロセスにポートフォワードする

MacBook(今は亡き黒ポリカーボネート)を24inchモニタにつなぐと世界が止まるので、泣く泣く自宅のマシンで最強のスペックを誇るThinkpad X201sで作業しています。
なんとかしてLinux環境を手に入れたくてVirtualBox(Ubuntu)+putty+ssh(ポートフォワード)という荒業に落ち着いています。基本的に作業はターミナルで完結するものばかりですし。

ポートフォワードの設定(GUIマネージャ経由)

追記: VirtualBoxGUIマネージャからポートフォワードを設定できることを知りました。
GUIマネージャ上で、ゲストOSを選択して設定->ネットワーク->ポートフォワーディングという流れで設定画面にたどり着けます。そこで名前、プロトコル、ホストポート、ゲストポートを設定するとポートフォワードされます。こっちのほうがどう考えても便利ですね。

ポートフォワードの設定

WindowsのVirtualBox上でubuntuサーバを動かしsshで接続するを参考に。VirtualBoxをインストールしたディレクトリにVBoxManage.exeがあるのでこれを実行して引数にゲスト名やプロトコルなどを渡す。

$ VBoxManage.exe setextradata "ubuntu" "VBoxInternal/Devices/pcnet/0/LUN#0/Config/guestssh/Protocol" TCP
$ VBoxManage.exe setextradata "ubuntu" "VBoxInternal/Devices/pcnet/0/LUN#0/Config/guestssh/GuestPort" 22
$ VBoxManage.exe setextradata "ubuntu" "VBoxInternal/Devices/pcnet/0/LUN#0/Config/guestssh/HostPort" 10022

RailsアプリをCygwinで作るのはさすがに限界を感じてきたのでHTTPもポートフォワードさせて、クライアントはWindowsにしてしまおうという魂胆です。HTTPもポートフォワード可能で、

$ VBoxManage setextradata "ubuntu" "VBoxInternal/Devices/pcnet/0/LUN#0/Config/guestssh/Protocol" TCP
$ VBoxManage setextradata "ubuntu" "VBoxInternal/Devices/pcnet/0/LUN#0/Config/guestssh/GuestPort" 3000
$ VBoxManage setextradata "ubuntu" "VBoxInternal/Devices/pcnet/0/LUN#0/Config/guestssh/HostPort" 13000

ゲストOSの画面を立ち上げない

sshでログインして作業するのであれば、ゲストOSの画面を立ち上げる必要はない。VBoxHeadless.exeを実行すればよいがコンソール(NyaOS使っています)が必ず一つ占有されてしまう。

$ VBoxHeadless.exe -startvm "ubuntu"

これでうまくいくと思いきや、

Error: failed to start machine. Error message: Configuration error: Failed to get the "MAC"

というエラーが発生する。つらつらと調べているとまったく同じようなことをしている人を発見。Vista Host Configuration error: Failed to get the "MAC"
ここでゲストOSの設定ファイルやログファイルを確かめてみてよって教えてくれてるので見直すと、最初に設定したssh

<Forwarding name="guestssh" proto="1" hostport="10022" guestport="22"/> 

という設定があったので

<Forwarding name="guesthttp" proto="1" hostport="13000" guestport="3000"/> 

という項目をすぐ下に追加して、ubuntu.xmlファイルの上の方に定義されている以下の、

<ExtraDataItem name="VBoxInternal/Devices/pcnet/0/LUN#0/Config/guestssh/GuestPort" value="3000"/>
<ExtraDataItem name="VBoxInternal/Devices/pcnet/0/LUN#0/Config/guestssh/HostPort" value="13000"/>
<ExtraDataItem name="VBoxInternal/Devices/pcnet/0/LUN#0/Config/guestssh/Protocol" value="TCP"/>

設定を削除したら起動するようになりました。わー。どうやらVBoxManage.exeを使うのが間違いだったようです。
ただ、ポートフォワードされるのでリクエストが遅い? と思いきやどうやらRailsアプリであればthin使うとかなり速くなります。これでサーバ側はUbuntu(Linux)だしクライアント側はWindowsと、ほぼ本番環境に近い構成で開発できるので、あれ、別にMacなくてもいいやってなってきています。