Ubuntu で multiarch を無効にする

Ubuntu 11.10 から multiarch がサポートされました。
Multiarch support は、一つの環境で複数のアーキテクチャのバイナリを作成できるようになり、 Cross Compiling 環境が楽に構築できるようになるというメリットがあります。 amd64 (x86_64) Ubuntu の場合、デフォルトで i386 が foreign architecture として登録されています。

でも、Ubuntu mirror をしていて、amd64 だけをミラーしている場合には、i386 arch が見つからないというエラーが出てしまう。このためだけに i386 をミラーするのは本末転倒なので、 multiarch を無効にする方法を調査してみた。

12.10 以降とそれ以前で方法が違う。

11.10 & 12.04

multiarch は /etc/dpkg/dpkg.cfg.d/multiarch で設定されている。

$ cat /etc/dpkg/dpkg.cfg.d/multiarch
foreign-architecture i386

foreign-architecture i386 の行を # でコメントアウトするか、別ファイル名に変更する。

$ sudo vi /etc/dpkg/dpkg.cfg.d/multiarch
#foreign-architecture i386
$ sudo mv /etc/dpkg/dpkg.cfg.d/multiarch /etc/dpkg/dpkg.cfg.d/multiarch.backup

12.10 以降

dpkg コマンドで設定するようになっている。

$ sudo dpkg --remove-architecture i386

確認方法

どの foreign architecture が有効になっているかは、以下のコマンドで確認できる。

i386 が有効になっている場合:

$ dpkg --print-foreign-architectures
i386

foreign architecture がない場合:

$ dpkg --print-foreign-architectures

参考資料

multiarch support については以下の資料が詳しい。

network namespace をいろいろ試してみる

(OpenStack ユーザ会でやっている Advent Calendar の一つです)

Quantum では IP アドレスが重複したネットワークを作成するために、 Linux network namespace というカーネルの機能を利用しています。

Linux network namepsace で基本的な使い方が分かる記事を書こうかなと思っていたのですが、書こうと思っていたのと同じことを、週末に @irix_jp さんが丁寧に説明してくれているので、それはやめて、適当に network namespace で遊んでみようと思います。
http://aikotobaha.blogspot.jp/2012/10/linux-network-namespace.html

  • Distribution によって動かなかったり動いたりする
  • とにかくたくさん namespace を作ってみる

-

数の面では問題なく使えそうな雰囲気です。どこかで止まったり重くなることを少し期待していたのですが。

前置き

IP アドレス重複したネットワークを扱うといっても、貸し出しをする VM 自体はネットワーク的に分離されているので、
問題になるのは DHCP とか Router などのネットワークサービスをどうやって提供するかになります。
実現方法としては、ネットワーク毎の DHCP サーバを VM で提供するとか、物理ネットワーク自体を分離してしまうといった方法もありますが、Quantum では Linux network namespace を使っています。物理ホストからのサービスプロセスを制御しやすいのと、軽いというのが主な理由のようです。

その一方でまだまだ枯れていないので、トラブルも絶えません。

DHCP 用の VM を作って、IP overlapping を提供した方がよい気がします。

Distribution によって動かなかったり動いたりする

RHEL6.3/CentOS6.3 では使えません。
Quantum を使う際には他にもはまり所満載なので、Linux bridge プラグインを使いましょう。カーネルは CONFIG_NET_NS は有効になっていますが、ip コマンドが古いです。また、ip コマンドが network namespace を bind mount するための /proc/self/ns/net がありません。

Fedora 17/18 にもトラップがある/あったようです。
systemd の設定によっては、ip command で network namespace は作成できるが、namespace 以外の人からは root でも見られない状況になってしまうようです。permission 000 というなかなか御目にかかれない現象が見られたとのこと。これに関しては @enakai01 さんが詳しいです。
https://bugzilla.redhat.com/show_bug.cgi?id=872689#c7


Ubuntu 12.04 では基本的に動作しますが、最後の最後に network namespace が削除できない現象が発生します。

