lxc 0.6.4でlxc-debian createしてもコンテナを起動できない罠。¶
Debian 勉強会用のネタ用にLennyの環境がほしくてlxcのコンテナで新しく用意することにしたのだが、lxcを使い始めた0.6.3ではハマらず、現在の0.6.4でハマる罠に遭遇。
lxcでコンテナを作るときは、lxcパッケージに含まれているlxc-debianスクリプト(/usr/share/doc/lxc/examples/lxc-debian.gz)を使用するのだが、コンテナとしてマウントするためのdebootstrapで作るrootfsは、どこにあっても良いのでホームディレクトリ直下で、
$ sudo bash lxc-debian create
What is the name for the container ? [debian] test
What hostname do you wish for this container ? [test]
What IP address do you wish for this container ? [172.20.0.21]
What is the gateway IP address ? [172.20.0.1]
What is the MTU size ? [1500]
Specify the location of the rootfs [./rootfs.test]
として実行し、質問形式で表示される設定項目を、コンテナ名、IPアドレス以外はデフォルトのままにしておくと、ホームディレクトリの直下に~/rootfs.test/として作られる。
lxcを使い始めた時、ホームディレクトリにせず、別のディレクトリにしていた。
$ sudo mkdir /var/cache/lxc/debian
$ cd /var/cache/lxc/debian
$ sudo bash ~/lxc-debian create
とすると、/var/cache/lxc/debianの下にrootfsが作られたのだが、ホームディレクトリでlxc-startコマンドを実行しても0.6.3の時は何の問題も無くコンテナをブートできたわけだ。
が、0.6.4になってから、この方法で行うと、rootfsが作成される場所は、/opt/lxcディレクトリ以下であるのは変わらないのだが、ホームディレクトリでlxc-startコマンドを実行すると、
$ sudo lxc-start -n test
lxc-start: No such file or directory - failed to mount './rootfs.test'->'/tmp/lxc-r7X8fyc'
lxc-start: failed to set rootfs for 'test'
lxc-start: failed to setup the container
となり、ホームディレクトリ(カレントディレクトリ)にrootfs.testが無いので起動できない。
これは0.6.4から、各コンテナの設定方法の仕様が変わったためで、testコンテナの設定ファイルは、/var/lib/lxc/test/configにある。
$ cat /var/lib/lxc/test/config
lxc.utsname = test
lxc.tty = 4
lxc.pts = 1024
lxc.network.type = veth
lxc.network.flags = up
lxc.network.link = br0
lxc.network.name = eth0
lxc.network.mtu = 1500
lxc.rootfs = ./rootfs.test
lxc.cgroup.devices.deny = a
# /dev/null and zero
lxc.cgroup.devices.allow = c 1:3 rwm
lxc.cgroup.devices.allow = c 1:5 rwm
# consoles
lxc.cgroup.devices.allow = c 5:1 rwm
lxc.cgroup.devices.allow = c 5:0 rwm
lxc.cgroup.devices.allow = c 4:0 rwm
lxc.cgroup.devices.allow = c 4:1 rwm
# /dev/{,u}random
lxc.cgroup.devices.allow = c 1:9 rwm
lxc.cgroup.devices.allow = c 1:8 rwm
lxc.cgroup.devices.allow = c 136:* rwm
lxc.cgroup.devices.allow = c 5:2 rwm
# rtc
lxc.cgroup.devices.allow = c 254:0 rwm
lxc.rootfsの値が、”./rootfs.test”になっている。ただ、0.6.4にアップグレードした際も、元々のやつが起動できなかったことと、0.6.3の時もlxc-debian create時のrootfsのデフォルト値は相対パスだったのことを考えると、値は変わっていない気がする 1 。0.6.3の時はなぜ問題なかったのか? /var/lib/lxc/test/rootfs/rootfsが、/var/cache/lxc/debian/rootfs.testへのsymlinkになっていたからじゃないか なと。
回避方法は単純で、/var/lib/lxc/test/configのlxc.rootfsの値を相対パスから絶対パスに変えてやればよい。
結論としては、”lxc-debian create”するときは、相対パスのままにしないで、絶対パスでrootfsを指定しましょう、ということ。そんだけ。
- 1
0.6.3の環境が無いのとデグレートしてまで確認しようとは思わないので。
品薄続く。¶
Amazonで注文したLUMIXのズームレンズのお届け予定日が今日までだったのだが、いまだ在庫を確保できていないようでどうなんのかな、と思ったらこんなメールが送られてきた。
English follows Japanese ( 文章の最後に英語で同様のご案内がございます)
このたびは、Amazon.co.jpをご利用いただき、ありがとうございます。
2010-01-16 (注文番号:xxx-xxxxxxx-xxxxxxx)にご注文いただいた商品のお届け予定日がまだ確定しておりません。
“Panasonic デジタルカメラオプション デジタル一眼カメラ用交換レンズ H-FS045200”
継続して商品の調達に努めてまいりますが、調達不能な場合または入荷数の関係上
キャンセルをさせていただくこともございます。
なお、発送手続き前のご注文は、お客様により、いつでもキャンセルすることができます。
当サイトの規約により、商品の代金は発送時に請求させていただくため、現時点で
この商品に関するお客様へのご請求は行われておりません。
ご注文商品のキャンセル方法につきましては、以下のURLから「ヘルプデスク」に
リンクしてご覧いただくことができます。
http://www.amazon.co.jp/cancel-howto/
商品の入荷にお時間がかかり大変申し訳ございませんが、今しばらくお待ちください。
なお、商品のお届け予定日が確定次第、別途Eメールにてお知らせします。
English: We have learned that there has been a delay with some of the item(s) in your order indicated above.
When your order is shipped you will receive an e-mail message confirming the date, contents and method of shipment.
As per our standard policy, we do not charge you for items until they enter the shipping process, so you will not be charged for this item until it is available and we have shipped it to you.
Amazon.co.jpのまたのご利用をお待ちしております。
誠に申し訳ございませんが、こちらのEメールは配信専用のアドレスとなっておりますため、
お問い合わせ等のメッセージを受け付けることができません。恐れ入りますが、ご不明な点は、
下記のURLからカスタマーサービスにEメールでお問い合わせください。
http://www.amazon.co.jp/contact-us/
Amazon.co.jp
カスタマーサービス部門
今週の火曜にヨドバシに行った時も、次回入荷予定が2/28になっていたので、全体的に品薄なんだろう。需要がありすぎるのか、供給量が少ないのか、いずれにしても早く入荷されないかなぁ。
それにしても、これはヤメテ~。
継続して商品の調達に努めてまいりますが、調達不能な場合または入荷数の関係上
キャンセルをさせていただくこともございます。
ところで、1/16に注文した時は、33,570円だったのが、今は37,646円に値上がりしてる。まさか入荷されても値上がりした値段で販売、なんてことは無いよね。 1
- 1
つか、それはいくらなんでも酷すぎるだろ。
気がついたらだんだん増殖。¶
組合サーバのバックアップは、tarでデータだけを固めて、sshでDVD-RWドライブのついているリモートホストに転送しているのだが、なんか気がついたらスクリプトが増殖していた。前回バックアップを取得してから結構時間が経っているので、どうやるんだっけかなぁと確認してみたら、どうやら以前、一発実行スクリプトを用意していた。そんなことすら忘れていたのか。スクリプトを見ると組合鯖の運用の歴史を紐解ける(気がする)ので、洗い出してみた。
もともとのバックアップ用のスクリプトはこれ 1 。
#!/bin/bash
KEY=/home/user/.ssh/backup.key
TARGETDIR=$1
test -z $1 && echo -n "Target Dir (Full Path) : " && read TARGETDIR
BACKUP=$2
test -z $2 && echo -n "Backup File Name : " && read BACKUP
BACKUPFILE=${BACKUP}_$(date +%Y%m%d).tgz
USER="user"
BACKUPHOST="xxx.xxx.xxx.xxx"
BACKUPDIR="~${USER}/backup/$(date +%Y%m%d)"
tar zcf - $TARGETDIR | ssh -i $KEY ${USER}@${BACKUPHOST} "dd of=${BACKUPDIR}/${BACKUPFILE}"
sleep 5
わざわざsshで転送しているのだが、そもそもこのホストと転送先のホストの間は、外部ネットワークからアクセスできないセグメントにしてあるんだからncで良かったんじゃねぇのと今更思うが、これ書いた当時はncなんてダメだ、sshでやらなあかん、という無意味にセキュリティ重視していたのだなと。
このホスト、MySQLも動かしているのでデータ量は大したことがないので、バックアップは上記スクリプトで/var以下を手動で指定して取得していたのだが、そのうちmysqldumpを取得するようにした。 2
#!/bin/bash
host=`awk '/^host/ {print $3}' /etc/mysql/debian.cnf`
user=`awk '/^user/ {print $3}' /etc/mysql/debian.cnf`
password=`awk '/^password/ {print $3}' /etc/mysql/debian.cnf`
date=$(date +%Y%m%d)
dbs=$(mysqlshow -h $host -u $user --password=$password | awk -F'| ' '{print $2}' | egrep -v '^$')
tmpdir=/tmp/mysql
test -d $tmpdir || mkdir $tmpdir
for db in ${dbs[@]}
do
mysqldump -h $host -u $user --password=$password $db > ${tmpdir}/${db}_dumpfile_${date}.sql
done
exit 0
DebianのMySQLのパッケージは、/etc/mysql/debian.cnfに管理用のユーザ名、パスワードが設定してあるので、直接スクリプトに書くよりはマシだろうとそこから読み取り変数にしている。「 bashの配列なんか使うのをはじめて見た 」と 先月のrelaxon でも言われたのだが、まぁ、ここでも使っているんですな。
ある時点まで、これらのスクリプトを手動で実行していたのだが、だんだん面倒になって、スクリプト一発で取得できるように、と書いたのがこれ。 3
#!/bin/bash
KEY=/home/user/.ssh/backup.key
DATE=$(date +%Y%m%d)
ssh -i $KEY user@remotehost /usr/local/bin/checkdir.sh $DATE
/usr/local/sbin/mysqldump.sh
/usr/local/sbin/prebackup.sh stop
/usr/local/sbin/backup.sh /etc myhost_etc
/usr/local/sbin/backup.sh /home myhost_home
/usr/local/sbin/backup.sh /var myhost_var
/usr/local/sbin/backup.sh /tmp/mysql myhost_mysqldump
/usr/local/sbin/prebackup.sh start
echo "Backup executed at $(LANG=C date)" | mail -s "backup $DATE done." root
etc, home, var, mysqldumpをtarで固めてsshで転送しているのだが、他にもいくつか別のスクリプトを実行している。一つ目は、転送先のホストに指定のディレクトリがあるかをチェックするだけのスクリプト。 4
#!/bin/bash
if [ ! -d /home/user/backup/$1 ];
then
mkdir /home/user/backup/$1
else
echo -n
fi
二つ目は、tar実行前後にサービスを停止・起動するためのスクリプト。 5
#!/bin/bash
SERVICE="apache2 usermin webmin mysql samba nfs-kernel-server nfs-common portmap postfix"
case "$1" in
start)
SERVICE=`echo $SERVICE | gawk -f /usr/local/bin/revword.awk`
FLAG=start
;;
stop)
FLAG=stop
;;
*)
echo "Usage: $0 {start|stop}"
exit 1
;;
esac
for i in $SERVICE
do
/etc/init.d/${i} $FLAG
done
このなかで実行しているawkスクリプトは、$SERVICEに格納した文字列を逆順に並び替えるだけのワンライナー。 6
#!/usr/bin/gawk
{for (i=NF; i>0; i--) {printf "%s ", $i;} printf "\n" }
あとはDVDに自動追記するスクリプトを書けば良いのだろうが、growisofsコマンドの-Mオプションで追記できているように一見見える 7 のだが、マウントして確認するとなぜか最初に書き込んだファイルしか見えないので、まぁそれを解決できたらかなり楽になるんだが。とはいえ、メディアは自分で交換する必要はあるんだが。
なでなでとウンコハイの優先度。¶
こまめは朝起きた時と仕事から帰ってきた後は、毎日必ず撫で撫でしてぇ~とやってくる。荷物置いて、手洗い、うがい、着替えと撫で撫でするまで延々とストーキングする。一方、ウンコをした後は必ず逃げ回る。捕まえて前足後足と肛門を拭いてやるのでそれが嫌だからなのか、あるいは鬼ごっこしているつもりなのか、ひたすら捕まるまいと逃げる。
で、今日帰宅後、それがちょうど重なった。撫で撫でする前に着替えている最中にウンコをしたのだが、撫で撫での方がこまめにとっては優先度が高かったようだ。撫で撫でしてと来るので、撫で撫でしてやるフリをして捕まえて足と肛門を拭いてやった。騙してゴメンよ、こまちゃん。
CouchDBで部分更新できないものか。¶
view で絞ったデータのうち、必要箇所だけを更新できればよいのにと思ったのだが、現時点ではドキュメントをまるごと更新しないといけない。ドキュメントのうち見せるだけで更新させたくないデータでも、今の仕様ではCouchDBのクライアントにJSONのチェックを行い、更新が不要あるいは更新してはいけないデータが変更されていないかを確認する仕組みを入れないといけない。CouchDB自体でチェックして更新させたくないデータが変更されていないことをチェックできないものか。