Archive : 2009-09

みんな大好きWordPress。だからこそ、データが飛んでしまうのはなんとしても避けたいもの。そのためには、常日頃からデータのバックアップを取っておくのが重要なのですが、いちいち手動でバックアップするのは手間なので、なるべく自動化しておきたいものです。バックアップしたいのは次の二つ:アップロードしたファイルとMySQLのダンプ。そこで、UNIX環境の勉強がてら、今このブログが設置されているXREAのサーバーから、ローカルに立てたサーバへ自動的にバックアップする体制を整えてみることにしました。今回のエントリではその方法をまとめてみました。

処理の流れ

今回XREAのサーバーに設置したWordPressのデータをバックアップするにあたっては、まず、XREAのサーバー側で、MySQLのデータをダンプし、圧縮をかけてファイルとして保存する、という処理を行います。その上で、ローカル側に設置したサーバーで、ryncという差分コピー可能なコマンドをつかい、SSHを通じてサーバーからMySQLのダンプしたデータや、アップロードした画像、WordPressの本体やプラグイン、テーマをひっくるめて同期します(Pull)。そして同期したディレクトリを元に、pdumpfsを使い世代別バックアップを作成します。この処理をcronで毎日実行してやるという流れです。

このように今回はcronやrsyncを使うために、ローカル側に、毎日その時間に起きているUNIXなマシンが必要になります。そのため今回のエントリは、ファイルサーバーにするなどで自宅サーバーを運用している人以外にはハードルが高いかも知れません。ただ、起きっぱなしのサーバーが家に一台あれば、前述のようにファイルサーバーに出来るなど何かと便利ですので、これを機に、自宅サーバー構築に手を出してみるのもおススメです:D 遊んでいるマシンがあるなら、それにLinuxを入れてしまうとか、遊んでいなくても常時起こしておけるWindowsマシンがあれば、VirtualBoxを入れてその中でLinuxを動かすとか、色々方法はあります。

バックアップ手順

まずは下ごしらえ。ローカルのサーバーからリモートのサーバー(XREA)に対して操作を行うわけですが、そのためにはSSHで接続できるようにしなければなりません。XREAへのSSHでの接続については、こちらのhiromasaさんの記事を参照。但し、今回は、バックアップの自動化が目的なので、そのプロセスで手動でのパスワードの入力を求められるのは困るので、パスフレーズを空にした鍵による公開鍵認証を使います。ssh-keygenを使ってローカルのサーバーで鍵ペアを作り、公開鍵をリモートのサーバー(XREA)に配置しましょう。鍵ペアの作り方についてはssh にてパスワードを使用しないでログインする方法を参照。

次にMySQLのダンプと圧縮。と言っても、難しいことは何もありません。これについてもhiromasaさんが既にサーバー側のcronで定期的にMySQLをダンプする方法についての記事を書かれています。これを使わせてもらいましょう。今回は、pdumpfsで世代別バックアップを取っているので、日付別に保存しないように改変したものを以下に示します。

#!/bin/sh
 
# 設定(ここを自分に合わせる)
DATABASE=
DBUSERNAME=
PASSWORD=
XREAUSERNAME=
BACKUPDIR=
KEEPDAY=14
 
# 初期化(XREA/CORESERVER用)
PREFIX=mysql
SERVER=localhost
NOWDATE=`date +%Y%m%d`
DESTDIR=/virtual/$XREAUSERNAME/$BACKUPDIR
# DUMPFILE=$PREFIX.$NOWDATE.dump
DUMPFILE=$PREFIX.dump
# TARFILE=$PREFIX.$NOWDATE.tar.gz
TARFILE=$PREFIX.tar.gz
OLDDATE=`date "-d$KEEPDAY days ago" +%Y%m%d`
 
# MySQLダンプ/圧縮
cd $DESTDIR
/usr/local/mysql/bin/mysqldump $DATABASE --host=$SERVER -u $DBUSERNAME --password=$PASSWORD > $DUMPFILE
tar zcvf $TARFILE $DUMPFILE
 
# 処理判定
if [ $? != 0 -o ! -e $TARFILE ]; then
    echo "backup faild -- ($DUMPFILE)"
    exit 1
fi
 