ubuntu@ostack06:~$ ip netns
qrouter-f5de8d34-471c-42a7-b7d9-cb77c4d77449
qdhcp-921a62c0-adc8-40cc-b9c2-a301ad0c7251
qrouter-f90e321e-a4ec-41a9-b54a-87f7aef33440
qdhcp-e967c502-7492-4f2f-bbdc-36aa4f1c45c8
qrouter-962db190-2520-4d9a-baf7-40fe9f2dd673
qdhcp-087854ac-8526-4565-b543-146127397612
ubuntu@ostack06:~$ ls -l /var/run/netns/
total 0
---------- 1 root root 0 Dec 17 21:15 qdhcp-087854ac-8526-4565-b543-146127397612
-r-------- 1 root root 0 Dec 17 22:54 qdhcp-921a62c0-adc8-40cc-b9c2-a301ad0c7251
-r-------- 1 root root 0 Dec 17 21:55 qdhcp-e967c502-7492-4f2f-bbdc-36aa4f1c45c8
---------- 1 root root 0 Dec 17 21:15 qrouter-962db190-2520-4d9a-baf7-40fe9f2dd673
-r-------- 1 root root 0 Dec 17 22:54 qrouter-f5de8d34-471c-42a7-b7d9-cb77c4d77449
-r-------- 1 root root 0 Dec 17 21:55 qrouter-f90e321e-a4ec-41a9-b54a-87f7aef33440

上から二つ目の network namespace を消してみます。見事に失敗します。

ubuntu@ostack06:~$ sudo ip netns delete qdhcp-921a62c0-adc8-40cc-b9c2-a301ad0c7251
Cannot remove /var/run/netns/qdhcp-921a62c0-adc8-40cc-b9c2-a301ad0c7251: Device or resource busy
ubuntu@ostack06:~$ sudo ip netns delete qdhcp-921a62c0-adc8-40cc-b9c2-a301ad0c7251
Cannot remove /var/run/netns/qdhcp-921a62c0-adc8-40cc-b9c2-a301ad0c7251: Device or resource busy
ubuntu@ostack06:~$ sudo ip netns delete qdhcp-921a62c0-adc8-40cc-b9c2-a301ad0c7251 ifconfig -a
Cannot remove /var/run/netns/qdhcp-921a62c0-adc8-40cc-b9c2-a301ad0c7251: Device or resource busy

permission が ---------- になっています。devstack を繰り返していると、この前は 100個たまってしまいました。

ubuntu@ostack06:~$ ls -l /var/run/netns/
total 0
---------- 1 root root 0 Dec 17 21:15 qdhcp-087854ac-8526-4565-b543-146127397612
---------- 1 root root 0 Dec 17 22:54 qdhcp-921a62c0-adc8-40cc-b9c2-a301ad0c7251
-r-------- 1 root root 0 Dec 17 21:55 qdhcp-e967c502-7492-4f2f-bbdc-36aa4f1c45c8
---------- 1 root root 0 Dec 17 21:15 qrouter-962db190-2520-4d9a-baf7-40fe9f2dd673
-r-------- 1 root root 0 Dec 17 22:54 qrouter-f5de8d34-471c-42a7-b7d9-cb77c4d77449
-r-------- 1 root root 0 Dec 17 21:55 qrouter-f90e321e-a4ec-41a9-b54a-87f7aef33440

とにかくたくさん namespace を作ってみる

10000個 network namespace を作ってみました。
以下のスクリプトをとにかく回すだけ。

#!/bin/bash

i=1

for k in `seq 1 50`; do
  echo "$i..."
  time for j in `seq 1 200`; do
    name=$(printf "testns-%06d" $i)
    sudo ip netns add $name
    i=`expr $i + 1`
  done
done

こんな結果になりました。system 時間を見ても、namespace 数に比例して単調増加です。どうもカーネル内の処理はとにかく作っているっぽいですね。 1000個作ると、一つの作成に 10msec もかかるのですね・・・
マシン環境は Xeon X5550 2.67GHz, 48GB, QuadCore*2, HT enable です。

この後、10000個の network namespace を全部削除してから、次の実験のために、network namespace をいろいろいじっていたら、ip netns add xxxxx コマンドが返って来なくなりました・・・
namespace は作成されているので、 ip コマンドのバグの可能性が高そうです。仕方ないので、reboot しました。

netns + veth + OVS で 10000 ポート作ってみる

単にたくさん作ってみたかったので、やってみました。

network namespace を作って、veth の一方を network namespace に移動、 veth のもう一方を OVS のポートとして登録、という処理をひたすら繰り返してみました。この処理は Quantum の Open vSwitch を使っているプラグインでは通常行われる処理です (OVSInterfaceDriver の plug)。

