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

Fumihito YOSHIDA hito @ ubuntu.com
2010年 8月 3日 (火) 13:52:36 BST


ちょっと現象を見切れていないので(時間が取れてないともいう。
ごめんなさい)、すでに試された内容になってしまうかもしれませんが、

> /etc/network/interfaces に、
>
>  iface eth0 inet6 static
>    address 2001:xx:xx:200::18

これは、この前に auto eth0 と IPv4 な固定アドレスは書いてあると
思ってよいでしょうか。

>
> と書いているのですが、どうやら起動時に IPv4 アドレスは有効になっている
> が、IPv6 アドレスはまだ有効でないというタイミングで起動されるため、
> Listen に失敗しているようです。

これがちょっと解せません。interfaceの賦活を行っている実体は
/etc/init/network-interface.conf にある upstart job ですが、
こいつは実質的に net-device-added タイミング(udev的に eth* を
認識した瞬間)に ifup しているだけで、あまり難しいことはしていません。

もし「v4が有効でv6がまだ有効になっていない」タイミングがあると
すると、ここだけしかないような気がしつつ、しかし ifupdown がそうした
遅延を引き起こすような話はちょっと考えにくい気がします。

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

で、/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 だけ上がった状態で起動している説というのを
ちょっと気にしています。

思い切り無理やり修正するのであれば、以下のような作戦になると思います。
 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 作戦のまま

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



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