2010/05/25

beagleboardとUSBカメラとGPSを車に載せてみた

beagleboard自身は5V1A程度の電源が必要ですが、車のシガーソケットから携帯充電用のUSB端子を接続することで簡単に動かすことができます。

そこにUSB Video Class(UVC)に対応したUSBカメラとGPSを接続することで、走行場所の位置情報を埋め込んだ写真を取るようにしてみました。

助手席に子供の目線ぐらいに付けたカメラから写真を取るとこんな感じになります。

始めて車から取った写真

準備作業

電源の確保

近場のオートバックスでみつけたのがAXSの キューブチャージャー デュアルでした。

これは5V2000mAが取れてヒューズもついていて、USB経由でカメラ(+100mA?)やらGPS(+300mA?)やらをつけても安定して動いています。

GPSモジュール

今回は秋月電子通商の GPSモジュール GT-730F/Lを準備しました。 消費電力がわりと高めといわれていて心配でしたが、性能自体に問題はなさそうなので値段を考えて決めました。

USBカメラ

Video4Linux2で遊んだ前回はBUFFALOの BSW13K05Hを使いましたが、今回はELECOMの UCAM-DLX300Bを使ってみました。

UCAM-DLX300Bでテストしたところ、シャッタスピードの問題なのか、2048x1536だと明る過ぎてしまい、1280x720は640x480と画角が同じで引き伸ばしただけの絵だったので、結局640x480で使っています。

画像は安定していますが、この使い方だと130万画素のBSW13K05Hと比べて違いはそれほど大きくありません。 家の中で使うには良いでしょうね。

撮影した写真の加工

GPSのデータは/dev/ttyUSB0経由で取得することができますが、今回はgpsdとntpdを動かしています。 このgpsdにTCP/IPで接続する事でデータを取得しています。

とりあえずはexiv2コマンドで時刻を修正しています。

beagleboardでの時刻同期

ntpdを-xオプションで動かしたとしても、電池でバックアップされたRTCを持っていないbeagleboardでは、ある程度の時間を調整してあげる必要があります。

これは別のスクリプトでgpsdから時刻情報を取ってきて比較することで、時差が大きい場合にはdate --utc MMDDhhmmYYYYhwclock -wで時刻を合せています。

まとめ

まだしばらくはカメラの固定方法や取り付け位置の高さといった調整が必要そうです。

この記事で取り上げた品々

2010/05/22

VMWare 7.0でUbuntu 10.04 Lucidを使う

背景

VMWare 7.0.1の30日間使える試用版を試してきたけれど、だいたいうまく動いているし、IPv6が使えるVMは思った以上に便利でした。

ここにきて問題が起ったのはNagiosを入れているUbuntu 09.10 Karmicを10.04 Lucidにバージョンアップした直後でした。

問題点

GDMが起動してグラフィカルなログイン画面が表示されてから、マウスを認識するものの、キーボードの入力をまるで受け付けない状態になりました。

sshdはNATネットワーク上で動いていたので、ネットワーク経由でログインし、vmware toolsが最新版にアップグレードされている事は確認しました。

sshdが動いているIPアドレスの調べ方

IPアドレスが分からなくてもVMWareのNATネットワークが172.16.73.1/24なのは構成ツールやらvmnet8デバイスのIPアドレスなんかから判っていたのでnmapを使ってIPアドレスを調べることができました。

$ sudo nmap -p22 172.16.73.1/24

nmapコマンドの出力結果