これを 5000個くらいまで作ったところで時間切れです。

  • 最後の方になると、100個作るのに 1分半くらいかかるようになりました。
  • 最初の100ポート作成の平均でも実時間はかなり長いですね。 systime/usertimeが短いので、このあたりではあまり問題にならないようです。

でも、netns 単独のときと違って、system 時間は少し log 関数に似ていて、netns 以外の部分はあまり数に依存しないような作りになっているようです。

一方で、ユーザ空間処理の方が増えて来ているようです。ovs の登録処理も基本的に userland の処理ですね。


でも、今の ifconfig はインタフェースが 5000個以上あっても表示できるのですね。昔は 254 個だったような気がします。
でも ifconfig に 2分以上かかりました。(ovs-vsctl の出力は 5000ポート登録していても 0.3秒くらいで終わります)


ちなみに、このシェルスクリプトを回しただけです。
(1000個ずつしかできません)

#!/bin/bash

set -o xtrace

i=4001
inloop=100
outloop=10
base=`expr $i / 1000`

for k in `seq 1 $outloop`; do
  time for j in `seq 1 $inloop`; do
    echo "$i..."
    name=testns-$i
    ifa=veth-a${i}
    ifb=veth-b${i}
    sudo ip netns add $name
    sudo ip link add name $ifa type veth peer name $ifb
    sudo ip link set $ifb netns $name
    sudo ip netns exec $name ip link set $ifb up
    sudo ip netns exec $name ip addr add 172.${base}.${k}.${j}/24 dev $ifb
    sudo ip link set $ifa up
    sudo ovs-vsctl add-port br-int $ifa
    i=`expr $i + 1`
  done
done

namespace は network namespace だけじゃありません

namespace の制御はカーネルが提供しているので、操作はもちろん全部システムコール経由で行います。

Linux ではプロセスの fork やスレッドを作るときには、裏では clone(2) システムコールが呼ばれます。このシステムコールのマニュアルを見てみると、namespace 関連のオプションがたくさんあることが分かります。

http://linuxjm.sourceforge.jp/html/LDP_man-pages/man2/clone.2.html

  • CLONE_NEWNS : ファイルシステム空間の分離 (名前から見て最初に実装されたことが分かります)
  • CLONE_NEWNET : ネットワーク空間/スタックの分離
  • CLONE_NEWPID : プロセス ID 空間の分離
  • CLONE_NEWIPC : IPC 空間の分離
  • CLONE_NEWUTS : UTS 名前空間の分離 (僕もよく分かりません)

という訳で、OpenStack には直接関係ないことで遊んでみました。

Floating IP で Nova と Quantum の違いをみる

全然使っていなかった、このページですが、OpenStack ユーザ会で http://openstack.jp/adventcalendar-2012.html:アドベントカレンダー をやろうということになったので、新しく作るのも何なので、このページを使って書いてみます。

Folsom リリースから Quantum が正式リリースになりました。開発者の一人としてうれしく思います。

Nova には floating IP と security group というネットワーク系の機能があり、当然ながら、これらも Quantum の一部になって行きます。Folsom リリースでは開発する機能が盛り沢山だったせいか、
floating IP を含む L3 機能の実装は遅れに遅れて、Folsom RC1 (release candidate) の期間中にようやく実装できました。 security group にいたっては時間切れで Grizzly に見送りになってしまいました。

前置きが長くなってしまいましたが、Nova と Quantum で Floating IP と Security Gruop がどう違うかみたいと思います。

あんまりおもしろいことは書けないので、複数 NIC で floating IP を使う場合には、Nova の Floating IP は使えないので、Quantum の Floating IP を直接使いましょう、ということを実験してみたいと思います。

Nova の Floating IP

通常 VM を起動すると Private IP アドレス (fixed_ip) が割り当てられるので、外からアクセスできません。そこで、Public IP アドレスを割り当てて、外部からのアクセスがあった場合は DNAT を行って、VM まで辿りつきます。この Public IP アドレスが floating IP です。Private 側のアドレスは
VM を起動したら変わらないので fixed (固定) IP、外側のアドレスはどの VM に割り当てるかを決めたり、後で割り当て先の VM を変更できるので、floating (浮いた) IP ですね。 AWS では Elastic IP ですね。

