Hatena::ブログ(Diary)

いっつもわすれる

2012-04-13

さくら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 でサクッとやるため、インストール時にデスクトップ環境も入れる。

sshiptables

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 が隠れてどっちがどっちかわからんで困ったけども…。

f:id:chabom:20120410120205p:image:w640

で、ウィザードで新規仮想マシンを作り、以下のような構成とした(ほとんどデフォルト)。

OSWindows 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に登録すれば、ホストの起動時にゲストも自動起動できる。スクリプトは Setup VirtualBox as a Service in Linux | Glump.net あたりがいいかも。これを使う場合、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

f:id:chabom:20120411232033j:image:w360

on VirtualBox on KVM

f:id:chabom:20120411232032j:image:w360

数値で示されているとおり、さすがに VirtualBox を挟んでいるため半分以下の性能になっており、実際も VPS ネイティブな環境に比べると少々もっさり感があるが、ガリガリ使うわけではないし、主な用途である TARGET (競馬ソフト) の操作や JRA-VAN DataLab. データの PostgreSQL (on Debian) への登録など、特に遅延することはなく動作に問題はない。

まとめ

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

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

ビバ、仮想化 !

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/chabom/20120413/1334245017
リンク元
ページビュー
30926