VirtualBox on Mac OS X で、ゲスト OS に ssh/http アクセスするまで

背景

ちょっとてこずったので、メモを残しておきます。

やりたいことは、

  • ゲスト OS 上でプログラミング、ウェブプログラミングを勉強・実験するテスト環境を構築したい
    • ・・・だけなので、ゲスト OS にデスクトップ環境はいらない
    • できるだけ軽く動作させたい
  • ホスト OS から ssh でログインしてプログラムを打ち込む
  • ホスト OS のブラウザからゲスト OS の httpd にアクセスして実験する

です。

ゲスト OS のインストール

VirtualBox のインストールは省きます。
ゲスト OS として、ごくごくふつうに debian をインストールしました。詳細は省きますが、今回は軽い動作を求めていたので [ソフトウェアの選択] のところで [標準システム] のみチェックしました ([デスクトップ環境] にはチェックなしです)。

あと、今回は sshhttpd が必要なので、

$ apt-get install ssh apache2

のようにしておきます。

ゲスト OS への ssh/http アクセス設定

あまり正確には把握していないのですが、

  • VirtualBox 上のゲスト OS にアクセスするには、VBoxManage コマンドで各種設定を行う必要がある
  • これについては、VirtualBox 付属のマニュアルの 6.4.1 章「Configuring port forwarding with NAT」に書かれている

ようです。

Mac OS X では、VBoxManage コマンドは /usr/bin にインストールされるので、ターミナルからそのまま打ち込めば OK です。仮想マシンを停止した上で、下記のコマンドを打ち込みました。

/* ssh の設定 */
$ VBoxManage setextradata "debian" "VBoxInternal/Devices/pcnet/0/LUN#0/Config/guestssh/Protocol" TCP
$ VBoxManage setextradata "debian" "VBoxInternal/Devices/pcnet/0/LUN#0/Config/guestssh/GuestPort" 22
$ VBoxManage setextradata "debian" "VBoxInternal/Devices/pcnet/0/LUN#0/Config/guestssh/HostPort" 50022

/* http の設定 */
$ VBoxManage setextradata "debian" "VBoxInternal/Devices/pcnet/0/LUN#0/Config/guesthttp/Protocol" TCP
$ VBoxManage setextradata "debian" "VBoxInternal/Devices/pcnet/0/LUN#0/Config/guesthttp/GuestPort" 80
$ VBoxManage setextradata "debian" "VBoxInternal/Devices/pcnet/0/LUN#0/Config/guesthttp/HostPort" 50080

"debian" と書かれたところは、仮想マシンの名前に読み替えてください。
上記のコマンドでは、

  • 1-3行目 ... ゲストの 22 ポート (sshポート) をホストの 50022 ポートへ転送
  • 4-6行目 ... ゲストの 80 ポート (httpポート) をホストの 50080 ポートへ転送

の対応をしています。ホストのポート番号は何でもいいのですが、仮想マシン "debian" に関してはすべて 50000 番台を選ぶことにしました。

この VBoxManage コマンドですが、うまく機能したかどうかが今ひとつよくわかりません。が、大丈夫なときは、

$ VBoxManage setextradata "debian" "VBoxInternal/Devices/pcnet/0/LUN#0/Config/guestssh/GuestPort" 22
VirtualBox Command Line Management Interface Version 1.6.2
(C) 2005-2008 Sun Microsystems, Inc.
All rights reserved.

のように表示され、ダメなときは、

$ VBoxManage setextradata "Linux Guest" "VBoxInternal/Devices/pcnet/0/LUN#0/Config/guestssh/GuestPort" 22
VirtualBox Command Line Management Interface Version 1.6.2
(C) 2005-2008 Sun Microsystems, Inc.
All rights reserved.


[!] FAILED calling virtualBox->FindMachine(Bstr(argv[0]), machine.asOutParam()) at line 6742!
[!] Primary RC  = NS_ERROR_INVALID_ARG (0x80070057) - Invalid argument value
[!] Full error info present: true , basic error info present: true
[!] Result Code = NS_ERROR_INVALID_ARG (0x80070057) - Invalid argument value
[!] Text        = Could not find a registered machine named 'Linux Guest'
[!] Component   = VirtualBox, Interface: IVirtualBox, {2d3b9ea7-25f5-4f07-a8e1-7dd7e0dcf667}
[!] Callee      = IVirtualBox, {2d3b9ea7-25f5-4f07-a8e1-7dd7e0dcf667}

のように表示されるようです (今回は "Linux Guest" という仮想マシンがなかったためエラーになったようです)。

ちなみに上記の設定をした場合、~/Library/VirtualBox/Machines/debian/debian.xml に反映されます (例によって debian の部分は仮想マシン名に読み替えてください)。

今回の場合、下記のようになっていました。

/* ~/Library/VirtualBox/Machines/debian/debian.xml */
<ExtraDataItem name="VBoxInternal/Devices/pcnet/0/LUN#0/Config/guestssh/Protocol" value="TCP"/>
<ExtraDataItem name="VBoxInternal/Devices/pcnet/0/LUN#0/Config/guestssh/GuestPort" value="22"/>
<ExtraDataItem name="VBoxInternal/Devices/pcnet/0/LUN#0/Config/guestssh/HostPort" value="50022"/>
<ExtraDataItem name="VBoxInternal/Devices/pcnet/0/LUN#0/Config/guesthttp/Protocol" value="TCP"/>
<ExtraDataItem name="VBoxInternal/Devices/pcnet/0/LUN#0/Config/guesthttp/GuestPort" value="80"/>
<ExtraDataItem name="VBoxInternal/Devices/pcnet/0/LUN#0/Config/guesthttp/HostPort" value="50080"/>

確認

実際にホスト OS からゲスト OS にアクセスしてみます。

ssh でアクセスするには、

$ ssh -p 50022 -l (ユーザー名) localhost

http でアクセスするには、

で確認できます。