Quantum になって、複数の VNIC を持った VM が起動しやすくなりました。複数 NIC を持った環境で Floating IP を使うとどうなるかを見てみます。

ネットワークを3つ作っておいて、とりあえず VM を3個起動しています。こんな感じの構成です。

環境は Folsom Update1 (2012.2.1) の Nova + Quantum です。Folsom Update1 (2012.2.1) で Nova から Quantum の floating IP を使う機能が入りました。

$ nova list
+--------------------------------------+------+--------+----------------------------------------------------+
| ID                                   | Name | Status | Networks                                           |
+--------------------------------------+------+--------+----------------------------------------------------+
| 859bbff7-6ba7-4421-9e1f-588379fa2038 | s1   | ACTIVE | net1=10.0.0.3                                      |
| 37cf07fe-5b24-4304-bb56-80b70347580e | s2   | ACTIVE | net2=172.16.1.3; net1=10.0.0.4                     |
| 140d872b-2f78-4c62-a528-85898284e446 | s3   | ACTIVE | net3=192.168.123.3; net2=172.16.1.4; net1=10.0.0.5 |
+--------------------------------------+------+--------+----------------------------------------------------+

Nova から操作してみましょう。

$ nova floating-ip-pool-list
+---------+
| name    |
+---------+
| ext_net |
+---------+
$ nova floating-ip-list
+--------------+-------------+----------+---------+
| Ip           | Instance Id | Fixed Ip | Pool    |
+--------------+-------------+----------+---------+
| 172.24.4.227 | None        | None     | ext_net |
| 172.24.4.228 | None        | None     | ext_net |
| 172.24.4.229 | None        | None     | ext_net |
+--------------+-------------+----------+---------+

nova コマンドを見ると、インスタンス名と floating IP しか指定できません。複数 NIC がある場合にはどうなってしまうのでしょうか。

$ nova help add-floating-ip
usage: nova add-floating-ip <server> <address>

Add a floating IP address to a server.

Positional arguments:
  <server>   Name or ID of server.
  <address>  IP Address.

やってみると 3つ目で失敗したようです。たしかに割り当てられていません。

$ nova add-floating-ip s1 172.24.4.227
$ nova add-floating-ip s2 172.24.4.228
$ nova add-floating-ip s3 172.24.4.229
ERROR: Error. Unable to associate floating ip (HTTP 400) (Request-ID: req-0a915c79-2fc4-4801-bfc9-1f30a9431707)
$ nova floating-ip-list
+--------------+--------------------------------------+----------+---------+
| Ip           | Instance Id                          | Fixed Ip | Pool    |
+--------------+--------------------------------------+----------+---------+
| 172.24.4.227 | 859bbff7-6ba7-4421-9e1f-588379fa2038 | 10.0.0.3 | ext_net |
| 172.24.4.228 | 37cf07fe-5b24-4304-bb56-80b70347580e | 10.0.0.4 | ext_net |
| 172.24.4.229 | None                                 | None     | ext_net |
+--------------+--------------------------------------+----------+---------+
$ quantum floatingip-list
+--------------------------------------+------------------+---------------------+--------------------------------------+
| id                                   | fixed_ip_address | floating_ip_address | port_id                              |
+--------------------------------------+------------------+---------------------+--------------------------------------+
| 114c1e52-e4b6-4622-b186-965781f430b0 |                  | 172.24.4.229        |                                      |
| 433c4582-e452-4abc-bc5d-359fc977f313 | 10.0.0.3         | 172.24.4.227        | e0d51e99-612d-4e35-a9a6-4e19443c44e0 |
| 46d910a4-a519-4785-b2f7-d02203a1f0bb | 10.0.0.4         | 172.24.4.228        | 559a1cae-7999-4274-85dc-ea77b13bac60 |
+--------------------------------------+------------------+---------------------+--------------------------------------+

Quantum のログを見るとこうなっています。

2012-12-11 21:25:08 5712 TRACE quantum.api.v2.resource ExternalGatewayForFloatingIPNotFound: 
External network d360185c-db6e-430c-bd38-e52554765bb7 is not reachable from subnet 
8da47637-6538-45f5-a753-0ee3d168fc3f.  Therefore, cannot associate Port 
616b1ca4-2353-472f-9351-b1a58bb9f2cb with a Floating IP.