Starting Nmap 5.00 ( http://nmap.org ) at 2010-05-22 02:26 JST
Interesting ports on 172.16.73.1:
PORT   STATE SERVICE
22/tcp open  ssh

Interesting ports on 172.16.73.132:
PORT   STATE SERVICE
22/tcp open  ssh
MAC Address: 00:0C:29:xx:xx:xx (VMware)

Interesting ports on 172.16.73.254:
PORT   STATE    SERVICE
22/tcp filtered ssh
MAC Address: 00:50:56:xx:xx:xx (VMWare)

Nmap done: 256 IP addresses (3 hosts up) scanned in 4.67 seconds

172.16.73.254の方はVMWareのマニュアルにもありますが、"DHCP server"なので探していたのは172.16.73.132の方でした。

解決策

キーボードの入力が取れない問題はポピュラーらしく、googleで簡単に 解決策がみつかりました。

リンク先にあるように/etc/default/console-setupを編集するだけです。

編集前

...
XKBMODEL="SKIP"
XKBLAYOUT="us"
XKBVARIANT="U.S. English"
XKBOPTIONS=""
...

編集後

...
XKBMODEL="pc105"
XKBLAYOUT="us"
XKBVARIANT=""
XKBOPTIONS=""
...

オリジナルのページはUTF-8ですが、ヨーロッパ系言語にありがちな ""”" と微妙に違う文字になっています。

普通はviで開いて文字を打つと思いますが、もしそのままコピー・ペーストするのであれば気をつける必要があります。

2010/05/21

cfengine3 free editionの限界

前回まででスタンドアローンでは展開が終って、複数サーバでの管理はどうするのかなとマニュアルを眺めていました。

cfengine2の時と同じように公開鍵を準備してサーバプロセスを起動して、クライアントからアクセスすればmasterfilesに置いたポリシーファイルが配られるのかなぁ、と考えていたのですが、どうやらcfengine3では商用のNovaでないとその機能は使えないようでした。

ポリシーファイルの同期が取れないのはcfengine2から後退している気もしますが、cf-runagent自体は動きました。 もっとも動くだけで、あまり使い勝手はないですけどね。

一般ユーザでもcfengineは動かせますが、とりあえずroot権限でcf-serverdやらcf-agentやらを実行することを考えています。

cf-runagentを動かしてみる

とりあえず2台のcfengine3が動いている環境を準備してから、cf-runagentで他のサーバのrunagentを起動しようと思います。

工夫すれば起動するスクリプトを変更することはできますが、普通はcf-agentをリモートで起動することができます。

クライアント側の設定

cf-runagentを実行する側の設定をします。 まずはkeyファイルを作成しておきます。

$ sudo cf-key

cf-keyによって作成されるファイル

/var/cfengine/ppkeys/localhost.priv
/var/cfengine/ppkeys/localhost.pub

次にpromises.cfファイルを編集します。

/var/cfengine/masterfiles/promises.cf

body runagent control
{
hosts => { "10.0.0.3" };
trustkey => "true";
}

trustkeyは設定しなくても、/var/cfengine/ppkeys/root-10.0.0.3.pubのようなcf-runagentを実行するユーザIDと接続先のIPアドレスを名前にして、相手方の/var/cfengine/ppkeys/localhost.pubを配置しておく事でも同じ結果になります。

trustkeyを"true"に設定しておくと、root-10.0.0.3.pubのようなファイルは自動的に作成されます。

またここで"hosts"に指定したサーバにcf-runagentは接続します。

サーバ側の設定

接続先のcf-serverdの設定を行ないます。 こちらでもkeyファイルを作成しておきます。

$ sudo cf-key

こちら側ではpromises.cfファイルとsite.cfファイルの2個所を編集します。

/var/cfengine/masterfiles/promises.cfファイルの編集個所

body server control
...
allowconnects         => { "127.0.0.1" , "::1", "10.0.0.0/16" };
allowallconnects      => { "127.0.0.1" , "::1", "10.0.0.0/16" };
trustkeysfrom         => { "127.0.0.1" , "::1", "10.0.0.0/16" };
...
}

/var/cfengine/masterfiles/site.cfファイルの編集個所

bundle server access_rules()
{
access:
...
  "/var/cfengine/bin/cf-agent"

    admit => { "127.0.0.1", "10.0.0.0/16" };
...
}

まぁ設定はしてみましたが、cf-runagentが動いても任意のcfengineスクリプトを実行できないようなので、cronから5分間隔でcf-agentが起動している現状では使いどころがなさそうです。

気がついたところ

cf-runagentでunit_*.cfを起動することができない

cf-runagentがcf-serverdに接続すると、body server controlの中でcfruncommandで指定されているプロセスが"--inform"オプション付きで起動されます。

このcfruncommandで指定するコマンドを自作のスクリプトなどに変更すれば、起動するプロセスをコントロールできます。

しかしcf-runagentでは$ sudo cf-runagent -o '-f unit_syslog.cf'といったオプションは受け付けてもらえません。 そのため任意のcfengineスクリプトを実行するといったことはできません。

設定ファイルの複雑化が気になる

cfengine3では body 構文を使って右辺値をグループ化することはできますが、ファイル数が増えていった時にパーミッションを管理したいといった場合には自動生成できると便利なのですが、そういう連携は少し難しそうに思えます。

cfengine3をスタンドアローンで使う場合には、それなりに便利に使う事はできそうです。 ただ統計情報はbdb形式で出力してくれますが、machine readableなログファイルを生成するといった機能は強くないため、他のツールとの連携にはカスタマイズしたログファイルパーサーなどが必要かもしれません。

問題があった場合に自動的に修復するっていうアプローチが正しいとは限らないんですよね…。 特に日本だと全部のインシデントをトラッキングしないといけない場面もあるように思えます。

問題の検出と修正を分けて管理しないといけないような場面ではよくないでしょうね。

2010/05/19

Debian lennyにcfengine 3.0.4を導入してみる

UbuntuではPPAで3.0.2が10.04 lucid用のパッケージが配布されていますが、今回はDebian lennyをターゲットにしています。 www.cfengine.comではパッケージを配布しているとありますが、設定ファイル集ぐらいしか見つからなかったので自分でコンパイルする事にしました。