# 圧縮前ファイル削除
rm -f $DUMPFILE
 
# n日ローテートを削除
#rmfile=$DESTDIR/$PREFIX.$OLDDATE.tar.gz
#if [ -e $rmfile ]; then
#    rm -f $rmfile
#fi

cronの設定をしない以外は、記事の通りにXREAのサーバーに配置し、設定を書き換えてやれば大丈夫です。では、試しにSSHを通じてコマンドを発行し動かしてみましょう。ローカルのサーバーで以下のコマンドを実行してみましょう。

ssh -i <秘密鍵へのパス> <XREAのユーザー名>@<サーバ名> <hiromasaさん製スクリプトへのパス>

#ウチの環境だと以下のようになります。
ssh -i ./nopass sharplab@s333.xrea.com /virtual/sharplab/backup-mysql/mysqlbackup.sh

動きましたか?動かない?SSHの接続が拒否された?それはもしかすると、XREAのサーバーにホスト情報を登録し忘れているせいかもしれません。hiromasaさんの先ほどの記事を参考に登録を行ってみましょう。

さて、とりあえず手動で登録すればよいことは分かりましたが、登録の有効期限は30日間だけに限られています。また、出先でSSHで繋ぐために別のIPアドレスを登録した場合、上書きされてしまい、再度登録しないと繋がらなくなってしまいます。そのため、ホスト情報の登録も自動化する必要があります。そこでこんなスクリプトをPythonで書いてみました。

#!/usr/bin/env python
# vim:fileencoding=utf_8
import sys
import urllib
import re

#ここを書き換えてください
server = ''
username = ''
password = ''
ipaddressResponder = ''#'http://scripts.sharplab.net/ipaddress.php'//←ウチの場合

adminURL = 'http://%s/jp/admin.cgi' % server

try:
	ipRes = urllib.urlopen(ipaddressResponder)
	ipaddress = ipRes.read()
except:
	print u'Failed'
	sys.exit()

pattern = re.compile('\d+\.\d+\.\d+\.\d+')
if pattern.match(ipaddress) == None:
	print u'Failed'
	sys.exit();

values = {'id':username, 'pass':password,'remote_host':ipaddress,'ssh2':'SSH登録'}
data = urllib.urlencode(values)
print u'Registing ipaddress(%s)...'  % ipaddress 
response = urllib.urlopen(adminURL,data)
try:
	response.read().decode('shift_jis').index(u'データベースに追加しました。反映には5〜10分程度掛かります。')
	print u'Complete!'
except ValueError:
	print u'Failed.'

まず、前もって接続してきたホストのIPを返すPHPのページをサーバーに設置し(ipaddressResponder)、そこにアクセスすることでホストのIPアドレスを調べています。PHPのページのソースはこう。

<?php
echo getenv("REMOTE_ADDR");
?>

その上で、調べたホストのIPとユーザー名、パスワードをホストの登録ページにPOSTするだけの簡単なお仕事です。Cookieとか憶えないといけないかなと思ってPython Mechanize使おうとしたのですが、必要なかったです(笑)

さて、ここまでで、SSHを通してサーバー側でMySQLをダンプする処理と、SSHのためにホストを自動登録するスクリプトの準備が出来ました。では次はいよいよ本題、rsyncによるファイルのバックアップです。rsyncによるリモートバックアップは、リモートとSSHで繋げ、リモートにもrsyncが入っていれば使えると記憶していますが、XREAはどちらも満たしています。他のレンタルサーバーでも、SSHで繋げるところなら使えるところはあるかと思います。

ではrsyncのコマンドを。

<rsyncへのパス> -avz --delete -e 'ssh -i <秘密鍵へのパス>' <XREAのユーザー名>@<サーバー名>.xrea.com:<バックアップしたいディレクトリへのパス> <同期先へのパス>

#ウチの環境だと以下のようになります
./rsync/rsync -avz --delete -e 'ssh -i ./nopass' sharplab@s333.xrea.com:/virtual/sharplab/ ./sharplab/workspace

これでXREAのサーバーとローカルのサーバーの中身を同期させられます。rsyncは更新のあった差分のみをやり取りするので二度目以降は効率が上がるのが嬉しいですね!

