さくらVPS 2G で VirtualBox による Windows 環境の構築
これまで「さくら VPS 512」を2つ契約してて Debian と Windows をそれぞれ使っていたが、2012-03-29 にさくら VPS がリニューアルして、メモリもハードディスクも増量し、2G プランも登場したことから、仮想化でやれば 2G プラン1本でいけるんじゃないかと思い、移行してみた。
さくら VPS の OS は Debian とし、それに仮想化ソフトウェア VirtualBox を入れ、ゲスト OS として Windows XP x86 を構築する。さくら VPS は KVM なので、Windows は仮想化の仮想化での動作となる。
ちなみに、仮想化された Windows クライアントにアクセスするには Windows SA または Windows VDA のライセンスが必要となる。
Debian のインストール
まずは普通に Debian squeeze amd64 をインストールする(i386 のほうがよかったかもしれないが、どうなんだろ)。VirtualBox を GUI でサクッとやるため、インストール時にデスクトップ環境も入れる。
ssh と iptables
OS インストール後、なにはともあれ ~/.ssh/authorized_keys に公開鍵を登録し ssh と iptables を設定する。
ssh のポート番号を 25622 に変更し、公開鍵認証のみとする。
$ sudo vi /etc/ssh/sshd_config Port 25622 Protocol 2 PermitRootLogin no RSAAuthentication no PubkeyAuthentication yes PermitEmptyPasswords no ChallengeResponseAuthentication no PasswordAuthentication no UsePAM no $ sudo /etc/init.d/ssh restart
/etc/network/if-pre-up.d に iptables のスクリプトを置き、ssh だけ開ける。
$ sudo vi /etc/network/if-pre-up.d/firewall #!/bin/sh IPTABLES='/sbin/iptables' # Remove All Rule $IPTABLES -F $IPTABLES -Z $IPTABLES -X # Drop ALL $IPTABLES -P INPUT DROP $IPTABLES -P FORWARD DROP $IPTABLES -P OUTPUT ACCEPT # Accept Loopback $IPTABLES -A INPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT $IPTABLES -A OUTPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT # PING $IPTABLES -A INPUT -p icmp --icmp-type 0 -j ACCEPT $IPTABLES -A INPUT -p icmp --icmp-type 8 -j ACCEPT # SSH $IPTABLES -A INPUT -p tcp --dport 25622 -j ACCEPT $ sudo chmod +x /etc/network/if-pre-up.d/firewall $ sudo /etc/network/if-pre-up.d/firewall
VirtualBox 4.1 のインストール
Oracle VM VirtualBox から deb パッケージを落としてきて、dpkg でインストールする。依存関係で怒られたので、apt-get -f upgrade する。
$ wget http://download.virtualbox.org/virtualbox/4.1.12/virtualbox-4.1_4.1.12-77245~Debian~squeeze_amd64.deb $ sudo dpkg -i virtualbox-4.1_4.1.12-77245\~Debian\~squeeze_amd64.deb $ sudo apt-get -f upgrade $ sudo usermod -a -G vboxusers username
VirtualBox への Windows x86 のインストール
GNOME デスクトップの [アプリケーション]-[システムツール]-[Oracle VM VirtualBox] から VirtualBox をいぢるわけだが、X の解像度が 800x600 でつらい。xorg.conf を作ってゴニョるも、うまく解像度を上げることができない…。VirtualBox の設定さえ終えたら X は殺すのでまぁいいかと深追いせず進める。下図のとおり VirtualBox 画面右下の Cancel, OK が隠れてどっちがどっちかわからんで困ったけども…。
で、ウィザードで新規仮想マシンを作り、以下のような構成とした(ほとんどデフォルト)。
OS | Windows XP x86 |
---|---|
メモリ | 768MB |
ハードディスク | 30GB, VDI, Dynamically allocated |
チップセット | PIIX3, IO APIC オフ, EFI オフ |
プロセッサ数 | 1, PAE/NX オフ |
ビデオメモリ | 16MB, 3D/2D オフ |
ストレージ | PIIX4 |
ネットワーク | NAT, ホストオンリー |
プロセッサ数は2個にしたかったが、KVM 上のため仮想化支援機能が有効でないので、残念ながら1個の割り当てにしかできない。ネットワークはグローバル IP アドレスが1つしかもらえないので当然 NAT になるが、ホストからゲストにアクセスしたい (後述) ので、ホストオンリーの NIC を追加する (DHCP ではなくstatic で設定した)。
あとは iso からブートして普通に Windows をインストールすれば出来上がり。Windows のインストール後、[デバイス]-[Guest Additions のインストール] を実行し、ドライバ類をインストールする。
リモートデスクトップ
外部から Windows を操作するため、リモートデスクトップ機能を使いたい。VirtualBox には VRDP 機能 (リモートディスプレイ) があるが、ゲストは Windows なので直接 MS-RDP でやることにする。試してないけど、たぶんそのほうが性能的にもいい気がする。
また、ゲストは NAT なので、外部から直接アクセスするには VirtualBox のポートフォワーディング機能を使うのが一般的だろうが、せっかく Debian の裏に隠れているので、ssh トンネリングでリモートデスクトップ接続することにした。通信も暗号化されるし。といった理由で、ホスト (Debian) からゲスト (Windows) に通信できるようにするため、前述のとおり、ゲストにホストオンリーのネットワークを追加した。
ゲストのホストオンリー NIC の IP アドレスが 192.168.56.101 のとき、PuTTY の場合、次のように設定すれば、ssh 接続後 mstsc /v localhost:33891 で Windows にリモートデスクトップ接続できるようになる。
L33891 192.168.56.101:3389
Mac とかの場合 ~/.ssh/config に次のように書くと楽ちん。
Host debian HostName example.jp User username Port 25622 LocalForward 33891 192.168.56.101:3389 IdentityFile ~/.ssh/id_rsa
Debian の不要なサービスの停止
初期設定さえ済んでしまえば Debian のウィンドウシステムは不要なので gdm3 を停止する。併せて、以下の不要なサービスを止める。sysv-rc-conf で止めるとよい。
$ sudo apt-get install sysv-rc-conf $ sudo sysv-rc-conf
コマンドによる VirtualBox の操作
VirtualBox はコマンドが充実している。以下のコマンドで仮想マシンの起動・停止ができる。xp のところは仮想マシンの vmid を。
起動
$ VBoxManage startvm xp --type headless
停止 (というか状態保存して停止)
$ VBoxManage controlvm xp savestate
起動している仮想マシンの表示
$ VBoxManage list runningvms
自動起動と自動停止
上記のコマンドを叩くスクリプトを作って /etc/init.d に置きランレベル2に登録すれば、ホストの起動時にゲストも自動起動できる。スクリプトは http://www.glump.net/howto/virtualbox_as_a_service#create_the_initd_script あたりがいいかも。これを使う場合、Required-Start の vboxnet を削除して、vboxballoonctrl-service を追加する必要がある。
$ sudo insserv virtualbox-xp
なお、上記スクリプトによりホスト停止時に savestate されるが、以下のとおり /etc/default/virtualbox を作っておけば、/etc/init.d/vboxdrv によりホストを落としたときに savestate してくれる。
$ sudo vi /etc/default/virtualbox SHUTDOWN_USERS="username" SHUTDOWN=savestate
ベンチマーク
参考までに、これまでのネイティブ(?)な on KVM と今回の on VirtualBox on KVM でのベンチマークを取ってみた。
on KVM
on VirtualBox on KVM
数値で示されているとおり、さすがに VirtualBox を挟んでいるため半分以下の性能になっており、実際も VPS ネイティブな環境に比べると少々もっさり感があるが、ガリガリ使うわけではないし、主な用途である TARGET (競馬ソフト) の操作や JRA-VAN DataLab. データの PostgreSQL (on Debian) への登録など、特に遅延することはなく動作に問題はない。