[ubuntu-jp:2867] Re: Ubuntu Server 10.04 の起動順

Mitsuru Ogino ogino @ verama.net
2010年 8月 3日 (火) 16:45:40 BST


荻野です。帰宅したので記憶で書いています。

Fumihito YOSHIDA said the following on 10/08/03 21:52:
> ちょっと現象を見切れていないので(時間が取れてないともいう。
> ごめんなさい)、すでに試された内容になってしまうかもしれませんが、

すみません、誤解を招く表現でした。

まず IPv6 全部ではなく、以下に書いた固定 IPv6 アドレスが問題のようで、
メッセージ的には ::1 への bind は成功していたと思います。Unbound の v6
設定を無くすと問題も消えたので、紛らわしい書き方をしてしまいました。

>> /etc/network/interfaces に、
>>
>>   iface eth0 inet6 static
>>     address 2001:xx:xx:200::18
> 
> これは、この前に auto eth0 と IPv4 な固定アドレスは書いてあると
> 思ってよいでしょうか。

はい、その通りです。


> assign に失敗した旨のメッセージには v6 アドレスが含まれていて、
> 確実に v6 アドレスの bind にだけコケている(逆にいうと、「起動失敗」
> 状態ではv4アドレスに bind されていることが lsof -i などで見える?)
> ことが確定しているでしょうか?
> # v4もv6も賦活されてない、という話だとちょっとわかり易くなります。

メッセージからはそう見えましたが、unbound は失敗した後終了してしまうので
lsof で確認することはできません。

> で、/etc/rc*.d/以下にあるスクリプトのキックは /etc/init/rc.conf が
> 実行しているのですが、こいつは runlevel イベント(rc-sysinit)でキック
> されるので、起動条件は
> 「emits filesystem(=mountall)  + net-device-up IFACE=lo」
> です。ループバックしかあげないjobは見当たらないので、これは実質
> networking の後になると思います。
> 
> で、一方で/etc/init/networking は
> 「emits local-filesystems(=mountall) + stopped udevtrigger」
> が起動トリガになっているので、ほぼ起動直後、デバイス認識が終わった
> 時点で走るので、ちょっと先走りというのは見た目なさそうな気がします。
> ということで、実は lo だけ上がった状態で起動している説というのを
> ちょっと気にしています。

なるほど。lo だけ上がった状態で並行してスタートを切っているとすると符合
するように思います。止められるかどうか確認して、unbound の設定で ::1 だ
けのときと、::1 とグローバル IPv6 の両方にしてテストして、::1 だけのとき
なら OK なら、IPv6 全部ではないという一歩切り分けができるように思います。

思いつきですが、ひょっとして固定の IPv6 アドレスでも Duplicate Address
Detection の 1秒は保留されるとか、なにか時間がかかる要素があるのかもしれ
ません。

しかし、たとえば DHCP 管理で MAC アドレスに対して固定的割り当て、とか IP
アドレス確定までちょっと時間がかかるようなものに対して、アプリ側がそのア
ドレスを指定して bind しようとするケースでは、同じような現象が起きている
のでしょうか。


> 思い切り無理やり修正するのであれば、以下のような作戦になると思います。
>   a) /etc/init/rc-sysinit.conf の「start on filesystem and net-device-up IFACE=lo」を
>   「start on filesystem and net-device-up IFACE=!lo」にする
>   # ただし、/etc/rc*.d/ にある全てのスクリプトが eth0 などに依存するようになる。
>   b) /etc/rc*.d/ に /etc/init.d/networking を含める
>   c) sleep10 作戦のまま

b というのは /etc/rc*.d/ 以下へのシンボリックリンクを作るのだと思うので
すが /etc/init/networking の方はなにか処置をするのでしょうか。

c' としては ifconfig や ip addr show などの結果をみてアドレスが付いたの
を確認するまで短い sleep を繰り返す、とかが考えられます。

/etc/network/interfaces を切り分けようかと思いましたが man をみると
mapping などというものがあって、固定 IP アドレスを特定するのは汎用的には
無理そうですね。


> 根本解決するには、もう少し現象を追い込んで、「本当にv6だけLISTENできて
> いないのか、そうだとしたら犯人は何か」を確定しないと厳しそうです。
> 仮説と憶測としては、
>   A) ifup -a が v6 だけ bind してくれない何かがある
>   B) 実は lo だけが上がっていると、 v6 が上がっていない場合とそっくりな挙動になる
>   C) /etc/hosts に v4 な hostname / FQDN だけが書いてあるせいで binding が変。
>   init まわりはあまり関係ない。起動後だと resolver が機能するので上手くいく。
> あたりが考えられます。

A) sleep 10 作戦が成功したことをかんがえると無理があるような。
B) IPv6 でも lo は OK のようなので、私の書き方が悪かったせいです。実際に
lo は上がっており ::1 への bind は問題ない気がする(要試験)、eth0 の
IPv6 アドレスの割り当て?確定?に手間取っている可能性が高い。
C) 設定はすべて IP address をそのまま書いているのでちょっとなさそう。


大変参考になりました。なにかテストができれば試してみます。DNS なのでそう
は止められないのが難点ですが…

-- 
荻野 充 (おぎの みつる) ... 「萩(はぎ)」にあらず
Key fingerprint = 7F26 5414 1805 F31B 1617  10B7 C117 07AE 1691 9BD1



ubuntu-jp メーリングリストの案内