2012/02/18

apache経由でwebminを使う

今回のお話は...

・apache + SSL + クライアント証明書 でサーバを構築する(構築済みとする)
・apacheのproxy機能を使って、https://ec2.my.server/webmin/ を localhost:10099にリダイレクトする
・webminはリソース大食いなので、webminはdaemonで常時動かさずxinetd経由で必要時のみ起動させる
・セキュリティ上の観点から webminが待ち受けるポートはデフォルトの10000ではなく、10099(任意)に変更する
・同じく、webminは127.0.0.1からのみの接続を許可する

要は、安全にwebminを使えるようにしましょう、というお話です。

AWS EC2インスタンスで構築したサーバをwebmin経由で操作できるように設定します。webminをデフォルトで起動すると 10000番ポートをLISTENし、基本的にbasic認証になりますが、今回サーバでは既にapacheが起動しており、SSL接続のクライアント認証しているので、アクセスコントロールはこちらに任せることにします。
職場などの環境からは10000番ポートに限らず大方のHigh-Portはブロックされているので、SSL(443)でアクセスする必要がありました。これはapache proxyで解決させます。
webminをapache経由(mod_proxy経由)にする方法は http://www.webmin.com/apache.html に書かれていますが、SSLが絡むと少し追加設定が必要でした。

まずは webminをインストール。
http://webmin.com/download.html から .deb形式のファイルをダウンロード。
2012/1/29時点では http://prdownloads.sourceforge.net/webadmin/webmin_1.580_all.deb でした。
# wget  http://prdownloads.sourceforge.net/webadmin/webmin_1.580_all.deb
# dpkg -i webmin_1.580_all.deb

libxxxに依存している とエラーが出るので、dependパッケージをインストールします。この追加するパッケージは環境によって異なると思いますので、必要なものをインストールしてください。
# aptitude install libnet-ssleay-perl libauthen-pam-perl libio-pty-perl apt-show-versions

apache側の設定。proxy設定をします。
Debianのapacheはproxy(mod_proxy)が使えるようにビルドされているので、モジュールでそれを有効にします。
# a2enmod proxy
# a2enmod proxy_http

SSL接続なので、SSLProxyEngine On にしておきます。これを忘れると 500番台エラーになります。ちょっとハマりました。
/etc/apache2/conf.d/proxy (新規作成)
SSLProxyEngine On
ProxyPass /webmin/ https://localhost:10099/
ProxyPassReverse /webmin/ https://localhost:10099/

/etc/apache2/mods-available/proxy.conf を以下のように書き換えます。
ProxyRequests On
<Proxy *>
# AddDefaultCharset off
# Order deny,allow
# Deny from all
Allow from all
#Allow from .example.com
</Proxy>

webmin側の設定
/etc/webmin/config に以下の設定を記述します。(変更点のみ)
webprefix=/webmin
webprefixnoredir=1
referer=***.***.jp    # 新規追加行。稼動しているホストのDQDNを記述します。

/etc/webmin/miniserv.conf を編集して xinetd経由にします。(変更箇所のみを記述しています)
#session=1
inetd=1
webmin daemonが動いている場合はそれを停止し、サーバ再起動などでdaemonモードで起動しないようにします。
# /etc/init.d/webmin stop
# update-rc.d webmin remove
 
/etc/xinetd.d/webmin を新規に作成します。
# webmin
service webmin
{
disable = no
type = UNLISTED
id = webmin
socket_type = stream
protocol = tcp
user = root
wait = no
env = LANG=
port = 10099
server = /usr/share/webmin/miniserv.pl
server_args = /etc/webmin/miniserv.conf
}
 
xinetdのリスタート
# /etc/init.d/xinetd restart

10099番ポートを誰がLISTENしているか、確認します。
# lsof -i:10099
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
xinetd 18478 root 5u IPv4 5968365 0t0 TCP *:webmin (LISTEN)
無事にxinetdがLISTENしています。

apacheをリスタートします。
# /etc/init.d/apache2 restart

クライアント証明書をインストールしてあるwebブラウザから、 https://ec2.my.server/webmin/ にアクセス。

https://ec2.my.server:10099/ のようにポート番号直打ちでアクセスされるとapache proxyを経由せずにbasic認証になるので、ブルートフォース攻撃の対象になるおそれがあります。
対策として、webmin上の設定で、Webmin Configuration の Ports and Addresses にて 127.0.0.1 からの接続のみを受け付ける(apacheでproxyされたものだけを受け付ける)ように変更します。
これでアタックが多い日でも安心。

お楽しみください!

参考URL
webmin公式
http://www.webmin.com/apache.html
ネットワーキングすきま情報
http://last-resort.seesaa.net/article/123147890.html
bushimichiの日記
http://d.hatena.ne.jp/bushimichi/20090417/1239970196


2012/02/11

Blogpress had updated.

オンラインに記事が保存出来ないという致命的なバグを含んでいた Blogpressが数週間という緩慢な速度で更新されたので書き込んで見るテスト。

追記。
はい、無事に修正されているようです。
公開出来ないBlog管理/作成アプリではお笑いにしても寒過ぎます。

2012/01/24

EC2インスタンスのDynamic DNSへの登録

