Python Developers Festa 2012.07 でGitの話をしてきました。

V さんからGitの深いを話をしる、と頼まれたので、GitPythonの話をしてきました。資料はこちら。

http://www.slideshare.net/mkouhei/git-pyfes201207presen

Git自体の深い話は岩松さんや小川さんのようにはできないので困ったなあと思っていたところ、先日の”第8回CloudFoundry輪読会でlxcの話をしてきました。”のLXCの話があったので、ちょうど話す内容の元ネタは兼ねることができたので助かりました。

あとCouchDBの話をするべし、と yssk22 さんから頼まれていたので、CouchbaseのTシャツがめっちゃ余っとるから、次回のCouchDB JPの勉強会に参加してよ、と宣伝しておきました。

第8回CloudFoundry輪読会でlxcの話をしてきました。

yssk22 さんからlxcの話をしる、と頼まれたので、2009年12月に東京エリアDebian勉強会で行ったlxcの話を焼き直して発表してきました。資料はこちら。

http://www.slideshare.net/mkouhei/lxc-cf201207presen

40人中、lxcを聞いたことがある人は25-30人くらいいらっしゃいました。が、実際に使ってことのある人は2人、うち1人は私と同じ職場でかつ同じチームの人でした。orz

資料の最後で紹介している、lxcをpython-libvirt経由で操作するために、2週間ほど前から作り始めた Iori 「庵」 のコードの話をしたら、大幅に時間オーバーしてしまいました…。

https://github.com/mkouhei/iori

また、発表資料の中で紹介したlxc JPのメーリングリスト(Google group)はlxcのことを日本語で語らう場です。lxcについて話をしたい人はぜひ購読ください。

https://groups.google.com/forum/?hl=ja&fromgroups#!forum/lxc-jp

LXCをlibvirtd経由で起動させる。

Sidでlxcを使うには、lxcパッケージをインストールし、README.Debianにあるとおり/etc/fstabに

cgroup /sys/fs/cgroup cgroup defaults 0 0

と記述し、cgroupをマウントすれば使えます。一方、libvirtd経由で起動させる場合、

<domain type='lxc'>
  <name>vm1</name>
  <memory>100000</memory>
  <os>
    <type>exe</type>
    <init>/bin/sh</init>
  </os>
  <vcpu>1</vcpu>
  <clock offset='utc'/>
  <on_poweroff>destroy</on_poweroff>
  <on_reboot>restart</on_reboot>
  <on_crash>destroy</on_crash>
  <devices>
    <emulator>/usr/lib/libvirt/libvirt_lxc</emulator>
    <interface type='network'>
      <source network='default'/>
    </interface>
    <console type='pty' />
  </devices>
</domain>

のようなlibvirtの定義ファイルを用意してやります。libvirtグループのアカウントで下記を実行します。

$ virsh --connect lxc:/// define vm1.xml
$ virsh --connect lxc:/// start vm1

これで起動できる!と思ったら大間違い。下記のようなエラーを吐いてこけます。

2012-07-10 15:44:06.531+0000: 24033: error : lxcVmStart:1783 : internal error Unable to find 'memory' cgroups controller mount

このワークアラウンドは Debian Wiki に記述されており、/etc/default/grubに下記の設定を行い、update-grub2を実行しkernelを再起動してやればOKです。

GRUB_CMDLINE_LINUX="cgroup_enable=memory"

kernel 2.6.39-1でFixされている ようなのですが、実際には kernel 3.0.0-1でも同じ問題に遭遇します。

とりあえず、これで無事起動できるようになった筈です。実際に実行してみます。

$ virsh --connect lxc:/// start vm1
Domain vm1 started

$ virsh --connect lxc:/// list --all
Id    Name                           State
----------------------------------------------------
5511  vm1                            running

$ sudo virsh --connect lxc:/// console vm1
Connected to domain vm1
Escape character is ^]
#

無事起動できましたね。今回はshを起動しているだけなのでネットワークの設定は行う意味がありませんが、debootstrapで作成したDebianイメージはあらかじめブリッジの設定をしておかないと、