cfengineは2.0を数年前に確認していますが、その時は、管理するためにはcfengineに合わせたプロセスを考えないと使えないなぁ、という印象だったと記憶しています。

コンパイル

基本的な開発環境の導入

gccが入っていなかったので、お手軽に"build-essential"パッケージを導入しました。

$ sudo apt-get install build-essential
prerequisitesの導入

INSTALLファイルに書かれている前提ソフトウェアは次の通りです。

INSTALLファイルらの前提ライブラリ一覧

Openssl
BerkeleyDB
flex
bison
PCRE

debianのdebパッケージから準備するために次のパッケージを導入しました。

導入したパッケージリスト

libssl-dev
libdb4.6-dev
flex
bison
libpcre3-dev
$ sudo apt-get install libssl-dev libdb4.6-dev flex bison libpcre3-dev

マニュアルをみると、OpenLDAPやらMySQLやらのクライアントライブラリがあればオプションで組み込まれると書かれています。 リストは挙げられていませんでしたが、configure.acをみると次のライブラリに反応するようです。

必要に応じて追加するライブラリパッケージ

libldap2-dev
libmysqlclient15-dev
libpq-dev
graphviz

あとはlibcfnovaなどにも反応するようですが、これはおそらく商用製品向けのオプションでしょう。

後からコードを眺めて気がつきましたが、LDAPやらRDBMSとの連携は製品版であるNOVAのfeaturesでした。 なのでlibcfnova.soやらのライブラリがないと、いろいろな機能が無効になっています。

コンパイル

とりあえず必要と思えるパッケージを導入してコンパイルしたところ無事に終りました。

ただ後からlibpq-devを導入したところ問題が発生しました。 libpq-fe.hファイルが/usr/include/postgresql/libpq-fe.hにあるために発見できずに、src/conf.hファイルでフラグが設定されない結果になっていました。

libpq.soは認識しているので、これを回避するためにCFLAGSに

CFLAGS="-I/usr/include/postgresql" ./configure --prefix=/usr/local/stow/cfengine-3.0.4

/usr/local直下にインストールしてみたのですが、将来のバージョンの事を考えてxstowを使って別ディレクトリにインストールをやり直しました。

$ ./configure --prefix=/usr/local/stow/cfengine-3.0.4
$ sudo make install
$ cd /usr/local/stow
$ sudo xstow cfengine-3.0.4

設定ファイルの準備

実際に動かすためには/var/cfengineディレクトリが存在する必要があったり、設定ファイルを準備したりする必要があります。

ただ設定ファイルを書くためにcfengineがどういう名前で認識されているかなどの情報を確認しておく必要があります。

まずはcfengineが認識しているシステム情報を確認する
$ sudo cf-promises -v

cf-promises -vの出力抜粋

cf3 Host name is: vlcf02
cf3 Operating System Type is linux
cf3 Operating System Release is 2.6.26-2-amd64
cf3 Architecture = x86_64
cf3 Using internal soft-class linux for host vlcf02
cf3 The time is now Tue May 18 22:06:46 2010
....
cf3 Looking for Debian version...
cf3 This appears to be a Debian 5.0 system.
cf3 This appears to be a Debian 5 system.
cf3 This system seems to have the aptitude package system
...

エラーはいろいろ出てきますが、このコマンドを実行すると/var/cfengineディレクトリがセットアップされるので、 ちゃんと動かすべく設定ファイルを準備していきます。

設定ファイルの配置

まずはソースコードに含まれる設定ファイルをコピーすることにします。

$ cd cfengine-3.0.4/inputs
$ sudo cp *.cf /var/cfengine/inputs/

とりあえず設定ファイルが正しいかどうかは、先ほどと同じcf-promisesコマンドで確認することができます。 今回はリポートを出力させる -r オプションも指定していますが、エラーは出ずに、配置した /var/cfengine/inputs/promises.cf を認識するはずです。

$ sudo cf-promises -r -v

cf-promises -r -vコマンドの出力抜粋

...
cf3   > Parsing file /var/cfengine/inputs/promises.cf
cf3 Initiate variable convergence...
cf3 Initiate control variable convergence...
cf3   > Parsing file /var/cfengine/inputs/update.cf
cf3   > Parsing file /var/cfengine/inputs/site.cf
cf3   > Parsing file /var/cfengine/inputs/library.cf
cf3 Initiate variable convergence...
cf3 # Knowledge map reporting feature is only available in version Nova and above
cf3  -> Defined classes = { 10_0_0_2 172_16_73_129 64_bit Day18 Evening GMT_Hr14 Hr23 Hr23_Q1 Lcycle_0 May Min00 Min00_05 Q1 Tuesday Yr2010 _ any cfengine_3 cfengine_3_0 cfengine_3_0_4 common community_edition compiled_on_linux_gnu debian debian_5 debian_5_0 fe80__20c_29ff_fe3b_dece fe80__20c_29ff_fe3b_ded8 have_aptitude ipv4_10 ipv4_10_0 ipv4_10_0_0 ipv4_10_0_0_2 ipv4_172 ipv4_172_16 ipv4_172_16_73 ipv4_172_16_73_129 linux linux_2_6_26_2_amd64 linux_x86_64 linux_x86_64_2_6_26_2_amd64 linux_x86_64_2_6_26_2_amd64__1_SMP_Tue_Mar_9_22_29_32_UTC_2010 net_iface_eth0 net_iface_eth1 net_iface_lo org verbose_mode vlcf02 vlcf02_vm_example_org vm_example_org x86_64 example_org }
...