External network d360185c-db6e-430c-bd38-e52554765bb7 から subnet 8da47637-6538-45f5-a753-0ee3d168fc3f には到達できないと叫んでいます。

subnet 8da47637-6538-45f5-a753-0ee3d168fc3f は net3 上の subnet なので、上の図を見ると、確かに外部ネットワークとはつながっていません。

$ quantum net-list
+--------------------------------------+---------+--------------------------------------+
| id                                   | name    | subnets                              |
+--------------------------------------+---------+--------------------------------------+
| 72fd56c6-24b5-4ed9-bb38-be547f8e507a | net3    | 8da47637-6538-45f5-a753-0ee3d168fc3f |
| 7619360b-d1ff-495e-8377-3b0742ee9329 | net1    | f9e5880e-1155-48a0-8f32-677a6c902eff |
| d360185c-db6e-430c-bd38-e52554765bb7 | ext_net | 736a4bb6-64db-410d-8332-2673b5514270 |
| e26c9324-d303-4355-a0ae-62e192733f5f | net2    | 751fe2bc-7796-436f-bf34-a37d445065ff |
+--------------------------------------+---------+--------------------------------------+

Floating IP を割り当てる NIC はどうも適当な順番で呼ばれているようです。 nova/api/openstack/compute/contrib/floating_ips.py を見ると、こうなっていて、明らかに適当です。
これまで Multi NIC をみんなどうやって使ってきたのでしょうか????

        fixed_ips = cached_nwinfo.fixed_ips()
        if not fixed_ips:
            msg = _('No fixed ips associated to instance')
            raise webob.exc.HTTPBadRequest(explanation=msg)

        # TODO(tr3buchet): this will associate the floating IP with the
        # first fixed_ip an instance has. This should be
        # changed to support specifying a particular fixed_ip if
        # multiple exist.
        if len(fixed_ips) > 1:
            msg = _('multiple fixed_ips exist, using the first: %s')
            LOG.warning(msg, fixed_ips[0]['address'])

        try:
            self.network_api.associate_floating_ip(context, instance,
                                  floating_address=address,
                                  fixed_address=fixed_ips[0]['address'])


という訳で、複数の NIC を持つ VM の場合、nova の add-floating-ip では使いものにならないことが分かりました。特に、Quantum で外部と接続するつもりのないネットワークに接続した VM を作る場合は危険すぎます。

後始末をしてから今度は Quantum で試してみましょう。さっきの後始末。きれいになくなりました。

$ nova floating-ip-list
+--------------+--------------------------------------+----------+---------+
| Ip           | Instance Id                          | Fixed Ip | Pool    |
+--------------+--------------------------------------+----------+---------+
| 172.24.4.227 | 859bbff7-6ba7-4421-9e1f-588379fa2038 | 10.0.0.3 | ext_net |
| 172.24.4.228 | 37cf07fe-5b24-4304-bb56-80b70347580e | 10.0.0.4 | ext_net |
| 172.24.4.229 | None                                 | None     | ext_net |
+--------------+--------------------------------------+----------+---------+
$ nova remove-floating-ip 37cf07fe-5b24-4304-bb56-80b70347580e 172.24.4.228
$ nova remove-floating-ip 859bbff7-6ba7-4421-9e1f-588379fa2038 172.24.4.227
$ nova floating-ip-delete 172.24.4.227
$ nova floating-ip-delete 172.24.4.228
$ nova floating-ip-delete 172.24.4.229
$ nova floating-ip-list

$ quantum floatingip-list

$  

Quantum でやってみる

floating IP の操作はこんな感じ。

まず、Floating IP pool を調べます。 --router:external というフラグがあるネットワークを調べるのですが、net-external-list コマンドを使うのが楽です。

$ quantum net-external-list -c id -c name
+--------------------------------------+---------+
| id                                   | name    |
+--------------------------------------+---------+
| d360185c-db6e-430c-bd38-e52554765bb7 | ext_net |
+--------------------------------------+---------+

floating IP の確保はこんな感じ

$ quantum floatingip-create
usage: quantum floatingip-create [-h] [-f {shell,table}] [-c COLUMN]
                                 [--variable VARIABLE] [--prefix PREFIX]
                                 [--request-format {json,xml}]
                                 [--tenant-id tenant-id] [--port-id PORT_ID]
                                 [--fixed-ip-address FIXED_IP_ADDRESS]
                                 floating_network_id ...