そしてpdumpfs。同期したフォルダをソースに、世代別バックアップを作ってやります。pdumpfsはハードリンクを活用しているので、毎日世代別バックアップを取っても、更新がかかったファイル分位しか必要とする領域が増えないので使うのに気が楽ですね。

pdumpfs <ソースディレクトリ> <バックアップ先ディレクトリ>

//ウチの環境だと以下のようになります
pdumpfs ./sharplab/workspace/ ./sharplab/backup/

ではこれらをまとめた上でcronに登録してみましょう。

まずバックアップ処理手順をまとめたスクリプトを作成します。

#サーバーに配置したMySQLのダンプ&圧縮スクリプトを起動
ssh -i <秘密鍵へのパス> <XREAのユーザー名>@<XREAのサーバー名>.xrea.com <hiromasaさん作のスクリプトへのパス>
#サーバー全体をworkspaceディレクトリと同期
<rsyncへのパス>/rsync -avz --delete -e 'ssh -i <秘密鍵へのパス>' <XREAのユーザー名>@<XREAのサーバー名>.xrea.com:<バックアップ対象としたいディレクトリへのパス> <一時保存先のディレクトリへのパス>
#pdumpfsで世代別バックアップ
pdumpfs <一時保存先のディレクトリ> <バックアップ先>

そしてこれを毎日呼び出すようにcronを設定します。

HOME=<registHost.pyやbackup.shを配置したディレクトリ>
#毎日午前四時 SSHを使うにあたり、ホスト情報をXREAに登録
0 4 * * * <registHost.pyやbackup.shを配置したディレクトリ>/registHost.py

#毎日午前四時十分 XREAのバックアップの本処理
10 4 * * * <registHost.pyやbackup.shを配置したディレクトリ>/backup.sh

さて、最後に忘れちゃいけない作業があります。

それはバックアップのリストア作業のテスト。バックアップをとったは良いけど、実はうまく取れていなくて、いざ必要になった時に使い物になりませんでしたでは悲しすぎます。忘れずにリストア出来るか確認しておきましょう。お疲れ様でした!

以前あげたC# .NETアプリケーション開発 徹底攻略 Listing2.26への疑問 – SharpLab.というエントリに対して、なちゃさんから、

なちゃ 09-09-23 09:15:19 JST

本来、デリゲートでBeginInvokeした場合は、必ずEndInvokeする必要がありますね。
リソースリークなども発生する危険があります。
※デリゲート以外でもBegin~系は基本的には同じですが

EndInvokeさえすれば、きちんと発生した例外がスローされてきます。
けして例外が握りつぶされているのではなく、正しく使っていないために握りつぶされているように見えているだけですね。
ちょっと書籍の記述がまずいと思います。

という指摘がありました。なるほど!指摘の通り、Begin EndパターンなのでEndInvokeを必ず呼び出す必要がありました。恥ずかしながらすっかり失念していました。。というわけでEndInvokeを使うように修正。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;
using System.Threading;

namespace SharpLab.ThreadExceptionTest {
	static class Program {

		static Form form;

		/// <summary>
		/// アプリケーションのメイン エントリ ポイントです。
		/// </summary>
		[STAThread]
		static void Main() {

			Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(Application_ThreadException);
			Thread.GetDomain().UnhandledException += new UnhandledExceptionEventHandler(Program_UnhandledException);

			Application.EnableVisualStyles();
			Application.SetCompatibleTextRenderingDefault(false);
			form = new Form();
			Application.Run(new Form1());
		}

		static void Application_ThreadException(object sender, System.Threading.ThreadExceptionEventArgs e) {
			MessageBox.Show(e.Exception.Message);
		}

		static void Program_UnhandledException(object sender, UnhandledExceptionEventArgs e) {
			Exception ex = (Exception)e.ExceptionObject;
			MessageBox.Show(ex.Message);
			Application.Exit();
			Environment.Exit(0);
		}

	}
}
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;

namespace SharpLab.ThreadExceptionTest {
	public partial class Form1 : Form {
		public Form1() {
			InitializeComponent();
		}

		private delegate void SampleDelegate();

		private void button1_Click(object sender, EventArgs e) {

			SampleDelegate a = new SampleDelegate(ThreadMethod);
			a.BeginInvoke((asyncResult) => {
				a.EndInvoke(asyncResult);
			}, null);
		}

