先日気になった、スリープからの復帰後に、EvolutionがIPv6(以下v6)でなくIPv4(以下v4)を使ってしまう件だが、やはり、v6とv4の初期化時間の違いによるようだ。
今日、後述の処理の有効性を調べるため、一旦ネットを全部無効にして、手でv6とv4を順番に有効にしようとしてみたら、v6の初期化が全然終わらず、設定間違いや何かのバグで停まっているのかと思った。しかし、実は処理は続いていて、忘れた頃に有効(使用可能)になった。と言っても何十分も掛かる訳ではなく10秒くらいだが、体感としては随分遅い。
処理時間が違う理由を考えてみると、僕のデスクトップPCでは、v4はローカルな固定IPアドレスなので、初期化時間はほぼ0だが、v6はプロバイダの設備やルータと相談しながらアドレスを振っているからだろうと思われる。更に、先日使い始めたプライバシー拡張も遅くなる一因なのかも知れない。元々v6は複雑で重いのが、更に遅くなるのだろうと想像する。
という訳で、初期化の時間差はどうにもならないけれど、それでも意地でもEvolutionにv6を使わせたくなってしまい、次のような処理を考えた。
- EthernetのNW-IFとして、v6専用とv4専用の2つを作る。
- どちらも物理IFは同じ(ルータに繋がる)なので、片方は仮想的なものにする必要があり、v4をaliasにした。
- aliasの名前(suffix)は数字でなくてもいいようだったので、分かりやすくしようと":v4"にした(例: "eth0:v4")。駄目なら数字にすればいい。
- どちらも物理IFは同じ(ルータに繋がる)なので、片方は仮想的なものにする必要があり、v4をaliasにした。
- スリープになる時は、まずv4専用NW-IFを無効にし、そのあとでv6専用NW-IFを無効にする。
- Linuxのマニュアルを読むと、本来のNW-IF(ここではv6専用NW-IF)を無効に(ifdown)すると、aliasも無効になると書いてあるが、先にaliasを無効に(削除)しておかないと内部に残骸が残ってしまうようで、次(復帰時)にaliasが作れなくなってしまったので、このようにしている。
- スリープからの復帰時には、まずv6専用NW-IFを有効にし、そのあとでv4専用NW-IFを有効にする(aliasを作る)。
- 念のため、v6の初期化のあとで0.5秒待ってから、v4専用NW-IFを有効にするようにした。
- OSの起動時も同様である。
こうすることで、スリープからの復帰時に、(スリープ中にメールチェック間隔が過ぎたために)ネットが使えるようになるのを手ぐすね引いて待っているEvolutionは、v6専用NW-IFが使えるようになった時点でそっち経由で通信し出すと考えた。
なお、Evolutionがネットの状態をチェックしないようにしたら、スリープからの復帰後はエラーなどを出さずに全然メールチェックしなくなってしまったので、PCをスリープさせる場合でも意図してv6を使わせ続けるには こういう処理が必要そうだ。
本来は、スリープからの復帰後にタイムアウトで通信を中断し、エラーを出すとかリトライすべきなのだが、Evolutionはなぜか だんまりを決め込んでしまうようだ。あるいは、タイムアウトが長過ぎる(数時間?)のだろうか?
実装してみたら、(例によって随分試行錯誤したが)うまくいった。明日、(寝ている間の)長時間スリープ後の結果を見るまでは確定しないが(→ 12/4の朝に問題なかった。: 12/4 9:49)、今はめでたく、通常時は自分のサーバ関連のv4の使用ポート数が0になった。
とは言え、冷静に考えれば、そこまでv6を使う意味はミリもないのだが、気分とか趣味(v6が好きだからでなく、「きちんとしたい」みたいな、あるいは、「僕の目の黒いうちは、Evolutionなんかには好き勝手はさせねえぜ」w)的な理由で頑張ってしまった。すなわち、冷静じゃないってことだw
コメントを書く / Write a comment