quantum floatingip-create: error: too few arguments
$ quantum floatingip-create ext_net
Created a new floatingip:
+---------------------+--------------------------------------+
| Field               | Value                                |
+---------------------+--------------------------------------+
| fixed_ip_address    |                                      |
| floating_ip_address | 172.24.4.227                         |
| floating_network_id | d360185c-db6e-430c-bd38-e52554765bb7 |
| id                  | bb96193e-6a10-4207-93fe-2a47efbcaaf1 |
| port_id             |                                      |
| router_id           |                                      |
| tenant_id           | 87b32cbf8f7041e69ab7f315059a30da     |
+---------------------+--------------------------------------+
$ quantum floatingip-list
+--------------------------------------+------------------+---------------------+---------+
| id                                   | fixed_ip_address | floating_ip_address | port_id |
+--------------------------------------+------------------+---------------------+---------+
| bb96193e-6a10-4207-93fe-2a47efbcaaf1 |                  | 172.24.4.227        |         |
+--------------------------------------+------------------+---------------------+---------+

とりあえず NIC が 3つある、さっき失敗した VM s3 でやってみます。まず VMインスタンス ID を調べて、NIC に対応する Quantum の port を調べます。

テクニックとしては port-list の後ろに -c オプションを付けると表示する項目が限定できます。また、'--' で区切った後に絞り込みを行う条件を指定できます。ここでは VM の instance ID は device_id に入っていますので、それで絞り込みます。

$ nova list
+--------------------------------------+------+--------+----------------------------------------------------+
| ID                                   | Name | Status | Networks                                           |
+--------------------------------------+------+--------+----------------------------------------------------+
| 859bbff7-6ba7-4421-9e1f-588379fa2038 | s1   | ACTIVE | net1=10.0.0.3                                      |
| 37cf07fe-5b24-4304-bb56-80b70347580e | s2   | ACTIVE | net2=172.16.1.3; net1=10.0.0.4                     |
| 140d872b-2f78-4c62-a528-85898284e446 | s3   | ACTIVE | net3=192.168.123.3; net2=172.16.1.4; net1=10.0.0.5 |
+--------------------------------------+------+--------+----------------------------------------------------+
$ quantum port-list -c id -c fixed_ips -- --device_id 140d872b-2f78-4c62-a528-85898284e446
+--------------------------------------+--------------------------------------------------------------------------------------+
| id                                   | fixed_ips                                                                            |
+--------------------------------------+--------------------------------------------------------------------------------------+
| 616b1ca4-2353-472f-9351-b1a58bb9f2cb | {"subnet_id": "8da47637-6538-45f5-a753-0ee3d168fc3f", "ip_address": "192.168.123.3"} |
| 65a6a9e3-59d9-4285-bd33-9dd2eb9caa5a | {"subnet_id": "751fe2bc-7796-436f-bf34-a37d445065ff", "ip_address": "172.16.1.4"}    |
| ee682e9f-11c4-4b02-b19b-9858b44f20a4 | {"subnet_id": "f9e5880e-1155-48a0-8f32-677a6c902eff", "ip_address": "10.0.0.5"}      |
+--------------------------------------+--------------------------------------------------------------------------------------+

どうやら、外向きのネットワークに接続された net1 に対応する 10.0.0.5 に対応する NIC は ee682e9f-11c4-4b02-b19b-9858b44f20a4 だと分かりました。

$ quantum floatingip-associate
usage: quantum floatingip-associate [-h] [--request-format {json,xml}]
                                    [--fixed-ip-address FIXED_IP_ADDRESS]
                                    floatingip-id port_id
quantum floatingip-associate: error: too few arguments
$ quantum floatingip-associate bb96193e-6a10-4207-93fe-2a47efbcaaf1 ee682e9f-11c4-4b02-b19b-9858b44f20a4
Associated floatingip bb96193e-6a10-4207-93fe-2a47efbcaaf1
$ quantum floatingip-list
+--------------------------------------+------------------+---------------------+--------------------------------------+
| id                                   | fixed_ip_address | floating_ip_address | port_id                              |
+--------------------------------------+------------------+---------------------+--------------------------------------+
| bb96193e-6a10-4207-93fe-2a47efbcaaf1 | 10.0.0.5         | 172.24.4.227        | ee682e9f-11c4-4b02-b19b-9858b44f20a4 |
+--------------------------------------+------------------+---------------------+--------------------------------------+