レポートは /var/cfengine/reports ディレクトリ以下に出力されるので、どういう設定が入っているのか確認することができると思います。

リファレンスマニュアルとの整合性

リファレンスマニュアルにはサンプルとして unit_null_config.cftest.cf ファイルが載っています。 確認のためにrootユーザを使わずに一般ユーザでcf-promisesコマンドを動かす時には ~/.cfagent/reports ディレクトリに出力されるので、*.cfファイルを ~/.cfagent/inputs ディレクトリに配置しておきます。

$ mkdir -p ~/.cfagent/inputs
$ vi ~/.cfagent/inputs/test.cf
$ /usr/local/sbin/cf-primises -r -v -f test.cf

ここではtest.cfを相対パスで指定しているので、自動的に~/.cfagent/inputs/test.cfファイルを探してくれます。

cfengineの設定ファイルは、いろいろな手掛りがたくさんあるのに、どうすれば良いのか分からないところです。 www.cfengine.orgのドキュメントをみても、cfengineをどうやって使い始めれば良いのか分かりずらいのは、あいかわらずのようです。

動かしてみる

とりあえずサンプルのpromises.cfファイルをそのまま動かします。 いくつか設定が変更されるので事前に現状を確認しておきます。

現状の確認

どこら辺が変更されそうか/var/cfengine/reports/promise_output_common.txtファイルを確認しておきます。

/var/cfengine/reports/promise_output_common.txtファイルの抜粋

...
      files promise by '/var/cfengine/inputs' (implicit) if context is any
      files promise by '/var/cfengine/bin' (implicit) if context is any
      files promise by '/var/spool/cron/crontabs/root' (implicit) if context is any
...

だいたい、ここに出てくるディレクトリやファイルの内容を確認しておけば良さそうな感じです。

ls -al /var/cfengine/inputsの出力

total 116
drwxr-xr-x  2 root root  4096 2010-05-18 22:53 .
drwxr-xr-x 10 root root  4096 2010-05-18 22:53 ..
-rw-r--r--  1 root root  1188 2010-05-18 22:51 failsafe.cf
-rw-r--r--  1 root root  3502 2010-05-18 22:51 library.cf
-rw-r--r--  1 root root  2882 2010-05-18 22:51 promises.cf
-rw-r--r--  1 root root 55101 2010-05-18 23:00 promises.cf.html
-rw-r--r--  1 root root 20653 2010-05-18 23:00 promises.cf.txt
-rw-r--r--  1 root root  6990 2010-05-18 22:51 site.cf
-rw-r--r--  1 root root  1955 2010-05-18 22:51 update.cf

ls -al /var/cfengine/binの出力

total 8
drwxr-xr-x  2 root root 4096 2010-05-18 22:06 .
drwxr-xr-x 10 root root 4096 2010-05-18 22:53 ..

sudo cat /var/spool/cron/crontabs/rootの出力

cat: /var/spool/cron/crontabs/root: No such file or directory

ファイルが存在しない場合には、何も起こらない感じがするので、rootファイルはあらかじめ作成しておきます。

$ sudo crontab - < /dev/null
cf-agentコマンドの実行

とりあえず実行してみます。

$ sudo -b cf-agent

sudo -b cf-agent実行時の出力

cf-promises needs to be installed in /var/cfengine/bin for pre-validation of full configuration
cf-agent was not able to get confirmation of promises from cf-promises, so going to failsafe

/usr/local/sbin/の中身を全部コピーしてしまうと、おもしろくなさそうなのですが、~/.cfagent/ディレクトリのセットアップ方法をリファレンスマニュアルで確認すると、全てのファイルをコピーしています。

今回はおとなしく全ての実行ファイルを/var/cfengine/binにコピーしておきます。

