ぐうたら。¶
今日はこんな感じでぐうたら生活してみた。
昼過ぎに歩いて5分の温泉行って、ヨメを待っている間に休憩エリアで昼寝して、ビール飲みながら昼飯食べた。近所のスーパーに買い物行って、こまめの血のつながらないお兄ちゃんがまた売られないね、可哀想だねぇと眺めて、こまめの冬支度で電子レンジでチンして10時間保温が保つペット用の湯たんぽを購入し、夕食の材料買って帰宅。ハガレン見て、夕食作って天地人見て、仁を見て、流し片付けてから洗面台の排水口掃除。ああ、掃除は今頃始めるもんじゃないね。
眠くなってきたので家計簿つけたらさっさと寝るか。
続・CouchDB 0.10を試してみる。¶
先日 の続き。1個手順を見落としていた。
$ ./bootstrap
You have bootstrapped Apache CouchDB, time to relax.
Run `./configure' to configure the source before you install.
ああ、凡ミス。後は普通の手順。
$ ./configure --prefix=/opt/couchdb
(snip)
You have configured Apache CouchDB, time to relax.
Run `make && sudo make install' to install.
$ make && sudo make install
ユーザの作成。パスとデフォルトシェルを変更して実行。果たしてdashでcouchdbはちゃんと動くのか?(わら
$ sudo adduser --system --home /opt/couchdb/var/lib/couchdb \
--no-create-home --shell /bin/dash --group --gecos "CouchDB Administrator" couchdb
Adding system user `couchdb' (UID 112) ...
Adding new group `couchdb' (GID 124) ...
Adding new user `couchdb' (UID 112) with group `couchdb' ...
Not creating home directory `/opt/couchdb/var/lib/couchdb'.
オーナ、パーミッションの変更もパスを変更して実行。
$ sudo chown -R couchdb:couchdb /opt/couchdb/{etc/couchdb,var/{lib,log,run}/couchdb}
$ sudo chmod -R 0770 /opt/couchdb/{etc/couchdb,var/{lib,log,run}/couchdb}
$ ls -ld /opt/couchdb/{etc/couchdb,var/{lib,log,run}/couchdb}
drwxrwx--- 4 couchdb couchdb 4096 2009-11-01 18:11 /opt/couchdb/etc/couchdb
drwxrwx--- 2 couchdb couchdb 4096 2009-11-01 18:11 /opt/couchdb/var/lib/couchdb
drwxrwx--- 2 couchdb couchdb 4096 2009-11-01 18:11 /opt/couchdb/var/log/couchdb
drwxrwx--- 2 couchdb couchdb 4096 2009-11-01 18:11 /opt/couchdb/var/run/couchdb
起動は、
$ sudo /opt/couchdb/etc/init.d/couchdb start
でおk。稼働確認とるとこんな風に表示される。
$ curl http://localhost:5984/
{"couchdb":"Welcome","version":"0.11.0ba0d616d6-git"}
ム、0.10じゃねぇ、0.11だ!ああ、svnのtrunkから取ってきたからか。”-git”がついているのは、git svn cloneで取ってきたからだな。とまぁ、落ちもついたところで次回は機能自体を試してみるか。
OSC 2009 Tokyo/Fallに行ってきた。¶
今回からいつもの行動パターン+1となった。
いつものパターン¶
仮想化友の会のセッション&かそともランチ
今年の流行語大賞は「クラウドサービスそれは簡単なこと」になるに違いない。
VNETのハードコーディングはワロタが、L2の機能その物は確かに便利。
蒲田駅前のサイゼリアであんなことやこんなこと。言えやしない。
超割引特価のXen徹底入門第2版を購入&執筆者陣にサインいただいた。お疲れさまでした。
doggieさんにML115のメモリ頂いた。ありがとうございます。
東京エリアDebian勉強会ブース&宴会
今回はセッションなし。
9月のKSPの資料を1枚ペらにして持っていった。
タイル型ウィンドウマネージャの会&Gentoo, Debian, Ubuntuという並びで、312号室だけやたら濃かった。
セッションと途中のブースめぐり以外ではブース前で呼びこみ。
「結構まだまだDebianってなんですか?」とか「昔(Potato, Sargeのころ)はDebian使ってたんですが、今は使ってないんですが何か?」というDebianなんて興味ないんだけど使ってあげてもいいわよ、というツンデレな人が結構ブースに来た。今回配布していたLiveDVDで試して、ぜひ乗り換えてほしいですな。
「昔使っていたがパッケージ古くて他に替えてみたけどちょっと微妙」という人もいて、話をしてみるとサーバ用途ではなく、結構開発環境やデスクトップ環境として使う人も。そういう人にはstableじゃなくてSidを奨めておいた。Sidって不安定なんでしょ?という人には、MacBookでネイティブインストールしてもいきなり全部dist-upgradeしなけりゃ割と安定しているよ、と教えておいた。
ブースと宴会でキーサイン実施。毎月の勉強会でも参加登録のときにキーサインしたい旨書いてもらうと良いのかもしれない。
宴会は蒲田東口の 春香園 にて。値段の割に結構腹一杯食えておいしかった。餃子の王将より1つが大きいのが良いね。
宴会で出た今後のToDoは後述。
2次会でブロッサムに行こうという話が出たのだが、蒲田駅に行くまでの間に先頭と後ろに分かれてしまい、先頭集団は何か解散モードだったのでそのまま川崎経由で帰宅。どうやら本当にブロッサムに行ったらしい。
+1¶
CouchDB JPのセッション。次回以降はセッションだけじゃなくてブース出すのかな?
CMSでCouchDBを使う話。徐々にCouchDBが商業的にも浸透してますな。
複数サービスは確かに頭の痛い話。Raindropは結構面白そう。
DBとして見るか、アプリとしてみるか、CouchDBへアプローチするそれぞれの人のバックグラウンドによって違うけど、まだどれも正解はないしどういう使い方しても良いんじゃないかという点で面白い。ワシはどっちでもなくて、内部実装がErlangだから、というアプローチだし。
そういやブース回ったんだっけ。¶
Asteriskで電話番号採番の仕組みを教えていただいた。
そういうプロバイダがあるのね。
閉網だとAsteriskのような交換機は不要。IPアドレスでもオレオレ番号でもOK。専用端末でもちゃんとIPアドレスで電話かけられるとか。
外に出ていくときに、交換機が必要。そこでAsterisk。
Voyager Linux というDebianベースの香港発のディストロがあるとは知らなかった。
なんか土曜なのに仕事モードになった自分が嫌になったけど、勉強になったのでヨシとしよう。
宴会で出たDebian勉強会のToDo 1 議事メモ。¶
覚えているのはこんな感じか。いつも飲んで次の日忘れるからメモ。
今年もDebian温泉やりたい。
熱海あたりは良いね。
マイクロバス借りて行きたい。
木更津でDebian温泉というのもアリ。東京エリアDebian勉強会 in 木更津。Debian meets 木更津キャッツアイだな 2 。実現にはid:pi8027さんと情報交換必要かな。
木更津で温泉だと、 一泊二日で朝夕食がバイキングで1部屋4人だと、平日10500円, 土日14,700円というのがあるな 。無線LANは不明。
Debconf in Japan
普通の大学と夏休みの時期がズレている筑波大なら実現できるかも。 つくらぐ の人と今後情報交換必要。
1月の勉強会はITS大久保で、そのまま宴会は 桜華樓 の希望あり。
萌があるようだ。”ガラス越し”に反応している輩が居ったな。(わら
宴会は事前に前日夕方までに人数&メニュー確定し、当日ドタキャン|飛び入り参加ができないのが課題。ドタキャンするなら身代わりを立ててもらわんとアカン。
立食形式 にするなら2、3名程度の飛び入り参加は何とかなるかなぁ?
身代わり立てられずにドタキャンする場合は、参加しない場合でも参加料(食事メニュー分のみ)は後日払ってもらわないといけない。会社とか常連参加者ならまぁ立て替えても良いけど、初参加の人はそれが読めないねぇ。
Common Lispの続きをやりたい。by @khibino さん。
余談¶
一部でDebconf9 Tシャツとこまめ姫が人気でした。
lxcを導入してみた。¶
前回 の続きである。
まず訂正。¶
lxcはLinux Kernelを拡張しないようだと書いたのだが、実は2.6.29まではパッチを当てる必要があったようだ。ただlxc特有の機能ではないので、grepしてもlxcなんて出てきやしないし、現状はメインラインにマージされているみたいなので勘違いだった。
ブリッジの設定。¶
lxcを使うには、ブリッジの設定が必要なので、前回は書かなかったが、iprouteパッケージも入れておかないとアカン。/etc/network/interfacesに最初からブリッジの設定をしてしまう方法もあるんじゃなかろうか。が、調べるのが面倒なのでシェルスクリプトでブリッジ設定をするようにしてみた。
$ cat /etc/network/interfaces
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).
# The loopback network interface
auto lo
iface lo inet loopback
# The primary network interface
auto eth0
allow-hotplug eth0
iface eth0 inet static
address 192.168.xxx.xxx
netmask 255.255.255.0
broadcast 192.168.xxx.255
pre-up /etc/init.d/iptables start
post-up /etc/network/if-up.d/brctl.sh
auto eth1
allow-hotplug eth1
iface eth1 inet static
address 192.168.zzz.zzz
netmask 255.255.255.0
broadcast 192.168.zzz.255
肝心のブリッジの設定を行うスクリプトはこんな感じ。
#!/bin/sh
brctl addbr br0
brctl setfd br0 0
ifconfig br0 192.168.xxx.xxx promisc up
brctl addif br0 eth0
ifconfig eth0 0.0.0.0 up
route add -net default gw 192.168.xxx.1 br0
そうすると、こんな感じになるわけですな。
$ sudo brctl show
bridge name bridge id STP enabled interfaces
br0 8000.00wwwwyyyyxxno eth0
veth0_14820
veth0_15932
veth0_17164
これは、コンテナを起動させた状態での結果なので、上記の手順直後では veth0_????? となっているインタフェースがない。 veth0_????? はコンテナのI/F。この状態では現在3つのコンテナを稼働させていることが分かる。
コンテナ作成準備。¶
コンテナ作成をするまえに、cgroupファイルシステムをマウントする必要がある。/etc/fstabに以下の一行を追加する。
cgroup /var/local/cgroup cgroup defaults 0 0
これで、/var/local/cgroupをマウントしておくこと。このcgroupを使うと、 まとめてリソースを管理できる という特徴から、lxc-cgroupコマンドであるコンテナのリソースを一括表示できたりする。例えばこんな感じ。
$ sudo lxc-cgroup -n web devices.list
c 1:3 rwm
c 1:5 rwm
c 5:1 rwm
c 5:0 rwm
c 4:0 rwm
c 4:1 rwm
c 1:9 rwm
c 1:8 rwm
c 136:* rwm
c 5:2 rwm
c 254:0 rwm
パッケージとしてはlxcを導入すれば良いだけなのだが、コンテナとして使うためにはコンテナ用のイメージが必要だ。dWに書いているように予めdebootstrapでアーカイブを作るという方法も良いかも知れないが、実はこれ、自分の環境では一部の設定ファイルが見つからず、エラーになってうまくいかなかった。
$ sudo bash lxc-debian create
(snip)
Specify the location for an extra fstab file [(none)]
Cache repository is busy.
/home/kohei/lxc-debian: line 242: break: only meaningful in a `for', `while', or `until' loop
Choose your architecture
1) amd64
2) i386
#? 1
Architecture amd64 selected
Checking cache download ...Found.
Copying rootfs ...Done.
/home/kohei/lxc-debian: line 91: ./rootfs.web//etc/ssh/sshd_config: そのようなファイルやディレクトリはありません
原因は、事前に作っておいたdebootstrapのtarballを展開したものをキャッシュとして、lxc-debianスクリプト 1 を実行したため。tallballを使うならlxc-debianスクリプトではなくコンテナの構成ファイルを自分で記述すべきなのかもしれない。逆にlxc-debianスクリプトを使うなら予め作っておいたアーカイブを使わないほうが良さそうだ。
ちなみに、アーカイブの作り方&展開の仕方は、下記のとおり。
$ sudo debootstrap --make-tarball sid.packages.tgz sid http://cdn.debian.or.jp/debian/
$ sudo mkdir /var/cache/lxc/debian;cd /var/cache/lxc/debian
$ sudo debootstrap --unpack-tarball ~/sid.packages.tgz sid rootfs-amd64
I: Retrieving Release
I: Validating Packages
I: Retrieving Packages
I: Validating Packages
I: Resolving dependencies of required packages...
I: Resolving dependencies of base packages...
I: Found additional required dependencies: dash insserv libdb4.7
(snip)
I: Configuring tasksel...
I: Base system installed successfully.
lxc-debianスクリプトを使わないのなら、展開先のディレクトリ名をrootfs-amd64に指定しなくても良いかもしれない。何せ、rootfs-amd64としているのは、lxc-debianスクリプトが対応しているi386またはamd64で作られるキャッシュのディレクトリ名だからだ。
$ zgrep -n -C 1 ARCH /usr/share/doc/lxc/examples/lxc-debian.gz
245- echo "Choose your architecture"
246: select ARCH in amd64 i386; do
247: echo "Architecture $ARCH selected"
248- break;
--
252- echo -n "Checking cache download ..."
253: if [ ! -e "$CACHE/rootfs-$ARCH" ]; then
254-
--
256-
257: mkdir -p "$CACHE/partial-$ARCH"
258-
--
260- echo "Downloading debian minimal ..."
261: debootstrap --verbose --variant=minbase --arch=$ARCH \
262- --include ifupdown,locales,libui-dialog-perl,dialog,apache2,netbase,net-tools,iproute,openssh-server \
263: lenny $CACHE/partial-$ARCH http://ftp.debian.org/debian
264-
--
269- fi
270: mv "$CACHE/partial-$ARCH" "$CACHE/rootfs-$ARCH"
271- echo "Download complete."
--
277- echo -n "Copying rootfs ..."
278: cp -a $CACHE/rootfs-$ARCH $ROOTFS && echo "Done." || exit
279- ) 200> "/var/lock/subsys/lxc"
じゃあ、このlxc-debianスクリプトをそのまま使えば良いか、というと必ずしもそうではない。このスクリプトではインストールされるディストリビューションはlennyで、デフォルトでapache2がインストールされるようになっている。今回はホストOSもコンテナのゲストOSも両方ともSidにしたかったのと、Apacheを使うつもりはないのでこれは非常に不便だ。なので、スクリプトを実行する前に以下のように変更しておいた。
$ zdiff -u /usr/share/doc/lxc/examples/lxc-debian.gz lxc-debian
--- - 2009-10-31 00:23:10.497679968 +0900
+++ lxc-debian 2009-10-30 17:58:20.000000000 +0900
@@ -8,8 +8,8 @@
MNTFILE=
TMPMNTFILE=
UTSNAME=
-IPV4="172.20.0.21"
-GATEWAY="172.20.0.1"
+IPV4="192.168.xxx.xxx"
+GATEWAY="192.168.xxx.yyy"
MTU="1500"
# These paths are within the container so do not need to obey configure prefixes
@@ -99,14 +99,14 @@
SyslogFacility AUTH
LogLevel INFO
LoginGraceTime 120
-PermitRootLogin yes
+PermitRootLogin no
StrictModes yes
RSAAuthentication yes
PubkeyAuthentication yes
IgnoreRhosts yes
RhostsRSAAuthentication no
HostbasedAuthentication no
-PermitEmptyPasswords yes
+PermitEmptyPasswords no
ChallengeResponseAuthentication no
EOF
}
@@ -259,8 +259,8 @@
# download a mini debian into a cache
echo "Downloading debian minimal ..."
debootstrap --verbose --variant=minbase --arch=$ARCH \
- --include ifupdown,locales,libui-dialog-perl,dialog,apache2,netbase,net-tools,iproute,openssh-server \
- lenny $CACHE/partial-$ARCH http://ftp.debian.org/debian
+ --include ifupdown,locales,libui-dialog-perl,dialog,sudo,vim-tiny,dnsutils,netbase,net-tools,iproute,openssh-server \
+ sid $CACHE/partial-$ARCH http://cdn.debian.or.jp/debian
RESULT=$?
if [ "$RESULT" != "0" ]; then
lxc-debianスクリプトはdebootstrapの–includeオプションで指定したパッケージを自動的にインストールし、スクリプトの冒頭部分でシステムの初期設定を行う。ところがapache2はインストールされるのに、viやsudo, digが無かったりと結構不便だったりする。なので、実際にはスクリプトを変更してから実行した方が良いかもしれない。また、インストールするディストリビューションはlennyにdebootstrapで指定されている。Sidにしたければこれを実行する前に変更する必要があるというわけだ。但し、予めアーカイブを上記のrootfsとしてキャッシュを作成していると、ディストリビューションやパッケージはすでに展開済みのファイルが利用されてしまう。設定ファイルは変更すればそちらが反映されるのだが。
コンテナ作成。¶
さて、準備が整ったのでコンテナを作成してみる。コンテナの作成にはlxc-debianスクリプトを使うことにした。
$ sudo bash /home/kohei/lxc-debian create
What is the name for the container ? [debian] web
What hostname do you wish for this container ? [web]
What IP address do you wish for this container ? [192.168.xxx.xxx]
What is the gateway IP address ? [192.168.xxx.xxy]
What is the MTU size ? [1500]
Specify the location of the rootfs [./rootfs.web]
Specify the location for an extra fstab file [(none)]
(snip)
Choose your architecture
1) amd64
2) i386
#? 1
Architecture amd64 selected
Checking cache download ...Found.
Copying rootfs ...Done.
(snip)
update-rc.d: using dependency based boot sequencing
Done.
You can run your container with the 'lxc-start -n web'
という感じでコンテナができる。コンテナの実体は/var/cache/lxc/debian/ディレクトリ以下にrootfs.hogeの形式の名前のディレクトリが作られ、ここにdebootstrapでのコピーが含まれる。最初にlxc-debian createを実行すると、/var/cache/lxc/debian/rootfs-amd64以下にキャッシュが作られ、次回以降はここからコピーが作成されるので、最初に示したようにわざわざdebootstrap –make-tarballはしないで良いのかもしれない。コンテナのメタ情報は、/var/lib/lxc/ディレクトリのコンテナ名のディレクトリ以下にある。ツリー表示するとこのようになっている。
$ tree /var/lib/lxc/web/
/var/lib/lxc/web/
|-- cgroup
|-- config
|-- fstab
|-- init
|-- network
| `-- veth0
| |-- ifindex
| |-- link
| |-- mtu
| |-- name
| `-- up
|-- nsgroup -> /var/local/cgroup/web
|-- pts
|-- rootfs
| `-- rootfs -> /var/cache/lxc/debian/rootfs.web
|-- state
|-- tty
`-- utsname
5 directories, 13 files
ちなみにこのメタ情報があるため、いらなくなったコンテナの実体をディレクトリごと削除してもダメ。コンテナがいらなくなったら、
$ sudo lxc-destroy -n web
としないといけない。ハマったよ。
コンテナの起動。¶
ここまでできたら、あとは起動するだけ。まずはフォアグラウンドで実行してみよう。
$ sudo lxc-start -n web
INIT: version 2.86 booting
mknod: `//dev/ppp': Operation not permitted
Starting the hotplug events dispatcher: udevd.
Synthesizing the initial hotplug events...done.
Waiting for /dev to be fully populated...
done (timeout).
Activating swap...done.
mount: you must specify the filesystem type
Cannot check root file system because it is not mounted read-only. ... failed!
Cleaning up ifupdown....
Loading kernel modules...done.
Checking file systems...fsck from util-linux-ng 2.16.1
done.
Setting up networking....
Mounting local filesystems...done.
Activating swapfile swap...done.
Cleaning up temporary files....
Configuring network interfaces...done.
Setting kernel variables (/etc/sysctl.conf)...done.
Cleaning up temporary files....
INIT: Entering runlevel: 3
Starting enhanced syslogd: rsyslogd.
Starting periodic command scheduler: cron.
Debian GNU/Linux squeeze/sid web console
web login:
これで良いのか?実は良くない。このままだとログインできるユーザがない。しかも、hostsにコンテナのホスト名が定義されてないので、自ホストの名前解決でタイムアウトを待たないといけない。非常に不便だ。なので、ホストから以下のファイルをコピーすることになるのだが、そのままホストOS側から上書きしてしまうとファイルが壊れる可能性もありうるだろう。なので、コンテナをフリーズ(一時停止)させて、その間に必要なファイルを上書きすることにした。
$ sudo lxc-freeze -n web
$ sudo /etc/{passwd,shadow,group,sudoers,hosts} /var/cache/lxc/debian/rootfs.web/etc/
$ sudo lxc-unfreeze -n web
フリーズさせてコピーしたら、フリーズを解除してやればそのまま普通に使えるようになる。ただし、このままでは他のコンテナを作る時にもまたこの手順が必要になるので、コンテナのコピー元になっている、/var/cache/lxc/debian/rootfs-amd64/etc以下のファイルを上書きしてやれば良いだろう。でも、これって本来はこんなことしなくても大丈夫なようになっているもんじゃないの。バグじゃねぇか?
ちなみに、バックグラウンドで実行する場合は、-dオプションをつければよい。lxc-startを実行した親プロセスのシェルをexitしてもちゃんとデーモンとして残っているので心配ない。
コンテナを追加する。¶
これは非常に簡単。再度、lxc-debian createを実行すればよい。二回目以降は上記のキャッシュ/var/cache/lxc/debian/rootfs-amd64があるので、debootstrapの実行が省略されるからだ。二回目以降はすぐに終わる。3つ作ってみたコンテナのディスク使用量はそれぞれ以下のようになっている。
$ sudo du -sh ./rootfs*
234M ./rootfs-amd64
668M ./rootfs.couchdb
332M ./rootfs.git
296M ./rootfs.web
ディスク容量を見ても分かるとおり、単純機能として動かすためのコンテナの割には冗長なシステムになっていると言える。一方lxc-sshdスクリプト 2 を実行する場合だと、非常にシンプルなコンテナができあがる。全コンテナがlxc-sshdのように必要最低限のアプリ環境のみに固執することはないと思うが、用途に応じて使い分ける必要はあるだろうな。
と言うわけで…。¶
せっかくなので、次回はlxc-sshdでの場合も調べてみることにしよう。
Footnotes
挿すUSBポートによってMACアドレスを認識できない。¶
EPSONのEndeavorにSidを入れたのだが、RJ-45が1ポートしかないのでBUFFALOのUSB Ethernetアダプタ LUA2-TXを持ってきて挿してみた。pegasusデバイスドライバなので、デバイスは自動認識するのだが、なぜか通信できないなぁと思ってよく見てみたら、MACアドレスが00:00:00:00:00:00となっていた。モジュールをリロードしても状況が変わらないので、背面に4つあるUSBポートのうち 1 、別のポートに挿しなおしてみたらちゃんと認識して使えるようになった。
これはUSBポートの故障なのか?それともある特定のポートでは使えないという仕様なのか?まぁ普通に考えたら前者だよなぁ…。
- 1
前面には2つあるので全部で6つもあるよ、このPC。