やっと割り当てができました。

では、ping を打ってみましょう。

$ ping 172.24.4.227
PING 172.24.4.227 (172.24.4.227) 56(84) bytes of data.
^C
--- 172.24.4.227 ping statistics ---
5 packets transmitted, 0 received, 100% packet loss, time 4002ms

すこし焦りました。
Nova の security group の設定を忘れていました。今度は大丈夫でした。

$ nova secgroup-add-rule default icmp -1 -1 0.0.0.0/0
+-------------+-----------+---------+-----------+--------------+
| IP Protocol | From Port | To Port | IP Range  | Source Group |
+-------------+-----------+---------+-----------+--------------+
| icmp        | -1        | -1      | 0.0.0.0/0 |              |
+-------------+-----------+---------+-----------+--------------+
$ ping 172.24.4.227
PING 172.24.4.227 (172.24.4.227) 56(84) bytes of data.
64 bytes from 172.24.4.227: icmp_req=1 ttl=63 time=1.61 ms
64 bytes from 172.24.4.227: icmp_req=2 ttl=63 time=1.39 ms
64 bytes from 172.24.4.227: icmp_req=3 ttl=63 time=1.43 ms
64 bytes from 172.24.4.227: icmp_req=4 ttl=63 time=1.19 ms
64 bytes from 172.24.4.227: icmp_req=5 ttl=63 time=1.35 ms
^C
--- 172.24.4.227 ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4005ms
rtt min/avg/max/mdev = 1.195/1.396/1.611/0.136 ms

という訳で長くなりましたが、Quantum の Floating IP の使い方を見てみました。

結論としては、複数 NIC で floating IP を使う場合には、Quantum の Floating IP を
直接使いましょう、ということです。

でも、UUID だらけで面倒ですね。

Horizon で Quantum floating IP を直接操作できるように実装中なので、ご期待下さい。

Security Group は時間切れなので、またの機会に。基本的には Amazon VPC Security Group 相当です。

Windows の自動再生機能をオフにする

Windows XP で DVD や CD-ROM をドライブに入れると、中身を調べて「自動再生」してくれるが、時間がかかってジャマなので、無効化する方法。

いつも調べても忘れてしまう。書いておかないと覚えないかも。

;=== CD-ROM,リムーバブルドライブの自動再生を無効化
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer]
"NoDriveTypeAutoRun"=dword:000000b5

音楽 CD の自動再生を一時的にオフにするには、CD を入れるときに Shift キーを押したままにしておくという方法が簡単。

LDP man-pages 2.58 to 2.60

LDP man-pages の新しいバージョンが出ていたので、JM の更新作業。

主な変更点をまとめておく。

  • v2.58
    • credentials.7 が新規追加。このページは Linux の PID, PPID, PGID, SID, UID, GID の概要について解説したもの。
    • いくつかのページへの VERSION セクション追加
  • v2.59
    • spell を American style に統一
    • man-pages.7 に spelling を American style に統一する旨が追記された。
  • v2.60
    • "e.g." や "i.e." の表記方法の統一。

LDP man-pages 2.55

最近、LDP man-pages のバージョンアップが激しい。今日も cron から version 2.55 が出ていると通知が来ていた。
JM の対応作業中。

主な変更点は以下のとおり。

  • path_resolution.2 が path_resolution.7 に移動。内容が path 検索の概要について記したものなので、セクション 7 に移動になった。
  • path_resolution.2 -> path_resolution.7 への変更に伴う、他のページの cross reference の修正。
  • glibc がラッパー関数を提供していないシステムコールについての注記の追加。

mod_encoding の導入

CentOS3 の httpd (apache) の WebDAV で日本語を扱えるようにするために mod_encoding を導入した。mod_encoding 関係は情報がきれいに整理されていないので、導入は少し面倒。

事前準備

http://webdav.todo.gr.jp/download/ から必要なファイルをダウンロードする。

  • mod_encoding 20021209.tar.gz (apache1.3用) : これがベースとなる。
  • mod_encoding for Apache2 20040616版 (apache2.0用の差し替えファイル)