error: Failed to start domain vm1
error: Unable to add bridge virbr0 port veth0: No such device

のようなエラーを吐いてコンテナ自体を起動できないので注意。debootstrapで作成したDebianイメージもlibvirtで問題なく起動できるか否かは未確認。

追記

3.2.0をインストールしてみましたが、GRUBでのcgroup_enable=memoryのオプションはやはり必要でした。

PythonのMySQL用インタフェースを使ってみた。

TonicDNSのアカウントを発行するのに、いちいちSQLを実行していたのですが、SQL書き直して実行とか面倒なので主題のインタフェースを使ってみました。Debianパッケージではpython-mysqldbがそれです。

コードは Githubにあげているとおり ですが、実際には下記の部分だけ。

import MySQLdb as mdb
(snip)
con = mdb.connect('localhost', user, passwd, db)

with con:
    cur = con.cursor()
    cur.execute("SELECT * from users WHERE username = %s", username)
    if cur.rowcount:
        print('Already that useraccount exists')
    else:
        cur.execute(
            "INSERT INTO users VALUES (NULL, %s, %s, %s, %s, %s, 0, 0)",
                    (username, passmd5, fullname, email, comment))

使い方は リンク先 かパッケージに含まれている /usr/share/doc/python-mysqldb/MySQLdb.txt.gz を読めば分かります。(内容は同じです)

PowerDNS Authoritative Serverで再帰問い合わせを有効にする。

ローカルDNSでコンテンツサーバとして使用しているPowerDNS Authoritative Serverで諸事情により再帰問い合わせを行わせることにしました。PowerDNSの公式ドキュメントは充実しているのですが、PowerDNS recursor(pdns-recursor)を導入せずに再帰問い合わせさせる方法については記載が無かったのでメモしておきました。 1

環境。

  • Ubuntu 10.04

  • pdns-server 2.9.22

設定。

/etc/powerdns/pdns.conf の下記を設定します。

  • allow-recursion

    • 再帰問い合わせを許可するホスト(クライアント)のIPアドレスを指定します。複数指定はカンマ区切りで、ネットワークアドレスをprefix lengthで指定することもできます。が、ハマったのが0.0.0.0は指定できないということ。これを指定すると再帰問い合わせ自体が有効になりませんでした

  • recursive-cache-ttl

    • 再帰問い合わせのキャッシュ時間。デフォルトは10秒

  • recursor

    • 再帰問い合わせ先のDNSのIPアドレスを指定します

  • lazy-recursion

    • 上記で設定した再帰問い合わせを許可するためのフラグ。許可する場合はyesを指定

実際に設定すると下記のような感じ。

diff --git a/powerdns/pdns.conf b/powerdns/pdns.conf
index eb5e473..80a49a2 100644
--- a/powerdns/pdns.conf
+++ b/powerdns/pdns.conf
@@ -8,7 +8,7 @@ allow-axfr-ips=127.0.0.1
 #################################
 # allow-recursion      List of netmasks that are allowed to recurse
 #
-allow-recursion=127.0.0.1
+allow-recursion=10.0.0.0/8

 #################################
 # allow-recursion-override   Local data even about hosts that don't exist will
@@ -84,7 +84,7 @@ launch=gmysql
 #################################
 # lazy-recursion       Only recurse if question cannot be answered locally
 #
-lazy-recursion=no
+lazy-recursion=yes
@@ -189,12 +189,12 @@ module-dir=/usr/lib/powerdns
 #################################
 # recursive-cache-ttl  Seconds to store packets in the PacketCache
 #
-# recursive-cache-ttl=10
+recursive-cache-ttl=10

 #################################
 # recursor     If recursion is desired, IP address of a recursing nameserver
 #
-#recursor=
+recursor=10.0.1.1

 #################################
 # setgid       If set, change group id to this gid for more security

追記。

「再帰」がことごとく「再起」になっていた罠。変換ミスに気づいていないとは…。orz

footnote

1

設定する各パラメータについては説明がありますが、どれを設定するのか、という説明がないということです。