		private void ThreadMethod() {
			//意図的に起こした例外
			Thread.Sleep(5000);
			throw new Exception("非同期スレッドで起こった例外です。");
		}

	}
}

image

こんな感じでしょうか。ちゃんとサブスレッドで例外が発生した時にUnhandledExceptionが呼び出されるようになりました!これで正しく確実な終了処理ができそうです。サブスレッドの処理内容をすべてtry~catchで括って必要に応じて例外をリスローする必要があると憶えていたのですが、そうではなかったのですね。いつもtry~catch書きながらなんかおかしい気がしていたのですが、これですっきりしました。なちゃさん、ありがとうございました。

前のエントリで紹介したWebkit.NETはまだC#などのコードからDOMにアクセスする方法は実装中であるため、正式には提供されていません。提供されているのは基本的なナビゲーションなどに限られています。そのため、出来ることは相当制限されています。がしかし、表示されているページの中でJavaScriptのコードを実行させる方法がForumに上がっていましたので紹介します。これがあれば多少の助けにはなりそうです。

ソースコードはこんな感じ。

private void button1_Click(object sender, EventArgs e) {
    FieldInfo fi = typeof(WebKitBrowser).GetField("webView", BindingFlags.NonPublic| BindingFlags.Instance);
    WebView webView = (WebView)fi.GetValue(this.webBrowser1);
    webView.stringByEvaluatingJavaScriptFromString(@"document.body.innerHTML = 'Hello Webkit DOM!';");
}

リフレクションを使っています。WebKitBrowserにはwebViewというprivateなメンバがあり、それはWebViewインターフェイスを実装しています。このwebViewをリフレクションで取得し、そのメンバにstringByEvaluatingJavaScriptFromStringというJavaScriptコードを引数として渡してやると実行してくれるメソッドがあるので、これを利用するという方法です。このメソッドの戻り値の型はstringなのですが、実行結果を取得することはどうもできないようです。 WebViewの他のメンバの実装がどれぐらい進んでいるかはまだ試していないのでわからないのですが、WebViewについては、Webkitですし、Cocoaのリファレンスを参照するとよさそうな感じがします。

SEP
18

Webkit.NETを触ってみた

Published:2009-09-18 01:52:13 UTC

image 「C#凄い使いやすくて良い言語なんだけど、WebBrowserコントロールは残念だよなー、Trident最近頑張ってるんだけどWebkitとかに比べるとまだまだだよなー」とか常日頃から感じていたのですが、ふと「WebkitをC#から扱うためのラッパーとか探せばあるんじゃね?」という思いつきで「Webkit .net」とググってみると、ありましたありました、「Webkit.NET」というまんまなタイトルのプロジェクトが。オープンソース恐るべし。コンパイル済みのバイナリと共に、サンプルアプリがあったので実行してみました。

image

・・・なにこれ凄い。日本語も全く普通に通りますし、普通に使えそうです。というわけで自分でもテスト用にWinFormsプロジェクトを作って動かすテストをしてみたので、メモを残しておきます。

まず、WebKit.NETライブラリをWebKit .NET | Get WebKit .NET at SourceForge.netからDLしてきます。その中のbinフォルダ内のファイルがライブラリを構成しています。WebKitBrowser.dllがC#から参照するラッパーです。

まず、WebKitBrowserをツールボックスに追加してやります。ツールボックスのコンテキストメニューの「アイテムの選択」という項目をクリックします。

image

この際、ダイアログが表示されるまで、めちゃ重たいかもしれませんが、ぐっとこらえましょう。

image

そして参照ボタンをクリックして、WebKitBrowser.dllを選択してやれば、ツールボックスにWebKitBrowserが追加されます。

image

あとは普通にコントロールをポトベタしておわり…でもありません。。

まず、プロジェクトのプロパティから、プラットフォームターゲットをx86に設定します。Webkitは、現在、x86版のみ提供されているそうです。
image