$ tar xzf mod_encoding-20021209.tar.gz
$ cp mod_encoding.c.apache2.20040616 mod_encoding-20021209/mod_encoding.c

iconv_hook の導入

iconv の補完ライブラリである iconv_hook をインストールする。README.JP に書いてあるが、iconv_hook は iconv では不十分な変換機能を補完し、mod_encoding/mod_dav での日本語処理をより完全にするためのもの。

$ cd mod_encoding-20021209/lib/
$ ./configure
$ make
$ make install
$ ls /usr/local/lib
libiconv_hook.a  libiconv_hook.la  libiconv_hook.so  libiconv_hook.so.1  libiconv_hook.so.1.0.0
$ ls -l /usr/local/lib
total 476
-rw-r--r--    1 root     root       244722 May 20 04:39 libiconv_hook.a
-rwxr-xr-x    1 root     root          748 May 20 04:39 libiconv_hook.la
lrwxrwxrwx    1 root     root           22 May 20 04:39 libiconv_hook.so -> libiconv_hook.so.1.0.0
lrwxrwxrwx    1 root     root           22 May 20 04:39 libiconv_hook.so.1 -> libiconv_hook.so.1.0.0
-rwxr-xr-x    1 root     root       226749 May 20 04:39 libiconv_hook.so.1.0.0
$ ls -l /usr/local/include/
total 4
drwxr-xr-x    2 root     root         4096 May 20 04:39 iconv_hook
$ ls -l /usr/local/include/iconv_hook/
total 8
-rw-r--r--    1 root     root          903 May 20 04:39 iconv.h
-rw-r--r--    1 root     root         1483 May 20 04:39 iconv_hook.h

libiconv_hook のインストール時に以下のメッセージが表示される。

Libraries have been installed in:
/usr/local/lib

If you ever happen to want to link against installed libraries
in a given directory, LIBDIR, you must either use libtool, and
specify the full pathname of the library, or use the `-LLIBDIR'
flag during linking and do at least one of the following:
- add LIBDIR to the `LD_LIBRARY_PATH' environment variable
during execution
- add LIBDIR to the `LD_RUN_PATH' environment variable
during linking
- use the `-Wl,--rpath -Wl,LIBDIR' linker flag
- have your system administrator add LIBDIR to `/etc/ld.so.conf'

See any operating system documentation about shared libraries for
more information, such as the ld(1) and ld.so(8) manual pages.

/usr/local 以下にインストールされる。/usr/local/lib は CentOS ではデフォルトのライブラリ検索パスには入っていない。対処方法は上記のメッセージにもあるが、以下がある。今回は3番目の方法を採用した。

  • /etc/ld.so.conf を編集し、ldconfig を行う。(こうすると自動的に /usr/local/lib のライブラリが検索されるようになる。システム全体に影響がある。)
  • LD_LIBRARY_PATH および LD_RUN_PATH を指定する。
  • linker オプションで '-Wl,--rpath -Wl,LIBDIR' を指定する。

mod_encoding の作成

配布されている mod_encoding.c では、関数が未定義だと implicit declaration of function の警告がでるので、mod_encoding.c の #include が並んでいるところに #include を追加しておく。


コンパイル開始。LD_LIBRARY_PATH を指定していない状況でも libiconv_hook が見つかるように linker option (-Wl,--rpath -Wl,/usr/local/lib) を指定するのがポイント。mod_encoding.so 作成後に LD_LIBRARY_PATH がなくても libiconv_hook.so.1 が見つかることを確認しておく。

$ ./configure --enable-debug --with-apxs=/usr/sbin/apxs \
 --with-iconv-hook=/usr/local/include/iconv_hook
$ make
$ gcc -shared -o mod_encoding.so mod_encoding.o -Wc,-Wall \
 -Wl,--rpath -Wl,/usr/local/lib -L/usr/local/lib -liconv_hook
$ 
$ LD_LIBRARY_PATH="" ldd mod_encoding.so
        libiconv_hook.so.1 => /usr/local/lib/libiconv_hook.so.1 (0x00935000)
        libc.so.6 => /lib/tls/libc.so.6 (0x004c6000)
        /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x00fc1000)
$ sudo cp mod_encoding.so /usr/lib/httpd/modules