$ sudo cp /usr/local/sbin/* /var/cfengine/bin

ここで再度/var/cfengine/bin以下と/var/spool/cron/crontabs/rootの中身を確認しておきます。

ls -al /var/cfengine/binの出力、再び

total 18568
drwxr-xr-x  2 root root    4096 2010-05-19 00:33 .
drwxr-xr-x 10 root root    4096 2010-05-19 06:40 ..
-rwxr-xr-x  1 root root 2261919 2010-05-19 00:33 cf-agent
-rwxr-xr-x  1 root root 2060308 2010-05-19 00:33 cf-execd
-rwxr-xr-x  1 root root 2010210 2010-05-19 00:33 cf-key
-rwxr-xr-x  1 root root 2149692 2010-05-19 00:33 cf-know
-rwxr-xr-x  1 root root 2132456 2010-05-19 00:17 cf-monitord
-rwxr-xr-x  1 root root 2024225 2010-05-19 00:33 cf-promises
-rwxr-xr-x  1 root root 2097049 2010-05-19 00:33 cf-report
-rwxr-xr-x  1 root root 2044719 2010-05-19 00:33 cf-runagent
-rwxr-xr-x  1 root root 2168710 2010-05-18 23:57 cf-serverd

sudo cat /var/spool/cron/crontabs/rootの出力、再び

# DO NOT EDIT THIS FILE - edit the master and reinstall.
# (- installed on Wed May 19 00:37:38 2010)
# (Cron version -- $Id: crontab.c,v 2.13 1994/01/17 03:20:37 vixie Exp $)
やり直して、再度cf-agentの起動
$ sudo cf-agent

cf-agentの出力

R: Added a 5 minute schedule to crontabs

一度、正常にcf-agentが起動してからやり直している場合は、正常終了していない事が原因でcf-agentが起動しないかもしれません。 /var/spool/cron/crontabs/rootファイルにcf-execd関連の記述がないのに、cf-agentがメッセージを出さない場合には、$ sudo cf-agent -Kオプションで、lockファイルを無視して起動するのが良いでしょう。

改めて各ディレクトリファイルを確認すると、パーミッションが -rw--------rwx------ になっている事がわかります。 またcronからcf-execdが5分間隔で実行されるようになっています。

cf-agent実行後のls -al /var/cfengine/inputsの出力

total 116
drwxr-xr-x  2 root root  4096 2010-05-18 22:53 .
drwxr-xr-x 10 root root  4096 2010-05-19 06:40 ..
-rw-------  1 root root  1188 2010-05-18 22:51 failsafe.cf
-rw-------  1 root root  3502 2010-05-18 22:51 library.cf
-rw-------  1 root root  2882 2010-05-18 22:51 promises.cf
-rw-------  1 root root 55101 2010-05-18 23:00 promises.cf.html
-rw-------  1 root root 20653 2010-05-18 23:00 promises.cf.txt
-rw-------  1 root root  6990 2010-05-18 22:51 site.cf
-rw-------  1 root root  1955 2010-05-18 22:51 update.cf

cf-agent実行後のls -al /var/cfengine/binの出力

total 18568
drwxr-xr-x  2 root root    4096 2010-05-19 00:33 .
drwxr-xr-x 10 root root    4096 2010-05-19 06:40 ..
-rwx------  1 root root 2261919 2010-05-19 00:33 cf-agent
-rwx------  1 root root 2060308 2010-05-19 00:33 cf-execd
-rwx------  1 root root 2010210 2010-05-19 00:33 cf-key
-rwx------  1 root root 2149692 2010-05-19 00:33 cf-know
-rwx------  1 root root 2132456 2010-05-19 00:17 cf-monitord
-rwx------  1 root root 2024225 2010-05-19 00:33 cf-promises
-rwx------  1 root root 2097049 2010-05-19 00:33 cf-report
-rwx------  1 root root 2044719 2010-05-19 00:33 cf-runagent
-rwx------  1 root root 2168710 2010-05-18 23:57 cf-serverd

cf-agent実行後のsudo cat /var/spool/cron/crontabs/rootの出力

# DO NOT EDIT THIS FILE - edit the master and reinstall.
# (- installed on Wed May 19 00:37:38 2010)
# (Cron version -- $Id: crontab.c,v 2.13 1994/01/17 03:20:37 vixie Exp $)
0,5,10,15,20,25,30,35,40,45,50,55 * * * * /var/cfengine/bin/cf-execd -F

とりあえず動いたので、ここを足がかりにいろいろ確認していこうと思います。

2010/05/17

VMWare用にDebian lennyでDNSサーバを動かしてみた

VMWare Workstation内でCfengine3のテスト用"CfengineTeam"を作成しました。 それはさておき、今回はその前準備のDNSサーバのセットアップについてです。

各インスタンスの/etc/hostsで管理しても良かったのですが、Cfengine相手だとDNS経由で逆引きできた方が良かろうという事で、Team内のVMにDNSサーバをセットアップすることにしました。

家にあるマシンを管理するためのDNSサーバは既にありますが、Teamはたくさん作りますし、単一のDNSサーバでVMに重複しないようIPアドレスを割り当てるのは面倒な作業に思えたので、DNSサーバを使い捨て感覚で各Teamに配置しようというものです。

今回のポイントは次の通り。

  • DNSで管理するIPはNICを追加して10.0.0.0/16なIPを割り当てる
  • テスト用なので使い捨て
  • debian lennyに特化した手順の確立

今後もTeamを作成する度に何かしら作業が発生しそうなので、メモを残す事にしました。

パッケージの導入

まずは必要なパッケージを入れます。

$ sudo apt-get install bind9

一緒にbind9utilsも入りますが、続いてnslookupなど確認用のパッケージを入れておきます。

$ sudo apt-get install dnsutils bind9-host

bind9の設定

設定ファイルは基本的に/etc/bindディレクトリ以下に存在します。

起動時のオプションを変更する場合には/etc/default/bind9ファイルを編集します。

VMWare用にサブドメインを作成

DNSサーバはzone単位で管理する必要があるので、設定次第ですが、基本的には既にあるドメインとは異なるzoneを作成します。

ただVMWareのTeam毎に別にする必要はないので、一律に"vm.example.org"を10.0.0.0/16に作ろうと思います。 他のドメインも作りたくなるかもしれませんし、ネットワークは/8ではなくて、/16にしました。

/etc/bind/named.conf.localファイルに追加する部分

zone "vm.example.org" {
        type master;
        file "/etc/bind/db.vm.example.org";
};
zone "0.10.in-addr.arpa" {
        type master;
        file "/etc/bind/db.10.0";
};
db.*ファイルの準備

zoneファイルを準備してしまえば良いのですが、公開しないので手間を省くためにdb.0ファイルをコピーします。

$ sudo cp db.0 db.vm.example.org
$ sudo cp db.0 db.10.0

実際に公開するDNSサーバでは、RFC1912に書かれている範囲のことは抑えておく必要があります。 具体的にはSOAレコードに実際に届くメールアドレスを書くこと、NS,逆引きPTRレコードなどで参照するホスト名はAレコードの名前であること、などがあります。

細かいことはいろいろありますが、ホスト名を追加する度に次のようなレコードを追加していきます。

db.vm.example.orgファイルに1ホスト分のデータを追加する

debian IN  A 10.0.0.1

db.10.0ファイルに1ホスト分のデータを追加する

1.0  IN PTR debian.vm.example.org.
その他の問い合せをメインのDNSサーバに振り分ける

これは単純にforwarderで知らない問い合せを他のサーバに転送します。

VMのプライマリネットワークがNATであれば、NATネットワーク(172.16.73.0/24)内のDNSサーバに転送するのが良さそうに思えます。

/etc/bind/named.conf.optionsファイル

options {
        directory "/var/cache/bind";
        forwarders {
                172.16.73.2;
         };
        auth-nxdomain no;    # conform to RFC1035
        listen-on-v6 { any; };
};

/etc/resolv.confが自動的に更新される場合の手当について

NATネットワークのIPをDHCPから受けている場合には、自動的に/etc/resolv.confが更新されていきます。

手で/etc/resolv.confに nameserver 127.0.0.1 を書いても、時間が経つと消えている場合にはDHCPクライアントの設定を変更するが良さそうです。

今回の場合は/etc/dhcp3/dhclient.confにDNSサーバとドメイン名の設定を行ないました。

/etc/dhcp3/dhclient.confに追加した設定

supersede domain-name "vm.example.org";
prepend domain-name-servers 127.0.0.1;

終ってみれば、わざわざメモを残すほどじゃなかったかなという感じですが、細かい点をいろいろ確認する良い機会になりました。

2010/05/16

SDカードにnilfs2領域を作成した、その顛末

beagleboardに差しているSDカードに書き込み不可なブロックが出現したりしてファイルシステムが恐れてしまう現象が何回か発生しました。

そこで試験的にnilfs2な領域を作成して/home, /var, /usrにしたのですが、2週間ほど稼働した後に残念ながら書き込みができなくなりました。 最初はGCプロセスが動いていないのかなと思ったのですが、空きが十分ある状態で論理的な不整合が原因のようです。 使っていたSDカード(Panasonic 2GB Class6)自体には問題はないようで、ext3でフォーマットを再度行なって問題なく動いていました。

最終的には2GBでは空き領域が不足したので、 東芝の海外向けClass6 4GB SDカードを購入しました。 これをext3で60〜90%程度まで使って、データをUSBフラッシュメモリに退避するような使い方をしています。 1週間程度使ってみて特に問題は発生していません。

以前のカード(上海問屋オリジナル150倍速 2GB SDカード)は連続稼働して、おおよそ3週間程度で問題が発生しました。 東芝製の白SDカードはSLC NANDと言われているので、その通りであれば、今回は全体の容量も増えているので当分は様子をみる必要がありそうです。

経験的には Alixに使っているCFカード(ext3フォーマット)で問題が発生したのはMLCタイプのものだけです。 今回はSDカードでしたが、nilfs2に問題があったというよりも使い方に問題があったんだと思いますが、しばらくは無難にext3を使ってみます。

まぁSLC NANDフラッシュメモリを使ったSDカードが欲しいといった時に、明記されているのは トランセンドの150倍速SDカードぐらいですね。 過去にSLCであっても内部でRAID0のようなストライピングを行なうことも可能ですし、パフォーマンスをみてもたぶんSLCなカードとほぼ同じパフォーマンスだからSLCだろう、と判断することしかできないのが残念なところです。

この記事で取り上げた品々

2010/05/11

Ubuntu Enterprise Cloudを試してみる

GW期間中にデスクトップをUbuntu 10.04 LTSに更新してから、Ubuntu Enterprise Cloud (UEC)環境も10.04を新規にインストールして、Eucalyptus 1.6.2ベースに以降しました。

システム構成

ありあわせのシステムなので、 prerequisitesを完璧にはカバーしていません。

Node Controller(NC)にはSocket AM2 + Phenom X4 9350eベースのシステムで、こちらはおおよそ推奨環境を満しています。それ以外のCloud Controller(CLC)やCluster Controller(CC)、Walrusといったシステムを含むシステムはSocket 754 + AMD MT-37ベースのシステムでHDDは最低40GB, 推奨100GBのところ60GB、メモリは最低2GBのところ、1GBしか積んでいません。

Muninで負荷を観察する限りはCCノードのメモリ不足はいまのところ顕在化していませんが、 管理系のノードにもそれなりのスペックが要求されているのは気をつけるところかもしれません。

トポロジー

Eucalyptusシステム構成図

図のように、CCと同じLANセグメントにあるシステムからはNCに対するルーティングがありません。 UECをデフォルトのまま入れると、このCCとNCをつなぐLANに対してはDHCPを想定した設定が行なわれます。

今回のようにCCとNCのみが存在するネットワークを構成する場合には、CCを導入した後で手動で/etc/network/interfacesを変更してIPアドレスを割り振っておく必要がありました。

管理系ネットワークにもDHCPやらDNSやら配置するかはセキュリティを考慮するとMACアドレス管理と組み合せる事を考えると手間がかかるので、台帳ベースで静的にIPアドレスを割り当てても元が取れそうです。 インストール時にパブリックネットワーク以外のNICも構成できると良かったかもしれません。

Ubuntu 10.04 LTSのデスクトップからElasticFoxを使ってみる

手元のデスクトップはUbuntu 8.04からのアップグレードで、昔からの設定がいろいろと残っています。

インスタンスの起動

インスタンスには"Extras"に並んでいる euca-debian-5.0-i386.tar.gz をベースとしました。 このアーカイブに含まれるファイルの導入自体は 以前投稿した「@IT::Ubuntuで始めるクラウドコンピューティング」にある通りです。

debian.5-0.x86.imgの中の変更方法

イメージファイルを使ってみて不具合や機能を追加したい場合には、linuxデスクトップで中身を変更してUECに追加登録することができます。 loopbackデバイスとして導入すれば良いので、/mntなど任意の場所にマウントすることができます。

/mnt直下を使うといろいろマウントする時に不便なので、/mnt/loopディレクトリを作成することにします。

$ sudo mkdir /mnt/loop

またイメージファイルのバックアップがないと困る場合が多いので、コピーを作成して変更してからUECに登録することにします。

$ sudo cp debian.5-0.x86.img debian.5-0.x86.20100506.img
$ sudo mount -o loop debian.5-0.x86.20100506.img /mnt/loop

例えばapt-getで最新のパッケージを導入したければ次のようにすることができます。

$ sudo chroot /mnt/loop
$ sudo apt-get update
$ sudo apt-get upgrade

apache2など、パッケージによっては/procや/sysがないのでプロセスの起動に失敗する場合もあります。 ですが、いまのところは/procをmountしなければいけない場面には遭遇していません。

使い終ったら$ sudo umount /mnt/loopで作業を完了しますが、/mnt/loopをカレントディレクトリとしてdaemonが起動したり、/proc, /sysがマウントされていたりするとumountに失敗します。 問題がある場合は、$ cd ~/は基本として、lsofなどを使って/mnt/loopに関連するプロセスを停止したり、/procをumountするなどする必要があります。

/procがマウントされていることは発見の方法が、いまのところなさそうなので

この点を踏まえて、使い易くするための変更をいろいろ加えていこうと思います。

/tmpのパーミッション変更

インスタンスを起動して一般ユーザで操作をしているとエラーになるタイミングがあったので、調べてみると/tmpに書き込み権限がありませんでした。 /var/lock/var/tmp は正しく1777になっていました。

debian.5-0.x86.imgに含まれる/tmpのパーミッション

drwxr-xr-x  4 root root  4096 2009-10-19 06:18 /tmp

この部分はimgファイルを/mnt/loopにマウントして次のようなコマンドで1777に設定します。

$ sudo chmod 1777 /mnt/loop/tmp
スワップ領域の設定

NCの/etc/eucalyptus/eucalyptus.confにSWAP_SIZEを明示的に設定しなくても、デフォルトで512MBの領域が/dev/sda3に作成されています。

この領域をデフォルトで有効にするために/etc/fstabファイルを編集することにします。

変更前のdebian.5-0.x86.imgに含まれる/etc/fstabファイル

/dev/sda1        /             ext3     defaults,errors=remount-ro 0 0
proc             /proc         proc     defaults                   0 0

変更後のdebian.5-0.x86.imgに含まれる/etc/fstabファイル

/dev/sda1        /             ext3     defaults,errors=remount-ro 0 0
proc             /proc         proc     defaults                   0 0
/dev/sda3        none          swap     sw                        0 0
largeインスタンスへの対応 - /ファイルシステムの拡張

インスタンスを起動すると/ファイルシステムに1GBしか割り当てられていません。 /dev/sdaディスクのサイズ自体は”Configuration”から変更できるのですが、空き領域は/dev/sda2としてしかアクセスすることができません。

/appなどのマウントポイントを作成して/dev/sda2をマウントすることもできますが、Javaパッケージなどを導入すると/が足りなくなるので、できれば/dev/sda1を拡張したいところです。

自分が使うディスクに合せて、例えば5GBのディスクを割り当てて、'/'ファイルシステム(/dev/sda1)として4GBを使いたいといった場合には、次のように別のimgファイルに内容をコピーすることで対応できます。

$ dd if=/dev/zero of=debian.5-0.x86.20100506.4gb.img bs=1024 count=4196k
$ sudo mke2fs -j debian.5-0.x86.20100506.4gb.img
$ sudo tune2fs -c 0 -i 0 debian.5-0.x86.20100506.4gb.img

mke2fsは間違いの防止のためブロックデバイスでない場合には警告を表示します。 ファイルの内容を初期化しても問題ないか、ファイル名を確認してから'y'を入力します。

mke2fs実行時の確認メッセージ

$ sudo mke2fs -j debian.5-0.x86.20100506.4gb.img
mke2fs 1.41.11 (14-Mar-2010)
debian.5-0.x86.20100506.4gb.img is not a block special device.
Proceed anyway? (y,n) y
...

こうやって作成したext3ファイルシステムのイメージを/mnt/loop2にマウントします。

$ sudo mkdir /mnt/loop2
$ sudo mount -o loop debian.5-0.x86.20100506.4gb.img /mnt/loop2

あとは/mnt/loopにdebian.5-0.x86.imgなど元になるイメージをマウントしてから、内容をコピーします。

$ sudo rsync -av /mnt/loop/. /mnt/loop2/.
$ sudo umount /mnt/loop
$ sudo umount /mnt/loop2

これで4GBのイメージファイルができたので、swapの分も合わせて5GBほどのディスクを割り当てたインスタンスで起動することができるようになります。

/dev/sda2も便利な場合があると思います。 ただ1GBでは導入できるパッケージの数が低めに抑えられてしまうので2〜4GBのインスタンスイメージは準備しておいて損はないでしょう。

UEC環境の活用の方法

インスタンスをある程度操作できるようになれば、自動化スクリプトなどを配置しておく事も可能になります。 Walrusのディスクは任意のデバイスとして割り当てる事ができるので、あらかじめ必要なファイルを配置しておき、/dev/sdbが存在すれば監視系を導入して、/dev/sdcが存在すればWebサーバになるよう構成を変更する、といったことも可能でしょう。

いいかえると環境があるだけでは、揮発性のインスタンスイメージをいくつ起動しても本番領域としてはなかなか使えないという事になります。

UEC環境にCLC, CCサーバが存在するように、NCサーバの他にも監視系などはUEC外部に構築するといった設計が必要になるでしょう。 更新時期が近づいた既存のインフラをUECに置き換えることはお勧めですが、バランスよく対象を選定しないと障害でシステムが停止した途端に、データはあるけど、実は復旧できないシステムをUEC環境上に構築してしまうかもしれません。

ここら辺がPrivate Cloudさえもプラットフォームとして外部から提供される状況を招いているのかもしれませんが、ある程度の規模のデータセンタを持っているのであれば自社の中で技術力を保持するためにもPrivate Cloudの運用は良いトレーニングになるかもしれません。

あとは何らかの共有ファイルシステムも必要です。 HadoopのHDFSは用途が限定されるので、CCサーバを中心としてOCFS2が使えないかアイデアを試そうとしています。

使えるまでの環境をどうやって作っていくのかが腕の見せどころなのかもしれません。