家では MacBook をメインで使っていますが、Illustrator / Photoshop (Windows 版) で図を書いたり、Visual C++ や Office が必要な時にはわざわざ ThinkPad を起動し VNC で接続したり場所を移動したりしています。Windows XP はかなりレガシーな雰囲気が否めませんが開発事を行っていると中々手放すわけには行かない環境でもあります。
そこで自宅サーバのコア数/メモリ/ディスクに余裕を持たせ Xen で仮想化した上に Windows XP を構築し、必要なときに VNC で接続して使おうと思い立ち新しいサーバを構成したわけです。この記事では Xen 上で Windows XP を起動するまでの構成について書いています。
Xen で Windows を動作させるには準仮想化に対応した CPU が必要です。具体的には VT (Intel Virtualization Technorogy) に対応している必要がありますので、使おうとしている CPU が VT に対応しているか先に調べてください。
CPU | Xeon E3-1230 |
---|---|
OS | CentOS 5.6 final, Kernel 2.6.18-238.12.1.el5 |
Xen | 3.0.3-120.el5_6.2 |
唐突にメールサーバを立てようと思った。
現在サーバにはアプリケーションサーバ用とデータベースサーバ用の 2 のゲスト (共に Linux) が常駐している。しかし、半ば実験場と化している AP サーバはダウンタイムが大きいし、DB サーバは単体で完結しておきたい。そこでゲストをもうひとつ増やすと同時に、以前からやろうと思っていた Solaris 10 for x86 を入れてみることにした。
そのとき書いた Solaris 10 インストール手順
家のサーバから mail コマンドで外部へメールを送信しようとすると、送信者が 「user-name@localhost.localdomain」 になってしまう。いくつかのホストではこのようなドメインを SPAM とみなして弾くようだ (特に携帯は厳しい)。sendmail で外向けのメールのドメインを変更しよう。
root ユーザになって /etc/mail/sendmail.mc を開き、以下のコメントアウト (行頭の dnl) を外す。
MASQUERADE_AS(`foo.domain.com')dnl
FEATURE(masquerade_envelope)dnl
MASQUERADE_DOMAIN(localhost)dnl
MASQUERADE_DOMAIN(localhost.localdomain)dnl
MASQUERADE_DOMAIN(domain-alias.com)dnl
MASQUERADE_AS には localhost.localdomain の代わりに付けたいドメインを記述する。
FEATURE はこの変換をヘッダだけでなく MTA がやり取りするエンベローブ情報にも適用するコトを意味する。また、domain.alias.com だけでなく *.domain.alias.com に適用したい場合には masquerade_entire_domain を指定する。
MASQUERADE_DOMAIN は変換元のドメインを指定する。上記の例だと localhost, localhost.localdomain, domain-alias.com を対象としている。見ての通り複数指定が可能であり、これらのいずれかに一致したドメインは MASQUERADE_AS で指定したドメインに置き換えられる。特にエイリアス等を付けてなければ localhost と localhost.localdomain だけで良いだろう。
もう一つ覚えておく必要があるのが EXPOSED_USER。これに指定されたユーザは上記の変換が適用されない。通常はデフォルトで root や postmaster が設定されているはずだから、これらで外へのメールは制限が付いていると思って良い。
sendmail.mc を編集したら以下のコマンドで sendmail.cf を作り直し:
$ m4 /etc/mail/sendmail.mc > /etc/mail/sendmail.cf
sendmail を再起動しよう。
$ /etc/rc.d/init.d/sendmail restart |
再起動したら mail コマンドなどを使用して外にメールを送信してみよう。意図したドメインが付いていれば成功 (root だと EXPOSED_USER に引っかかって変換されないので注意)。ちなみに MTA から返されるエラーメールの送信者もちゃんと MAILER-DAEMON@foo.domain.com に変換されるようになる。
Unix では ~/.forward や /etc/aliases を使用して、メールの受信をトリガーにプログラムを起動することが出来る。
Unix の .forward ファイルは受信したメールを別のアドレスに転送するために使われることが多いのだが、パイプを使用してメールの内容をプログラムに渡すこともできる。記述方法は超簡単、| の後に実行権限のあるファイルを指定するだけ。もちろんシェルスクリプトでも C で作ったバイナリでもかまわない。
| myprogram |
.forward は個人管理のファイルなので、自分が受信したメールを加工処理して別アドレスに転送するような場合によく使用される。例えば vacation を使えば不在通知を自動応答する事も出来る。
一方、/etc/aliases はメールボックスのエイリアスを記述するためのファイルだ。こちらのファイルでも同様にパイプを使用して受信メールをプログラムに渡すことが出来る。
support: |/usr/company/replyandstore.sh |
これを利用して、受信と同時に機械的な応答メールを返し、サポート依頼データベースに保管するといったような使い方が出来る。
.forward, aliases どちらのファイルでも、起動されたプログラムは標準入力 (C の stdin, C++ の cin, Java の System.in) からメールの内容を読み出すことが出来る。まぁ、後は焼くなり煮るなり、至って普通のパイプ処理である。
こんなことが自由に出来てた古きよき時代もあった…
CVS ってディレクトリごとまとめて追加って出来ないんだよな…。Linux でディレクトリ hoge をまとめて追加したい場合は bash の力を借りてこんな感じ。
cvs add `find hoge -type d -print` |
最初に hoge 以下の全ディレクトリをガツンと追加。次に全ファイルをごっそり追加。ただし CVS の管理ディレクトリに入ってる奴は除いて。最後に commit でめでたくディレクトリ全部コミットされましたと。