今回構築したAWS EC2のインスタンス(サーバ)はElastic IP Addressは付与せずに動的IPアドレスで運用しているので、世界から見たホスト名は ec2-xxx-xxx-xxx-xxx.ap-northeast-1.compute.amazonaws.com です。(xxx-xxx-xxx-xxxにはIPv4アドレス相当の数字が入ります)
リブート(インスタンス停止/開始)するとIPアドレスも変化するので、外部からホスト名決め打ちで接続することができるように Dynamic DNSへの登録をします。
数あるDDNSサービスの中から、今回は無料で、ドメイン名が短く、さらにDNS登録が簡単に行える(=危険性もあり。後述) ddo.jp (http://ddo.jp)を選びました。
無料で xxxx.ddo.jp (xxxxは任意)のドメインが登録でき、Aレコード1つ、MXレコード3つ、TXTレコードが登録可能で、一ヶ月更新がないと自動的に登録が削除されるサービス。今回は 1サーバだけなので、無料の範囲で十分です。

DDNS更新はwebアクセスのgetメソッドで行います。
http://free.ddo.jp/dnsupdate.php?dn=xxxx.ddo.jp&pw=xxxxxx
にアクセスすることで DDNSが更新されます。

Linuxからの更新は具体的には、
wget -O - 'http://free.ddo.jp/dnsupdate.php?dn=xxxx.ddo.jp&pw=xxxxxx'
のコマンドを cronで一日一回の周期で定期的に行うように設定します。

このDNS更新方法の欠点は、httpのgetメソッドを使うため登録ドメインと登録用パスワードが平文でインターネット上を流れる、という事です。
これらが第三者に漏洩するとファーミングされてしまい、正しいドメインを指定しても第三者が指定したサーバに接続されてしまうので注意が必要です。
(注意といっても、気が付いたときにはもう遅いんだけどさ)





2012/01/21

自宅サーバをAWSへ移行する検討

これまで10年以上前から、時代遅れのCPU(Pentium時代にi386を使うとか)を搭載した中古ノートPCを安く購入しては自宅に設置し、基本的に24h/7dサーバを運用してきました。
CPUパワーは必要としないので問題はないのですが、ストレージやメインメモリの容量制限から数年ごとにリプレースする必要が生じ、そのたびに次の中古PCを購入してはOS(Debian GNU/Linux 1.3(bo)の頃から Debian一択です)を入れ替えてきたのが、そろそろ疲れた…
と思って先日 Xenによる仮想環境を作成してハードウェア変更に伴う環境構築のやり直しは回避できる環境にしましたが、そろそろ...

中古のノートPCを24h運用するのはやはりあまりよろしくないであろうということから、Amazon Web Servicesの一つ Amazon EC2で仮想サーバを借りて運用することにしました。
EC2はよくあるWebベースレンタルサーバー(?)と異なって sshログインして ターミナル上で rootになって何でも作業できるので自由度も違います。

それにいまなら(2012/1/19現在) マイクロインスタンスのLinux(or Windows Server)を1年間無料で使用できます。(http://aws.amazon.com/jp/free/)
マイクロインスタンスは 613 MB メモリ、5GBストレージ、32ビッドまたは64ビットプラットフォーム で、CPUは他インスタンスの空きリソースを使うタイプですが、現在自宅サーバで使用している EeePC 4G-Xに比べれば十分なスペックです。
(インスタンスについては http://aws.amazon.com/jp/ec2/ を参照してください)
1年間の無料期間が終了しても、同じマイクロインスタンスであれば オンデマンドからリザーブドインスタンスにして 1年間 $65+$0.009/時*750時間 = $71.75 ですから格安です。
AWS EC2の価格設定は、CPUやメモリのサーバスペック、使用するストレージ、データ転送量などいろいろな要素があるので公式サイトで確認してください。無料マイクロインスタンスも各種制約があります。 (http://aws.amazon.com/jp/ec2/pricing)

早速 AWSにweb経由で登録すると、本人確認用の電話が掛かってくるので正しくpin番号を音声で伝えます。英語で答えても発音が悪いらしく何度言っても全く伝わらなかったのですが、日本語で答えたらOKでした...

AWSアカウントが作成したら、AWS Management Consoleにログインして Launch Instance でインスタンスを作成します。
DebianはCommunity AMIsから選択する必要があり、私は EBS image のDebian 64bit (rightimage_debian_6.0.1_amd64_20110405.1_ebs) を選択しました。



さぁ、遊びましょう!







2012/01/12

Blogpress update again, again

Blogpressが再び更新されて ver.3.0.2 になったので試してみます。
line breakのbugfixと書かれていたから、今度こそ大丈夫...と願いたいところです。
日本語の変換カラムに隠れる問題は治っていないようで、少々残念です。

追記
改行問題は解決しています。
この記事を読み返してみると、小学生の作文みたいですね。





2012/01/04

Blogpress update again

iPhone/iPad アプリケーション Blogpress がまた更新されたので、さっそく使ってみました。 改行問題は解決したかな? カーソルが漢字変換カラムに隠れる問題は再発しているようだ。非常に入力し辛い、何とかして欲しいものです。 追記 改行は勝手にはいらないようです。

2011/12/23

BlogPress update

iPhone/iPad用ブログ管理アプリの BlogPressがやっと更新されました。 iOS5になった時と記憶していますが、管理画面で公開済や一時保管中の記事が見えないという不具合がありました。 一気に書いて公開してしまえば問題無いとはいうものの、私なりに遂行して何度も保存と編集し直しをする者にとっては致命的でした。 更新後、早速こうして記事を書いてみました。 おぉ、あたり前ですがちゃんと直っている。素晴らしい。 日本語入力IMEの表示カラムにもちゃんと対応しているようです。カーソルが隠れたかな? と思っても、少し待てばスクロールしてくれます。有り難や、有り難や。 追記。 何だか改行がダメっぽい...

2011/10/02

ディスクイメージを再構成をしてスパースファイルを小さくする

一時的に作成されたファイルにより大きくなってしまったスパースファイルを小さくする為に、イメージの再構成をします。

例によって、これは未来の私宛のメモです。
ホスト名やディレクトリ名などは架空のものであり現実とは関係ありません

環境
ワーク領域に SDHCカードを/dataにマウントして使用する。
元のファイルはXen guestマシン(Linux)用のイメージファイルとする。
イメージファイルはホストマシンの/data_local 配下にある。

OLD image: /data_local/xen/domains/alpha/disk.img

OLD imageで動いていた仮想マシンをshutdown.

ホストマシンで SDHCをマウント
# mount /data

念のためバックアップ
# cp --sparse=auto /data_local/xen/domains/alpha/disk.img /data/old_disk.img.BAK
# cksum /data_local/xen/domains/alpha/disk.img /data/old_disk.img.BAK

古いイメージファイルを削除
# rm /data_local/xen/domains/alpha/disk.img

NEW image用 sparse file作成
# dd if=/dev/zero of=/data_local/xen/domains/alpha/disk.img bs=1024k seek=2048 count=0
# du /data_local/xen/domains/alpha/disk.img
0 /data_local/xen/domains/alpha/disk.img

ファイルシステム作成
# mkfs -t ext3 /data_local/xen/domains/alpha/disk.img

新旧imageをマウント
# mkdir -p /mnt/old /mnt/new
# mount -o loop /data/old_disk.img.BAK /mnt/old
# mount -o loop /data_local/xen/domains/alpha/disk.img /mnt/new
# df

コピー
# rsync -Saxv /mnt/old/ /mnt/new

アンマウント
# umount /mnt/old /mnt/new
# ls -l /data/old_disk.img.BAK /data_local/xen/domains/alpha/disk.img
# du -m /data/old_disk.img.BAK /data_local/xen/domains/alpha/disk.img
# umount /data
# df

alpha再起動
# xm create alpha.cfg
# xm list




2011/09/21

iPhoneアプリ bloggerからの投稿テスト

iPhone用 Google blogger公式アプリケーション、その名もズバリ blogger から投稿テスト。

----
フライトモードにしてオフラインで追記してみた。

続けて新規作成しようとしたが、未アップロード記事の編集画面になる。
オフラインで記事の書き溜めはできないみたいです。
オンラインでサーバーにdraft保存すれば書き溜め可能のようです。
つたない検証なので間違っていたらごめんなさい。
----
再度試してみたら、フライトモードでも複数記事を書き溜めできました。
BlogPressのアドバンテージはタグの選択入力くらいしかない気がしてきました。しかもBlogPressは日本語入力カラムが編集画面にかぶってカーソルが見えなくなるし...

2011/09/18

ゲストマシンをディスクイメージとしてバックアップする

そもそもゲストマシンはディスクイメージとして存在しているので、ホストマシンがそのファイルをコピーするだけで良いのですが、スパースファイルを再構成することで一度大きくなってしまったディスクイメージを小さくしましょう、という意図があります。
(SSDが潤沢にあればこんなことしなくて良いのに!)

また、ホストマシン側は 4GBのSSDしか使用できない環境なので、今回はゲストマシン側だけで何とかします。
(SSDが潤沢にあればこんなことしなくて良いのに!!)

なお、このblogは例によってメモ for 未来の私 です。

ゲストマシン環境
ディスクマウント状態はこんな感じ
/dev/xvda3 /dataは SDHCです。
バックアップ対象は /(/dev/xvda1) だけです。
バックアップ保存先は /data(/dev/xvda3) です。
/dev/xvda1 none swap sw 0 0
/dev/xvda2 / ext3 rw,noatime,nodiratime,errors=remount-ro 0 0
/dev/xvda3 /data ext3 rw,noatime,nodiratime 0 0

ホストマシン側から見ると
/dev/xvda1 と /dev/xvda2 は EeePC 4G-X 上のSSDに保存されている ディスクイメージファイル(スパースファイル)です。
/dev/xvda3 は外付けSDHC(/dev/sdc1)です。
ホストマシン側でマウントしているデバイスはゲストマシンでマウントできないため、ホストマシンは /dev/sdc1はマウントしていません。
仮想マシン起動用のcfgはこんな感じ(抜粋)
disk = [
  'file:/data_local/xen/domains/alpha/disk.img,xvda2,w',
  'phy:/dev/sdc1,xvda3,w',
  'file:/data_local/xen/domains/alpha/swap.img,xvda1,w',
]

バックアップ手順
1. ディスクイメージ作成
2GBのスパースファイルを作成します。
作成先は /data/tmp/disk.img です。
# dd if=/dev/zero of=/data/tmp/disk.img bs=1024M seek=2 count=0

2. ファイルシステム作成
作成したディスクイメージに ext3ファイルシステムを構築します。
対話的に y/n を聞かれることがあるので、自動的に y を答えるようにします。
# echo "y" | /sbin/mkfs -t ext3 /data/tmp/disk.img

3. 作成した空ディスクをマウント
ループバックデバイスとして作成したディスクを /mnt/tmp にマウントします。
# mount -o loop /data/tmp/disk.img /mnt/tmp

4. コピー
rsyncを使用して、/(ファイルすべて) を /mnt/tmp にコピーします。
ただし、SDHCである /data/ と マウントしている /mnt/tmp/ は除外します。
90秒スリープしているのはバッファの内容を書きこむのを待っているため。sleepしなくても良いのですが、なんとなく。
# /usr/bin/rsync -Sax / /mnt/tmp --exclude "/data/" --exclude "/mnt/tmp/"
# sleep 900

5. アンマウント
マウントを解除します。
# umount /mnt/tmp

6. GNU tarでアーカイブ
gzip や bzip2 では sparseとしての扱いが出来ずに、今回であれば 2GBのファイルとして扱ってしまいますが、sparseファイルが扱える GNU tar (Sオプション)を使い、/data/tmp/disk.img から /data/Dropbox/backup/disk.img.tgz を作成します。
# cd /data/tmp
# tar -Szcf /data/Dropbox/backup/disk.img.tgz ./disk.img

/data/Dropbox は Dropbox同期ディレクトリになっているので、ここに保存した disk.img.tgz はDropboxクラウドやLAN同期を経由して手元のMacにも転送されます。
これでバックアップは終了です。


これらバックアップはスクリプトにして、cronで週3回ほど自動実行させています。
スクリプトはこんな感じ。バックアップ開始/終了をtwitterにpostしています。

USERNAME@SERVER:# cat backup_image.sh
#! /bin/sh
set -x

TMP_DIR=/data/tmp
TMP_IMAGE=disk.img
DST_DIR=/data/Dropbox/backup
DST_FILE=disk.img.tgz
MNT_POINT=/mnt/tmp
TMP_FILE=/tmp/tmp.$$

TW_POST=/home/root/bin/twitter_post.pl

# mount check
# if mounted /mnt/tmp , this script will finish.
df | grep '/mnt/tmp$' > /dev/null
test $? -eq 0  &&  exit

#
if [ -f $TW_POST ]; then
    HM=`date +%H:%M`
    echo "disk image backup start at $HM" > $TMP_FILE
    $TW_POST $TMP_FILE
    rm $TMP_FILE
fi


test -f $TMP_DIR/$TMP_IMAGE  &&  rm -f $TMP_DIR/$TMP_IMAGE

# make new 2GB sparse file
dd if=/dev/zero of=$TMP_DIR/$TMP_IMAGE bs=1024M seek=2 count=0
echo "y" | /sbin/mkfs -t ext3 $TMP_DIR/$TMP_IMAGE

# mount image
test ! -d $MNT_POINT  &&  mkdir -p $MNT_POINT
mount -o loop $TMP_DIR/$TMP_IMAGE $MNT_POINT

# mount check
# if NOT mounted /mnt/tmp , this script will finish.
df | grep '/mnt/tmp$' > /dev/null
if [ $? -ne 0 ]; then
    if [ -f $TW_POST ]; then
        HM=`date +%H:%M`
        echo "disk cannot mounted. abort. $HM" > $TMP_FILE
        $TW_POST $TMP_FILE
        rm $TMP_FILE
    fi
    exit
fi
   

# copy
/usr/bin/rsync -Sax / $MNT_POINT --exclude "/data/" --exclude "$MNT_POINT/"
sleep 900

umount $MNT_POINT

test -f $DST_DIR/$DST_FILE  &&  rm -f $DST_DIR/$DST_FILE

(cd $TMP_DIR ; tar -Szcf $DST_DIR/$DST_FILE ./$TMP_IMAGE )

rm -f $TMP_DIR/$TMP_IMAGE

if [ -f $TW_POST ]; then
    HM=`date +%H:%M`
    echo "disk image backup finished at $HM" > $TMP_FILE
    $TW_POST $TMP_FILE
    rm $TMP_FILE
fi

2011/09/17

Xen

禅。
唐突ですが、自宅サーバを仮想化しました。

これまでも設定ファイルなどをtarで固めて外部ストレージに書きだしてバックアップとしていたのですが、いざ故障が発生してサーバ移行を強いられた時にちまちまアプリケーションをインストールして設定ファイルから環境を戻して... というのがすごく面倒くさいのではないかと、感じたからです。
これまでも自宅サーバは幾度かの世代交代を行ってきて、そのたびに数日の稼働をかけながら復旧させていたのですがあまりにも面倒臭い。
もちろん、再設定を行うことで知識は深まるメリットはあるものの、正直やっぱり面倒くさい。

ならば、いつ本体が故障して新ハードウェアになったとしても、従来の環境をガッツリ戻せたほうが便利なのではないかと、そう思ったわけです。
というわけで、禅です。

自宅サーバ2011のスペック、環境について
ASUS EeePC 4G-X (日本発売EeePC初代モデル)
CPU Intel Celeron M 900MHz の 600MHz駆動
Mem DDR2 2GB に増設
eth0を使う(wlan0ではXenが使えない)
SSD 4GB(デフォルト)
SDHC 32GB

設計(最終的な環境)
ホストマシン、ゲストマシン ともに Debian GNU/Linux 6.0(squeeze)
仮想環境はXenを使用する。(EeePCはIntel-VTなど無いので、KVMは使用できない)
ホストマシン(domain-0)は SSD上に構築。メモリ割り当ては約0.5GB
ゲストマシン(domain-U)は SSD上にイメージファイルで構築。メモリ割り当ては1.5GB
ゲストマシン用のストレージとして SDHCを物理デバイスとして使用する。

なお、このblogは例によってメモ for 未来の私 です。

Xen 4.0 インストール
# aptitude install xen-linux-system-2.6.32-5-xen-68 xen-tools

他に入れたかもしれませんが、結局入っているXen関連は以下のとおりです。たぶん aptitudeが入れてくれるはずです。
debootstrapも入っています。
asatsuki@eeetan:~$ dpkg -l | grep -i xen
ii  libc6-xen                             2.11.2-10                    Embedded GNU C Library: Shared libraries [Xen version]
ii  libxenstore3.0                        4.0.1-2                      Xenstore communications library for Xen
ii  linux-image-2.6.32-5-xen-686          2.6.32-35squeeze2            Linux 2.6.32 for modern PCs, Xen dom0 support
ii  xen-hypervisor-4.0-i386               4.0.1-2                      The Xen Hypervisor on i386
ii  xen-linux-system-2.6-xen-686          2.6.32+29                    Xen system with Linux 2.6 for modern PCs (meta-package)
ii  xen-linux-system-2.6.32-5-xen-686     2.6.32-35squeeze2            Xen system with Linux 2.6.32 on modern PCs (meta-package)
ii  xen-tools                             4.2-1                        Tools to manage Xen virtual servers
ii  xen-utils-4.0                         4.0.1-2                      XEN administrative tools
ii  xen-utils-common                      4.0.0-1                      XEN administrative tools - common files
ii  xenstore-utils                        4.0.1-2                      Xenstore utilities for Xen

Xen設定
/etc/xen/xend-config.sxp で(本体)内部ネットワークにブリッジを生成するオプションを有効化(コメント外し)します。
 (network-script network-bridge)

grub設定
環境にもよりますが、Xen対応カーネルは grub的に言うと (0番目から数えて)4番目に該当するので、
/etc/grub/grub.cfg に set default="4" を書いておきます。
(menuentryの順番を書き換えて Xen対応カーネルを 0番目にして、set default="0"のままにしておくという方法もあります)

Xen-tools 設定
仮想環境構築を手助けしてくれる xen-toolsの設定ファイル /etc/xen-tools/xen-tools.conf を編集します。
変更場所は以下のとおりです。
(括弧内はもちろんこのblogのためのコメントです)
 dir = /data_local/xen  (仮想環境のイメージファイル作成場所。お好みのディレクトリに)
 size   = 2Gb (仮想イメージファイルサイズ)
 memory = 1536MB (割り当てるメモリ 1.5GB)
 swap   = 128Mb (スワップファイルサイズ)
 fs     = ext3 (ディスクフォーマット)
 dist   = `xt-guess-suite-and-mirror --suite` (Default distribution to install.)
 image  = sparse (スパースファイルでディスクイメージを作成)
 gateway    = 192.168.1.1 (ネットワーク関連設定)
 netmask    = 255.255.255.0 (ネットワーク関連設定)
 broadcast  = 192.168.1.255 (ネットワーク関連設定)
 arch = i386 (CPUアーキテクチャを指定)

仮想イメージ作成
(ゲストマシンのIPアドレスを 192.168.1.204とした場合)
# xen-create-image --hostname SERVERNAME --ip 192.168.1.204
おなじみのDebianインストールをして、終了させます。
/etc/xen/SERVERNAME.cfg が作成されているはず...です。

/etc/xen/SERVERNAME.cfg設定
bootローダーを pygrub に変更します。
これをしないとXenが正常に起動しませんでした。
bootloader = '/usr/lib/xen-default/bin/pygrub'

ホストマシンの SDHCは /dev/sdc1 として認識されているので、これをゲストマシンに
/etc/xen/SERVERNAME.cfg を編集して SDHCを割り当てます。
disk = [
  'file:/data_local/xen/domains/alpha/disk.img,xvda2,w',
  'phy:/dev/sdc1,xvda3,w',
  'file:/data_local/xen/domains/alpha/swap.img,xvda1,w',
]
             
file:~ はイメージファイルを指定する方法、
phy:~ は物理デバイスを指定する方法です。

このへんで一度ホストマシンを再起動しておきましょう。

ゲストマシン起動

# xm create -c SERVERNAME
ゲストサーバ SERVERNAME が起動して、そのコンソールに接続する... はずです。
ここでいろいろインストールするもよし、あとで行うもよし。
ホストマシンのSDHC /dev/sdc1 は ゲストマシンでは/dev/xvda3 として認識されているはずなので、/etc/fstabに書いておきます。
 /dev/xvda3 /data ext3 noatime,nodiratime 0 0
とりあえず shutdown させてホストマシンに戻ります。
コンソールから抜けるには Ctrl + ] を使います。

仮想(ゲスト)マシンの自動起動
ホストマシンを再起動したときにゲストマシンも自動的に起動する設定です。
/etc/xen/auto ディレクトリを作成し、その下にゲストマシンの cfgファイルを置きます。
実際にはシンボリックリンクを作成します。
# ln -s /etc/xen/SERVERNAME.cfg /etc/xen/auto/SERVERNAME.cfg

ものすごく雑ですが、これでゲストマシンが作成されました。
あとはゲストマシンに apache, mysql, php, squid, postfix, bind, dhcp 他、そのたもろもろサービスをインストール&構築してサーバ環境を構築しましょう。

Have Fun!

execute Dropbox on Text Based Linux

仮想化した自宅サーバのバックアップ方法として、ディスクイメージファイルを dropboxにアップロードする方法を検討しました。

サーバはCLIなので、TextBasedLinuxInstall を参考にインストールします。
参考に、というかそのままなのですが、ここにメモ for 未来の私。

Step-by-step versionの手順を踏みます。

1. Dropboxを利用するユーザでログイン
rootで動かすにはセキュリティ的にも不安があるので、一般ユーザでDropboxを動かすようにします。

2. wgetでソースをダウンロード
ホームディレクトリにダウンロードします。
$ cd ~/
$ wget -O dropbox.tar.gz "http://www.dropbox.com/download/?plat=lnx.x86"   
(64bit ver.の場合は wget -O dropbox.tar.gz "http://www.dropbox.com/download/?plat=lnx.x86_64"   )

3. tarボールを展開する...まえにチェック
tar t します

$  tar -tzf dropbox.tar.gz
4. 展開
tar x します
 $ tar -xvzf dropbox.tar.gz 
~/.dropbox/
~/.dropbox-dist/
2つのディレクトリが展開されます。

5. ランゲージ設定
環境変数 LANG を設定します。
私はCLIでしか使用しないので、'C'です。
$ export LANG=C LC_ALL=C
ログイン時に自動的に指定したいときは ~/.bashrc や ~/.profile などに この一行を入れておきます。

6. dropboxd起動
dropboxdを起動すると ~/Dropbox ディレクトリを作成します。
もし、異なるディレクトリを Dropboxファイル格納ディレクトリにしたい場合は、
そのディレクトリ(/data/Dropbox など)を作成し、~/Dropbox -> /data/Dropdox などのようにシンボリックリンクを作成します。
受け皿が用意できたら心を鎮めてプロセスを起動します。
$ ~/.dropbox-dist/dropboxd
初回起動時は怪しげなURLが数秒後とに表示されるので、別マシン(Mac や Windows)のWebブラウザからリンクに移動します。
This client is not linked to any account... Please visit https://www.dropbox.com/cli_link?host_id=謎の文字列  to link this machine.

うまくいけば Linuxマシンがクライアントとして認証され、上記メッセージは停止してクライアントとしての動作が開始します。

インストールはここまで終了です。

dropboxd は一般プロセスなので、ログインして起動しなければなりません。
nohup ~/.dropbox-dist/dropboxd &
でログアウトあとでも動くようにしても良いのですが、サーバ再起動後などはログインしなおしてまた実行しなければいけません。
そこで、プロセスの有無をチェックしてなければ起動するスクリプトを 1日1回程度 cronで実行するようにします。

スクリプトはこんな感じ

USERNAME@SERVER:~$ cat /home/USERNAME/bin/exec_dropbox.sh
#! /bin/sh
# check dropbox process, exec if dropbox process isn't exist.
A=`ps -ef | grep dropbox | grep '/home/USERNAME/.dropbox-dist/dropbox' | grep -v grep | sed '/^$/d' | wc -l`

if [ $A -eq "0" ]; then
    nice -n +19 /home/USERNAME/.dropbox-dist/dropboxd &
#    echo "execute dropbox"
fi

crontabはこんな感じ

USERNAME@SERVER:~$ crontab -l | grep dropbox
# execute dropbox
25 8 * * *    /home/USERNAME/bin/exec_dropbox.sh > /dev/null 2>&1


サーバ仮想化についてはまた後日...

2011/07/30

Lion Library

先日MacBook Pro 15インチを購入しました。
本当は13インチで検討していたのですが、2011/7/20発表のMacBook Airが Core i7プロセッサを搭載して、そりゃ反則だろう! MacBook Pro13インチの立場はどうなるんだ?! と憤慨し(何に?)、ProがAirに負けるわけにいかないので(誰と勝負しているんだ?)、15インチを買ったというわけです(なんだこりゃ)

前環境(MacBook)のデータはタイムマシン経由などで引き継げるのですが、なにぶん前々環境(MacBookG4)の10年前のPanther時代から引き継がれて既に使用していないファイルも多々有りそうなので、今回は一から構築しました。

前Macのデータは以下のコマンドでUSB接続HDDに保存しておきます。
(HDD320GはUSB接続HDD名です。適宜環境に合わせて読み替えてください)

OldMacBook> cp -R ~ /Volumes/HDD320G/

新MacBook ProにUSB HDDを接続して、各アプリケーションに関連したデータを個別にコピーします。
が、そこでわかる新事実、
Lionではfinderからライブラリ(Library)ディレクトリがデフォルトで不可視らしいので、ターミナルからコマンドラインでシンボリックリンク(ソフトリンク)を作成してfinderからアクセスできるようにします。

NewMacBookPro> ln -s ~/Library ~/Link2Library

これで Link2Library というディレクトリ(のようなもの)がホームに現れるので、そこから ライブラリ ディレクトリにアクセスできます。

後でわかったのですが、こんなの事をしなくても
Lionのライブラリフォルダはどこにいった?のようにfinderのツールバーにある「移動」をOptionを押しながらクリックすれば見えるそうです。
(でも忘れそうなので、環境構築が終わるまではシンボリックリンクは残しておきました)

アドレスブック、iCal、Firefox、Thunderbird、Virtualbox などのデータを ライブラリ配下にコピーして環境の移行完了。
ホーム配下のミュージック、ピクチャ なども旧環境通りにファイルを配置して、かなりスムーズに環境移行が出来ました。

感想: やっぱりMacBook Proは速い。

2011/07/25

キンエン、キツエン

禁煙と喫煙をよく間違えそうになります。
キンエン と キツエン で ひと文字しか違っていないのがよろしくないのではないでしょうか。

モノゴトAとBがあり、Aを覚えておかなければならない時に、
「Aである」
と覚えれば苦労はありませんが、
なぜか
「Bではない」
と覚えてしなうと酷く混乱を招くことになります。

先日飲食店に入ったときも、
「煙草は吸いますか?」
と案内の店員さんに対して即答できずに
「ン だったか ツ だったか、ツ ではなく ン の方だったよな」
と悩んでいたら、言葉が通じない客と思われたのか ピースサインを口元で作ってゼスチャーされてしまいました。

その点、英語はいいですね。
「ノー スモーキング」
とりあえず頭に「ノー」を言えば間違いありません。
また日本語の特徴で「喫煙席ですか」と「禁煙席ですか」の問いに対して答えを異なるものにする必要があります。

だからと言って日本語がダメだとか、ンキエン と ツキエン にしろと言うつもりはありませんよ。

ノータバコ、タバコハダメデス。



2011/07/21

2011-07-15 富士登山

2011-07-15 富士登山

毎年登っている職場の人から「今年一緒に登らないか」と、登山マイナス3週間に誘われたままその気になって、生まれて初めて富士山に登ってきました。
準備としてマイナス2週間から9皆のオフィスまで階段で登り、低カロリー低脂肪の食材を取るようにして体重を少し減らし、会社から徒歩で帰宅するなどして少しずつ身体を作っていきました。

登山スケジュールは、「22時頃から富士宮口新五合目から登り始めて山頂で御来光を拝み、下山は御殿場口方面に降りて途中宝永山第一火口を経由して富士宮口コースの六合目に戻ってくる」コースです。


登山当日に事件発生。
昼頃に最終パッキングを確認し、写真を撮ろうとするとデジカメ(Pentax OptioM20)の電源が入らない。
昨日の夜は動いていたのに、今日になって入らない。理由は不明。暑さのせいか? 電池を入れ替えても同じ症状なので本体の故障と判断しました。
今日は一生に一度かもしれぬ富士登山なのでカメラを持っていかない訳にはいきませんから、急遽ヨドバシカメラに飛んでいき、ほとんど検討もしないで Canon PowerShot A1200を 10800円で買ってきました。
出かけるまで昼寝しようと思っていたのになぁ...






ポカリスエット900ml、水500ml。dryタイプTシャツ、dry長袖シャツ、フリース、カッパ、食料、携帯酸素、缶ビール、ライト、スパッツ、ファーストエイド、メモ帳、ストック、ザックの装備です。この他デジカメがあります。

京王高尾駅で車のメンバーと合流し、21時頃に富士山スカイラインの旧料金所に着くと7/15〜車両規制の文字が...
静岡県富士山マイカー規制のお知らせ(https://www2.pref.shizuoka.jp/all/file_download1060.nsf/pages/5BF5B044E15B2775492578B9004259A2)
やむなく水ケ塚パーキングまで戻って車を停めて(駐車料金1000円)、シャトルバス(往復1300円)に乗って、30分ほどで富士宮口新五合目に到着。







シャトルバス内では瞼を閉じて瞑想&休息しました。
♪登るのか、登れるのか、おびえる心よ~恐るな心ひらけよ~ (イデオン調で)
だんだん気分が高揚してきます。

新五合目、標高2400m、22時15分、登山開始です。
本当ならば、各号目でtwitterでツイートしていこうと思ったのですが、そこはsoftbankの弱み、スタート地点の新五合目ですら電波がかなり弱く不安定でした。かろうじて一言つぶやいた後は電源を切ってザックの一番深い位置にしまいました。一方docomoは抜かりなくしっかりと電波が届いているようでした。

Climb On!!

六合目まで約15分。斜度も低く小手調べ程度で、まだまだ余裕があります。鼻呼吸でOK。
新七合目まで約50分。23:20頃。ここは少々長く辛かった。動いているうちは平気ですが、休憩で止まると汗が引いてかなり身体が冷えます。
七合目まで約30分。標高は3000mを超えます。このあたりから高山病になる人もいるのですが、運良く私はかかりませんでした。
八合目、九合目、九号五勺、十号目(山頂)までもそれぞれ約30〜40分程度。斜度も徐々にきつくなってきます。
休憩後歩き始めて5分間で身体が温まり、10分間は快調に登り、残りは息も上がり気味で時々止まって休息しながら登るという感じです。とはいえ長く休むと身体が冷えるので、数分歩いて1分休むといったペースです。
九合目を過ぎると山小屋に宿泊した人たちも登り始めるので渋滞が生じ、すこしキツイ岩場になると列が止まって数十秒間休息が取れたのが助かりました。












九合目の自販機で、缶ジュースは400円です。
山小屋も開いておりカップ麺やお汁粉などの温かいものも食べられるようですが、私は持参したカロリーメイトでエネルギー補充しました。

ほぼ満月の夜なので足元は明るいものの写真を撮るまでにはいかず、各合目にある山小屋以外の登山中写真は殆どありません。
立ち止まってカメラを取り出して写真を撮影してまたカメラをしまう、という動作が面倒くさい。歩くペースを乱したくない、疲れていて写真どころではない、というのが本当の理由です。







ときおり立ち止まって振り返ると、眼下には雲海が広がり、その切れ目からは外界の街の灯りが輝いています。
安全な街の世界とは異なり、ここは一歩間違えば転落して怪我・死亡の危険があり、かつ助けてくれる人もいないかもしれない世界(二重遭難になるので助けは期待できない)、普段生活する空間とは全く異なる空間を意識しました。だからこそ観る風景は感慨深いのでしょう。
TVや写真ではおなじみの光景を実際にこの目で見られたのは感動以外のなにものでもありません。
植物も虫もおらず、静寂で、風の音と闇が支配する世界です。
(登山者はたくさんいますが)



































7/16 4時10分、山頂到着。約5時間55分で登りきりました。





御来光を拝みながらASAHIで乾杯です。
富士山頂上付近の地面は固まった溶岩のせいか、火星の写真のように赤いのです。








本当の山頂(3776m)の剣ヶ峰は疲れていた&混雑していたのでパス、火口をめぐるお鉢巡り約90分も疲れていたのでパス、帰って寝たい一心で下山開始です。
富士宮口コースの下山道は登山道と共用のため道が狭く、また斜面が急で岩場が多く膝に負担がかかり過ぎるので登山部リーダーの計らいで、御殿場口コースを下り宝永山火口経由で富士宮口コースに戻るようにしました。ー






岩と砂ばかりで不毛の地の御殿場口コースは南東側に位置するため強い日差しを遮る樹々もないため、かなり体力を消耗しました。白く見えるのは雪です。







途中で富士山下山名物(?)砂走りで膝の負担を軽減しながら高度を稼ぎ、無事富士宮新五合目まで降りてきました。
帰路に山中湖近くの 紅富士の湯 で温泉&食事&休息をしてに無事に帰宅しました。
数年前から登りたいと思っていた富士山に誘ってくれた&ザックやストックの登山道具を貸してくれた職場の人たちに感謝しています。
登るのは決して楽ではありませんが、登りきった達成感や山頂からの眺めは苦労を差し引いても有り余ると思うので、体力のある方はぜひ一度登ってみることをお勧めします。


登山当日に故障した(と思われた)デジカメ Pentax OptioM20ですが、帰宅した日に確認したら何事もなかったように動き出しました。
よほど富士山に登りたくなかったんでしょうねぇ。

2011/06/07

東京湾ツーリング

2010-06-05 東京湾ツーリング

週末は梅雨の合間の晴れの日だったので、保田のばんやの湯に入って食堂で美味い魚を食べようと思いたち、出かけて来ました。

朝5時に出発。お台場からR357に乗って東へ、船橋を過ぎてから 茜浜に寄ろうとして食品コンビナート方面に県道15号に入ったものの、2箇所ある茜浜への交差点が判らずそのまま千葉市に入ってしまいました。
雲で富士山は見えそうにもないし、夜景を眺める訳でもないので、引き返さずにスルーです。
幕張メッセを抜けて再びR357に戻ってひたすら南下。

時間が早かったので、富津岬に寄ることにしました。岬や最○端があると行かざるを得ない習性です。これは仕方ない。

先客にカワサキZZR 5台のグループが居ました。スズキRF乗りとしてはそのすぐ隣に停めるのははばかられたので、少し離れたところに停めました。
ヘタレですみません。













富津公園の展望台は素晴らしい建造物です。高さもかなりあります。
一筆書きで全ての階段を通ることが出来るのでしょうか?













展望台の頂上から東京湾側、富津市側を眺めるとこんな感じでした。
少し霞がかっているので富士山どころか三浦半島すらはっきり見ることができませんでした。

岬を後にして、R465で大貫、佐貫町と下ってR127に至のですが、この道は良い意味で田舎の道で素晴らしかった。途中に東京湾観音もあるので、もう一度行ってみたいと思っています。

R127を南下して、タイトなクランクカーブを二つ越えると、保田漁協 ばんやの湯が右側に見えて来ます。右折レーンのある見通しの良い交差点なのでわかりやすいでしょう。
時刻は9時を少し過ぎたところで、9時半オープンの食堂ですがなかに入って待つ事は出来るとの事でしたが、私はまず風呂が目当てだったので迷わず向かいのばんやの湯に行きました。

R127の途中、金谷フェリーから降りて来たと思われるバイク2人組もちょうど私を追い掛けるようにしてばんやに到着し、食堂に向かっていたようです。その一台はRF900だったので良く覚えています。

入浴料500円を払って3桁の番号が書かれたカードをもらい、脱衣所へ移動します。カードの番号と同じ番号のロッカーを探しましたが...ありません。ロッカーはどれでも良いようです。カードの扱いに悩んでいると、見かねたガチムチのお兄さんが優しく教えてくれました。カードを扉の内側にあるスリットに入れて外側から窓を通して番号が見えるようにしておけば鍵が有効になって閉められるそうです。

お湯の温度は低く無色透明。ただし高炭酸のためジッとしていると細かな泡が肌に付いて来ます。泡がいつ生成されるのかジッと見ていましたが判らずじまいでした。
メインの湯船以外に2,3人くらいが入れる広さの薬草風呂があります。この日は柿の葉風呂でした。

入浴客は入れ替わりながら常に3,4人程で空いていました。
漁師さんなのか筋肉質の体格の良いお兄さんかご老人が多く、私だけひ弱なボディ。

ひとっ風呂浴びて空腹状態で隣の食堂へ向かいます。時刻は10:30、待ち時間なしで席へ案内されました。周囲を見渡すと独り客は見当たらず、みなグループや家族連れでした。
さ、淋しくなんかないんだから!

壁に貼られた短冊メニューを眺めて悩んだ末、イカかき揚げ丼とスルメイカ刺をオーダー。イカがダブっていても気にしない。
隣のご夫婦からイカ好き野郎と思われているに違いありません。

待つこと数分、来ましたよ。







どーん。
かき揚げがそびえ立っています。
3枚ほど乗っていたでしょうか。下のご飯に行き着くには最低1枚分のかき揚げを胃に納めなければなりません。衣は重く、サクサク感は少なめ、これはキツイ。
油がキツく感じ始めたところに、遅れて刺身が到着しました。







ばーん。
刻んだゲソにキモを和えた小鉢が添えられていて、それに醤油を混ぜたものに刺身を絡めて食べます。
美味しい、美味しいんだけれどいかんせん量が多い。
イカって食べすぎると気分悪くなってくるんですね...
量が多いためドギーバック(プラ容器 有料10円)が用意されているものの、かき揚げと刺身だし、だいいちバイクなので持って帰れません。
残すのは申し訳ないと思いご飯と刺身は完食したものの、かき揚げは1枚分位残しました。漁師さんごめんなさい。
かき揚げ丼 880円、刺身は680円だったと思います。

すっかり満腹になり、もう移動するのも面倒くさい。鋸山に登って日本寺に行くのも考えていましたが、かき揚げで身重の体では無理...
ばんやで温泉に入って食事するという目的は果たしたので、もう帰ろう...

木更津まで戻ってアクアラインも良いけれど、ここは金谷からフェリーで決めよう。久里浜に渡れば東京湾一周ツーリングの達成です。
ばんやから数kmほど北上して金谷フェリーターミナルに到着。11:15頃。
毎時20分にフェリーの便があり、急げば乗れたのですが見送って次の便にしました。
理由はお土産購入のためと、トイレに行きたかったから。

バイクは10台ほど、自動車は20台くらい乗っていたでしょうか。正直車輌デッキはガラガラですが、乗客はツアーの団体さんもいたので結構乗って居ました。
「鎌倉行ったら銭洗弁天に行くんだー 」と子供が楽しそうでした。








縛られるRF。







最上階デッキからの眺め。






いつも長距離フェリーの2等船室(雑魚寝部屋)なので、座れるフェリーにちょっと感動しました。椅子っていいなぁ。
40分ほどで久里浜フェリーターミナルに到着した後は空模様が怪しかったので、金沢文庫から首都高に乗って一路自宅へノンストップで帰りました。

15:33自宅到着。
走行距離は220kmでした。