続いて、デバッグのタブにある、「Visual Studio ホスティング プロセスを有効にする」という項目のチェックを外します。Visual Studioホスティングプロセスは、Visual Studioでのデバッグを効率化させるためのもののようですが、今回のようにアンマネージドコードを連携する場合は上手く働かず、エラーの原因になることがあるようです(Visual Studioホスティングプロセスの解説:VSホスト・プロセス(*.vshost.exe)とは何か?[VS 2005のみ、C#、VB] - @IT)。これが原因のエラーにぶつかって、@JZ5さんに助けを求めたところ、このオプションを教えていただけました。ありがとうございました。

image

こうしてビルドした上で、最後に仕上げに、ビルドして出来た実行ファイルやWebKitBrowser.dllと同じディレクトリに、Webkit本体であるWebkit.dllや、その依存するdll群を放り込みます。ビルド後のイベントでコピーするコマンドを発行してやると良いようです。

image

というわけで出来ました。よいよい。素晴らしい。DOM周りのメンバの実装が未だらしく、出来ることは結構限定されていますが、Monoでも動かせるようにしたいよねー、とREADMEに書かれていたりと、これからの進展に期待したいプロジェクトです。

SEP
15

タイ行ってきました。

Published:2009-09-15 02:08:18 UTC

タイ行ってきました。寺院めぐりとかしてみると、日本の仏教建築との違いが結構面白かったのですが、街中ではタイにおける日本の文化的な影響力が強すぎて、「海外に来た―!」という高揚感があんまりなかったのも事実。まぁ楽しかったです。

P1020226P1020091
P1020097P1020075
P1020062P1020166
P1020217P1020214

SEP
14

物欲沸々。。

Published:2009-09-14 23:46:52 UTC

涼しくなってきましたね。秋です。物欲の秋です!

夏にしていた頼まれ仕事が落ち着いて、普段しているバイトとあわせて財布に結構余裕が出てきたので、物欲がどんどん膨らんできている今日この頃です。

ラップトップ

今買いたいなぁと思っているのはまずラップトップ。何しろ10/22にWindows 7が一般向けにリリースされますし、Visual Studio 2010はWPF化されてやたら重くなりそうなので、そろそろラップトップを買い替えたいなぁと思っています。買い換える上で基準としたいのは、処理速度、堅牢性、携帯性、適度な画面サイズです。

今気になっているのはThinkPadのX200とVAIO Type Z。ThinkPadは大学の研究室に結構あり、触れてみる限りでは確かに噂通り頑丈で良さそうな印象を持っています。逆にVAIOは、現在使っているVAIO Type SZから判断するに、結構軟弱です。機嫌よく動いていてくれている時は良い機種なのですが、故障が多く、かなり修理に出費を強いられたのは苦い思い出です。まぁSonyは延長保証(\15,000程)さえ入れば3年間無償修理をしてくれるので、今度はそれに入っておけば問題にならないかなぁと。。

ちなみに筐体で言えば、MacのUnibodyは正直無いなぁと思っています。結構周りでぶつけた拍子にMBPの角が凹んでしまった人を見かけますし、Airは筐体が歪んで机に置いたときにがたつく様になったという話も聞きます。その上延長保証サービスであるAppleCare Protection Planは¥31,500もしますし(そんなに故障率が高いのか?)。。表面的なカタログスペックや見てくれは立派なんですが、ちょっとMacBookは、ねぇ。。

話をThinkPadに戻すと、やはり携帯性を考えると、モバイル最重視のXシリーズっていいなぁと。画面サイズで言えばX301が13.3インチで1.5kg程と一番望ましく感じられるのですが、CPUが低電圧版なのが気にくわないところです。低電圧版はバッテリの持ちは良くなりますが、値段が跳ね上がり、処理性能は落ちます。自分はたとえバッテリの持ちが悪くなっても通常電圧版CPUであってほしいと考えるタイプなので、やはり画面の小ささは我慢してX200なのかなぁと。

頑健さでいえばLet’s Noteがありますが、こちらは全てのモデルのCPUが低電圧版、超低電圧版に限られているので、これも自分的にはないなぁと。

一方VAIO。Type Z、以前は30万越えは普通というとてつもなく高いシリーズというイメージがありましたが、最近はSSD他の値段の下落に応じてか、20万半ば頑張って捻出すれば十分すぎる性能のモデルが手に入るようになってきたようで、心惹かれるものがあります。画面サイズは13.1インチあり、重量は1.6kg、CPUは通常電圧版と、カタログスペックは非常に素敵です。

ただ、じゃあType ZかX200を買うかというと、まだ迷っていて、というのはコードネームCalpellaとかいうモバイル向けCPUが出てくるそうですし、それにあわせたモデルチェンジをまってみるのもいいかなぁと考えています。なかなか、腹が括れません。。

ハンディデバイス

それより、いま一番買おうかと悩んでいるのがiPod Touch。自分はApple教信者じゃないので、iPhoneは買わずにきました(アプリ開発にMacが要るのが気にくわなかった)。ですが、これだけiPhone/iPod Touchのアプリが揃ってくると流石に興味が出てくるもので、アプリは書けないものの、おもちゃとして買ってみようかなぁと考えています。本当はiPhone 3GSがGPSやカメラなど各種機能が一番統合されていて便利なのでしょうが、今手持ちのTouch DiamondにE-Mobile公認の機能としてあるラップトップとのテザリング機能を手放す気にはなれないので、iPhoneを買うのではなく、iPod Touchを買い、Touch DiamondとiPod TouchをWifiかBTで結んで使ってみるという絵図を描いています。

Appleが出すと噂のタブレットも気になって入るのですが、登場時期が早くとも年明け以降と予測されていて、結構まだ時間が空いていること、出たとしても結構値が張りそう、タブレットだと片手で歩きながら弄れるサイズではない、ということを理由にiPod Touchの方が自分には合っているのだと自分に言い聞かせています(笑)。(しかし、タブレットが出たとして、通信モジュールはどうなるんでしょうね?Touch以上にインターネットへの接続が重要なデバイスになりそうですが、Expressカード型などの通信カードに頼るのか、WiMAX/Wifiモジュールを内蔵するのか、3Gを内蔵するのか、結構興味があります。USBドングルやExpressカード型の通信カードをぶっさすスタイルは見てくれがスマートじゃないのでJobsが嫌いそうなものですが。。)

まぁ、というわけで、これから数カ月は節制生活に入ります。。買ってやるぞー!

以前組み立てたは良いものの、大学やバイト先に持っていくので常用しているラップトップ(VAIO Type SZ)と使い分けが出来ず、メインマシンになりそこねていたShuttleのベアボーンを使って、流行りの仮想化というものに挑戦してみました。

仮想化というのは、一台のマシンの上で、実機をエミュレートした仮想のマシンを走らせることで、複数のOSを並行して走らせたりすることをいいます。一台のサーバーが複数のマシンの役割を果たしてくれる仮想化は、遊んでいるハードウェアは殆ど持っていない自分にとって夢のような技術です。幸い、組み立てていたPCは、こういうこともあろうかと余裕を持たせて4コアのCPUを積んでいたりしたので、挑戦することが出来ました。

これまでもWindows 7 RCとUbuntuをデュアルブートで入れてみたり、それらのOSの上で動くVirtual Boxという仮想化用のソフトを使いDebianやら色々走らせること(ホストOS方式)はしていたのですが、今回は仮想化でも、ハイパーバイザ方式での仮想化を試みてみました。ハイパーバイザ方式とは、ハイパーバイザという仮想化専用のOSを実機にインストールし、そのハイパーバイザが提供する仮想のマシンの上でOSを動かす方式です。ハイパーバイザ方式だと何がいいかというと、仮想化専用のOSがホストOSなため、ホストOSに無駄なリソースを喰われたり、ホストOSのアップデートなどでVMを落とす必要に迫られることが少ない点が優れています。今回は、VMware ESXiというハイパーバイザを入れ、その上にWindows 7 RCとUbuntu、CentOS、Free NASなど諸々を入れてみることを目指しました。VMware ESXiは以前、大学のサーバーで触らせてもらったことがあったのですが、そのときはCPUのコア:たくさん、メモリ:いっぱい、という、まぁ化け物みたいな構成のもので、後はVMを作るだけという状態で弄らせてもらったので簡単だったのですが、今回はサーバー機でない単なるベアボーンで一から構築したので少し難儀しました。

まず一点目がインストール時にHDDを認識しないという点。IDEのHDDを認識しないというのは聞いていたのですが、SATAで繋いでいた自分のマシンでも駄目でした。色々試したりしているうちに、ググって出てきたのがVMware ESXi を IDE HDD にインストール – trial and errorというページ。曰く、SATAでもAHCI モードで動いてない場合、IDE HDDとして認識され、それがもとで弾かれているとかなんとか。そこでBIOSの設定を見直し、AHCIモードに切り替えてみたのですが、こんどはSATA接続のDVDドライブが認識されないという問題が発生。どうもDVDドライブのファームウェアに問題があるらしく、泣く泣く設定を戻し、VMware ESXi を IDE HDD にインストール – trial and errorで紹介されている、インストールスクリプトでIDE接続のHDDをはじいている部分を書き換えるという方法で乗り切りました。DVDドライブをあきらめても良かったのですが、そうするとESXiをアップデートする必要に迫られた時に面倒がおきそうだったので、AHCIモード動作化は今回は見送りました。

続いて直面したのがオンボードのNICが認識されないという問題。なんでもESXiはIntelかBroadcomのチップを載せた一部のLANボードにしか対応していないとか。。こればかりは仕方がないので、EXPI9301CTというLANボードをAmazonでポチリ。\4,680と、目玉が飛び出るような高さではないけれど、今じゃ\4000もあればバルクのDVD±RWドライブが買えてしまうことを考えると、ちょっと高いかなと感じたり。そういうものなのでしょうか。

image ここまで来ると後は簡単で、ハイパーバイザに固定IPを割り振り、そのIPに対して、ラップトップにインストールしたVMware Infrastructure Clientで接続してVMを作っていくだけの簡単なお仕事になります。

なにはともあれまず入れたのはWindows 7。もうRTMもMSDNやTech Netで出てますし、Tech Net Direct Plusに申し込んで、RTMを手に入れても良いかと思ったのですが、折角Tech Net Direct Plusに申し込むならOffice 2010も欲しいよね、ということで、ぐっと我慢してOffice 2010のリリース時期がもう少し信じられるレベルまで固まるまで待つことにし、とりあえずはWindows 7 RCをインストール。その上でそのWindows 7に対し、リモートデスクトップ接続できるように色々と設定を行いました。VMware Infrastructure Clientのコンソールも、よいのですが、Aeroが効かないし、効率はやはりリモートデスクトップ接続に劣るからです。LAN内での接続はすぐ上手くいったのですが、外からインターネット経由で繋ぐのは少し難儀しました。自分の家は当然固定IPなぞ持っていないので、ダイナミックDNSサービスを利用し、ドメイン名でアクセスし、ブロードバンドルータからWin7のVMに対してリモートデスクトップ接続に使うポートをポートマッピングしてやったのですが、なぜか繋がらないという。。ラップトップからLANケーブルを引っこ抜き、代わりにイーモバイルの回線経由で接続のテストをしているつもりだったのですが、実は無線LANで家のネットワークにぶら下がりっぱなしだったのが原因でした。VMware Infrastructure Clientの接続が切断されない時点で気付くべきだったのですが、なかなか。。。時間を無駄にしてしましました。

つづいてセットアップしたるはFreeNAS。古いPCを簡単お手軽にNAS化できるアプライアンスOSです。数日前に7年程前のPCを引っ張り出してきて試してみたものの、そのPCのファンの五月蠅さに常時立ち上げておく気になれず、どうしたものかと思っていたものを移行させるために作成しました。本当はRAID化やバックアップの設定もしたいところなのですが、何せ物理HDDがベアボーンに内蔵させている一台しかないので、今のところはあきらめています。いずれeSATAでいくつもHDDを足したいところです。

更に続くはUbuntu.今のところ一応入れてみただけです。多分ずっと寝かせっぱなしになりそうだなぁ。。

そしてCentOS。とりあえずこいつを安定的に運用するのが目的。ぶっ壊すの覚悟のテスト用と、安定的に運用する奴と二つ。仮想化環境でなければ自分には到底実現できない、ぶるじょあな構成(笑)。壊したとしても、スナップショットがあるので、直ぐ戻せるという仮想化の利点を生かして、これでLinuxの勉強をしてみたいと思います。