さくらVPS 2G で VirtualBox による Windows 環境の構築

これまで「さくら VPS 512」を2つ契約してて DebianWindows をそれぞれ使っていたが、2012-03-29 にさくら VPS がリニューアルして、メモリもハードディスクも増量し、2G プランも登場したことから、仮想化でやれば 2G プラン1本でいけるんじゃないかと思い、移行してみた。

さくら VPS の OS は Debian とし、それに仮想化ソフトウェア VirtualBox を入れ、ゲスト OS として Windows XP x86 を構築する。さくら VPSKVM なので、Windows は仮想化の仮想化での動作となる。

ちなみに、仮想化された Windows クライアントにアクセスするには Windows SA または Windows VDA のライセンスが必要となる。

Debian のインストール

まずは普通に Debian squeeze amd64 をインストールする(i386 のほうがよかったかもしれないが、どうなんだろ)。VirtualBoxGUI でサクッとやるため、インストール時にデスクトップ環境も入れる。

sshiptables

OS インストール後、なにはともあれ ~/.ssh/authorized_keys に公開鍵を登録し sshiptables を設定する。

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 で止めるとよい。

  • bluetooth
  • avahi-daemon
  • cups
  • gdm3
  • saned
  • network-manager
  • fancontrol
  • loadcpufreq
  • cpufrequtils
  • portmap
$ 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) への登録など、特に遅延することはなく動作に問題はない。

まとめ

「さくらVPS 512」2台で運用してたものが「さくらVPS 2G」1台で運用できるようになり、月額1,960円 (980 * 2) が月額1,480円とコスト削減が図れ、お財布的にも優しい構成となった。また、現在のさくら VPS ではできない仮想マシンの管理ができるようになり、バックアップや今後の移行も容易となった。

これもひとえにさくらのサービス向上によるもので、ほんとありがたい。

ビバ、仮想化 !